一、LED点阵屏的介绍
生活中的点阵屏应用广泛,例如候车站的大屏,公交站的汽车报站器等。LED点阵屏按颜色可以分为单色屏(只有红色的LED灯)、双色屏(有红色和绿色的LED灯)、全彩屏(有红、绿、蓝三种LED灯);按像素可以分为8*8等(因为单片机寄存器一般为8位,所以一般都为8的倍数)。
二、点阵屏的显示原理
1、LED点阵屏的结构类似如数码管,如图二,将第一列分出来,可以列出像数码管一样的8字形,如下图。
2、LED点阵屏也有两种连接方式,共阴极或共阳极连接。下图中第一个单色点阵屏结构图就是共阳极连接,要想将某一行点亮就将那行的D口置1,其他D口置0;要想某一列点亮就将那一列的P0口置0,其他P0口置1;当然,想要点亮一个LED灯需要这两口的配合。
3、要想在LED点阵屏上显示图案,这时我们需要和数码管一样进行不断地扫描,然后利用人眼视觉的暂留和灯的余晖来显示出我们的图案。当然我们可以一帧一帧的显示动画,从而完成我们所想完成的动画。
二、74HC595的介绍
74HC595可以完成串行输入并行输出,下面来看一下他的电路原理图和使用原理。
三、C51的sfr、sbit
我们可以对特殊的寄存器进行声明,这样我们使用时直接将P0赋值就行了。如下SFR;
除了为特殊寄存器赋值,有些特殊位也可以进行声明,下面的P0^1表示P0的第一位。我们可以将8个寄存器地址也看成八位,这样我们只能对其中一位进行寻址,就像一个寄存器中有8个比特位,我们只要知道第一位的地址就能知道其他位的地址,和数组类似。
四、编写程序代码
1、为了方便对74HC595的P35/36等口操作,我们将这些口定义为对应的SER等口,方便操作。下面代码就写好了,这是根据UP主的单片机来写的,但因为我用的是A2,所以我的74HC595没有LED灯。
在写74HC595的代码内容时也可以这样操作依次移位,但用for循环更加方便。
这里需要注意一下,在进行完移位时,即移位寄存器8位满位,要给输出缓存区赋值时记得将RCK口置1,这样数据才能复制过去,置1后再置0。
因为没有LED灯测试,那么我们直接来写点阵屏。
我们先写关于74HC595的函数,下面的代码有两种方式,一种是一次次的读取每一位,这种直接写好以后进行粘贴复制。还有一种写法是进行移位操作,用for循环然后每次进行移位。就像上面所给代码一样。
关于74HC595的操作写好,下面我们就要写代码控制点阵屏的亮灭,像写数码管一样,进行不断地扫描,我们写一个函数,column为列,date为我们所想电量行的。我们将点阵屏从左到右规定为第0列到第7列,然后将P0口进行取反操作,这样控制列的就写好了;还有一种是用if语句来写,再将P0口依次赋值。
在电量数码管时会发现数据会串味,点阵屏由于操作方式等相同,所以也会发生数据的串味,这时需要用到Delay函数。
解决了这个问题,我们就可以用点阵屏点量一个笑脸,代码如下,只需将要点亮的位进行设计,这样就得到了一个笑脸。当然,上电后需将SCK和RCK置0。
2、接下来我们来编写第二个程序的代码
用点阵屏来显示动画Hello!
首先在上节的基础上将每个点阵屏的代码模块化。模块化如下,记得在主函数中引头文件。
接下来我们需要用到数组,将点阵屏上的Hello! 用软件将代码显示出来。
我们可以先将代码测试一下是不是我们想要的结果,经测试后,点阵屏上显示的是He,说明没错。
为了更加方便,我们接下来用for循环来写,这样就实现了在点阵屏上显示8列数据。
但为了使图像移动起来,我们可以定义一个变量Offset,使得每次8位显示完后再刷新每一个8位,使第1列的数据显示到第0列,这样就达到了流动的效果。
但是为了使点阵屏显示的图像显示久一点,我们使用变量Count(也可以使用计数器)。
但是这样后我们发现显示完我们想要的动画后还会显示一些其他乱七八糟的画面,这时由于Offset一直在加加,从而导致超出数组的范围,之后显示乱码。在给定Offset范围后,我们发现一上机就显示Hello,然后感叹号还没显示完后又重新开始显示,这时我们需要在数组中加清0的数据,然后再修改一下Offset的范围。注释掉的不用管,那是别的代码,懒得删。
上面我们就完成了显示动画的操作,如果要写逐帧的动画我们可以每八位显示一次,一次间隔很短的时间,这样就完成逐帧显示动画了。接下来我们来写哭笑脸。
同样先是用辅助软件显示出我们所需图像的代码,显示完一次Offset加8,以达到更新点阵屏显示,Offset的范围也需要改变,后面的代码我们用不上,所以大于16就行了。这样用点阵屏显示动画就完成了。