1.设计思路:
要实现行列不同位置亮灯,需要使用动态显示的方法,也要结合扫描的方法。
在第一行亮灯一段时间以后灭掉,点亮第二行一段时间以后灭掉,点亮第三行一
段时间以后灭掉,如此点亮,直到八行全部点亮一次,在第一行点亮到最后一行
灭掉的总时间不能超过人肉眼可识别的时间,即 24 毫秒。在每一行点亮的时候,
给列一个新的数据,此时对应列的数据就可以体现在这行上要点亮的灯上。这样
就和动态数码管的显示一样,只不过数码管的 LED 灯是段值。这里使用 LED 点
阵显示数字,也是多个 LED 同时点亮。
要想在点阵上显示数字等字符,首先要获取在 LED 点阵上显示数字字符所需
的数据,即一个数字字符在 LED 点阵上显示,对应的每行每列都会有一些灯点亮
或者熄灭,这样就会构成一组数据,也就是数字字符的显示数据,我们只要将这
些数据通过 74HC595 发送到点阵对应的行或列就能显示数字字符。
2.数字0的编程数据:
u8 gled_row [ 8 ]={ 0x00 , 0x7C , 0x82 , 0x82 , 0x82 , 0x7C , 0x00 , 0x00 }; //LED 点阵
显示数字 0 的行数据
这些数据其实就是上述描绘的数字 0 从左到右依次每列对应的行数据。
至于其它数字或字符及简单图形的显示取模方法与上述类似。
既然是动态扫描,就需要不断的扫描每列,因此可以把 LED 点阵的列控制也
用数组存储起来,为后面循环调用提供方便。根据数字 0 取模的数据特点是从左
至右每列对应的行数据,因此扫描时也应该从左至右的顺序,如下:
u8 gled_col [ 8 ]={ 0x7f , 0xbf , 0xdf , 0xef , 0xf7 , 0xfb , 0xfd , 0xfe }; //LED 点阵
显示数字 0 的列数据
3.原始代码:
#include"reg52.h" typedef unsigned char u8; typedef unsigned int u16; #define LEDDZ_COR_PORT P0 sbit SRCLK=P3^6; sbit rCLK=P3^5; sbit SER=P3^4; //LED 点阵显示 数字 0 的行数据 u8 gled_row[8]={0x00,0x7C,0x82,0x82, 0x82,0x7C,0x00,0x00}; //LED 点阵显示 数字 0 的列数据 u8 gled_col[8]={0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe}; void delay_10us(u16 ten_us) { while(ten_us--); } void hc595_write_data(u8 dat) { u8 i=0; for(i=0;i<8;i++) { SER=dat>>7; dat<<=1; SRCLK=0; delay_10us(1); SRCLK=1; delay_10us(1); } rCLK=0; delay_10us(1); rCLK=1; } void main() { u8 i=0; while(1) { for(i=0;i<8;i++) { //传送列选数据 LEDDZ_COR_PORT=gled_col[i]; //传送行选数据 hc595_write_data(gled_row[i]); //延时一段时间,等待显示稳定 delay_10us(100); //消影 hc595_write_data(0x00); } } }
4.LED 点阵(显示数字)实验现象:
使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口),
把编译后产生的.hex 文件烧入到芯片内,实现现象如下:8*8LED 点阵显示数字
0。