1.简介
LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。
LED点阵屏有以下三点特征:
- LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。
- LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同。
- LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示。
LED点阵需要由以下两个模块完成:
LED点阵屏幕/1-1.png)
LED点阵屏幕/1-2.png)
2.74HC595
74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。我们在这里用它来实现一次性为至多8位数据(一列数据)赋值。
具体原理图如下:
LED点阵屏幕/1-3.png)
数据每次传一位给SER,放入移位寄存器中,SERCLK(简写为SCK)置1代表放行数据到下一位,置0表示禁止数据到下一位(有点像数据是一个球,SCK是一个横着的挡板,向外来回抽动一下,小球就掉到下一个格子里了)。RCLK(简写为RCK)也是同理,在移位寄存器放满后可以通过置1再置0的方式将数据映射到右边输出。
由此可以得出74HC595的写数据代码:
1 | void _74HC595_WriteByte(unsigned char Byte) |
初始化代码也很简单,将两个”挡板“”关闭“(置零)即可:
1 | void MatrixLED_Init() |
在实际代码编写中,不存在SCK,RCK等关键字,因此需要找到对应寄存器的实际地址,并在代码开头定义:
1 | sbit RCK=P3^5; |
需要注意,不能写成“sbit RCK=P3_5;”这种形式,因为P3_5实际上是一个寄存器的名称,而此时等号右边需要一个具体的值。使用“sbit RCK=P3^5;”可以理解为对P3的实际地址进行异或操作(异或0表示保持不变,异或1表示取反)。
例如P3=0xB0=0b 1011 0000,P3^5=0xB5=ob 1011 0101。
而对整个寄存器定义则需要使用#define,例如:#define MATRIX_LED_PORT P0
3.LED点阵显示静态图像
LED点阵也分共阳极和共阴极两种:
- 共阳极即每个LED管的阳极共接在行线上,列输入的信号为1不亮,为0亮。
- ③ 共阴极和共阳极模块相反,每个LED管的阴极共接在行线上,列输入的信号为0不亮,为1亮。
共阳极LED点阵的各引脚的实际关系图如下图所示,其中DPa~DPh为74HC595传过来的8位数据。P00~P07则为位选。
LED点阵屏幕/3-1.png)
对于实现静态显示的功能,需要用到如下代码:
1 | void MatrixLED_ShowColumn(unsigned char Column,Data) |
首先,将一列的Data数据写入LED点阵,然后设置P0从P07开始从左往右显示。同时,由于使用的是共阳极,P0有效的方法是置0,因此需要对每次的位选结果取反,然后输入给MATRIX_LED_PORT控制位选,即:
1 | void MatrixLED_ShowColumn(unsigned char Column,Data) |
与数码管原理一致:为了防止频繁段选清零导致整体亮度变暗,在段选后清零前应当加入一段延时,1ms即可。这样,流程就变成了:
位选→段选→延时→段选清零→位选→段选→延时→段选清零→位选→段选→延时→段选清零→…
从而实现消影。
4.LED点阵显示动态图像
动态图像有平移变换和实时变化两种,但核心原理都一致。通过把每一列的高低电平数据存到数组中,再设立一个偏移变量offset,即可实现效果。
总体流程为:
8列(一帧画面)为一组,将一帧快速扫描一段时间,然后offset+1(平移变化)/offset+8(实时变化)显示下一帧画面,同时将扫描计时归零。
需要注意的是,offset的取值范围应该为[0,sizeof(array)-8],数组大小-8是为了动画平滑过渡,如不-8则在动画的最后一个循环会产生寻址越界。
具体代码如下,本代码实现了坤坤打篮球的实时动画:
1 | void main () |
5.字模提取与坤坤动画
字模可以用专门的字模提取软件来生成,避免了繁杂的计算,
如果是需要生成文字,推荐使用PCtoLCD2020这款软件。
如果是自己绘制图像,推荐使用字模提取这款软件。
如果是转换现有图片,推荐使用Image2Lcd这款软件。
下面给出坤坤打篮球的字模:
1 | unsigned char code IKUN[]={ |