LED点阵屏
LED点阵屏和数码管工作都是是靠二极管发光,但工作原理与矩阵键盘有些类似,在后面我会贴出电路图
LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏、银行窗口屏、叫号屏以及停车系统等等。
点阵屏电路图
从图中可以看到,点阵屏的电路与矩阵键盘类似,都是通过正极负极电路交叉来实现IO口应用率的提升。而想要让点阵屏形成特定的图案,这就需要用到数码管组的动态扫描技术,例如,想要将左上角的灯珠点亮,只需将 9 号口的电压拉高,将 13 号口拉低,其余ROW端口拉低,COL端口拉高,
这样只有左上角的灯所在电路形成了通路,达到了点亮他的目的。
74HC595芯片
74HC595芯片是一种串入并出的芯片,在电子显示屏制作当中有广泛的应用。74HC595是8位串行输入/输出或者并行输出移位寄存器。
芯片使用手册
串入并出
串入并出指的是这个芯片在接受串行信后,输出时将其转化为并行信号。例如一个字节的数据有八位,八位的编号为0—7,当串行输入时,信号依次将0—7位上的二进制值传输进去,经过芯片后输出时,0—7位上的值从八个IO口同时输出,以此达到节省单片机O口的目的。
使用方法
74HC595芯片的引脚说明和使用方法如下图所示
中间的电路图表示了两个595芯片的级联,可以将其简单地理解为,两个芯片中各存在一个可储存八位数据的锁存器,当级联时,这两个锁存器合并成了一个更大的,十六位的锁存器。
电路中下方的为第一级,上方的为第二级,当从IO口传输数据时,假设为 0xff 0xee,那么,0xff 将被储存在第一级,0xee 将被储存到第二级。两个芯片的输出口分别对应了点阵屏的行和列。
编程
点亮一个点
点亮一个点或者一行、一列,只需要写一个简单的程序将两个74CH595芯片中的锁存器赋值即可,代码如下,
另外,S_CLK, R_CLK 分别代表的是595芯片的11和12脚。如果对他的功能并不明白可以参考上面的图片。
#include <reg52.h>
sbit DIO = P3^4;
sbit S_CLK = P3^5;
sbit R_CLK = P3^6;
void main()
{
unsigned char i,dat;
dat = 0xfe;
for(i=0;i<8;i++)
{
S_CLK = 0;
R_CLK = 0;
if(dat & 0x01)
DIO = 1;
else
DIO = 0;
S_CLK = 1;
dat >>= 1;
}
dat = 0x80;
for(i=0;i<8;i++)
{
S_CLK = 0;
R_CLK = 0;
if(dat & 0x01)
DIO = 1;
else
DIO = 0;
S_CLK = 1;
dat >>= 1;
}
R_CLK = 1;
while(1);
}
显示汉字
显示汉字与显示点并无太大的差别,只是用到了动态扫描技术,但是8*8点阵有64个点,我们不可能自己一个个去找对应的值,所以需要用到一个小应用来帮我们取模。
PCtoLCD 2002
具体名字已然不清晰,这是魔改后的软件,不知道是不是本名,进入软件后先进行如图设置,然后在左边的8*8模板上用鼠标点击,左键点亮,右键取消,之后会在下方出现对应的列的值,之后再编程逐列扫描,即可实现显示汉字
编写代码
#include <reg52.h>
#include <intrins.h>
sbit DIO = P3^4;
sbit S_CLK = P3^5;
sbit R_CLK = P3^6;
unsigned char code tabel_1[8] = {0xE0,0xEE,0x01,0x6D,0x01,0x6D,0x01,0xEF};
unsigned char code tabel_2[8] = {0xE7,0xE7,0xF7,0xF7,0x00,0xF3,0xFB,0x81};
void delay(unsigned int z)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void sendbyte(unsigned char dat)
{
unsigned char i;
S_CLK = 0;
R_CLK = 0;
for(i=0;i<8;i++)
{
S_CLK = 0;
R_CLK = 0;
if(dat & 0x01)
DIO = 1;
else
DIO = 0;
S_CLK = 1;
dat >>= 1;
S_CLK = 0;
}
}
void main()
{
unsigned char j,row;
unsigned int k;
row = 0x80;
while(1)
{
for(k=0;k<700;k++)
{
for(j=0;j<8;j++)
{
sendbyte(tabel_1[j]);
sendbyte(row);
row = _cror_(row,1);
R_CLK = 1;
R_CLK = 0;
}
}
for(k=0;k<700;k++)
{
for(j=0;j<8;j++)
{
sendbyte(tabel_2[j]);
sendbyte(row);
row = _cror_(row,1);
R_CLK = 1;
R_CLK = 0;
}
}
}
}
总结
点阵屏的学士实在是太困难了,花了一天时间,把三个小时的课程断断续续听完,实际原理并不复杂,可惜的是我没有良好的解题思路,只能跟着老是讲的走。