LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等
LED点阵屏分类
- 按颜色:单色、双色、全彩
- 按像素:88、1616等(大规模的LED点阵通常由很多个小点阵拼接而成)
LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已
LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同
LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示
A1-A8接到74HC595模块
74HC595工作原理:
sfr(special function register):特殊功能寄存器声明 例:sfr P0 = 0x80;
声明P0口寄存器,物理地址为0x80
sbit(special bit):特殊位声明 例:sbit P0_1 = 0x81;
或 sbit P0_1 = P0^1;
声明P0寄存器的第1位
可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”、“|=”、“^=”的方法进行位操作
sbit RCK = P3^5; // 将P3的第五位命名为RCLK,RCLK重命名了,改为RCK,操作RCK是等效于操作P3_5
sbit SCK = P3^6; // SRCLK
sbit SER = P3^4;
void _74HC595_WriteByte(unsigned char Byte){
unsigned char i;
for(i = 0;i < 8;i++){
SER = Byte & (0x80 >> i); // 取最/次/...高位,此时位没有对齐,非0即为1
SCK = 1; // 给高电平,上升沿,将SER移进移位寄存器
SCK = 0; // 恢复
}
RCK = 1; // 给高电平,上升沿,将移位寄存器中的值放入锁存器
RCK = 0; // 恢复
}
void MatrixLED_ShowColumn(unsigned char column, Data){
_74HC595_WriteByte(Data);
/*
switch(column){
case 0: P0 = ~0x80;break;
case 1: P0 = ~0x40;break;
case 2: P0 = ~0x20;break;
case 3: P0 = ~0x10;break;
case 4: P0 = ~0x08;break;
case 5: P0 = ~0x04;break;
case 6: P0 = ~0x02;break;
case 7: P0 = ~0x01;break;
}
*/
P0 = ~(0x80 >> column); // 选择列
}
void main(){
SCK = 0; // 赋初始值
RCK = 0;
MatrixLED_ShowColumn(0, 0xaa); // 第0列,1010 1010即第0246行
while(1){}
}
注意要把左边的黄色跳帽跳到左边2个插针
LED点阵屏动画:
unsigned char animation[] = { // 使用字模提取软件获取
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,
0x15,0x15,0x08,0x00,0x7E,0x01,0x02,0x00,
0x7E,0x01,0x02,0x00,0x0E,0x11,0x11,0x0E,
0x00,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void main(){
unsigned char i,Offset=0,Count=0;
MatrixLED_Init();
while(1)
{
for(i=0;i<8;i++) //循环8次,显示8列数据
{
MatrixLED_ShowColumn(i,animation[i+Offset]);
}
Count++; //计次延时
if(Count>10)
{
Count=0;
Offset++;
if(Offset>40)
{
Offset=0;
}
}
}
}
注意,unsigned char animation[] = {}
此时是放在RAM中,但是RAM空间较小,当animation
数组包含很多数据时,RAM可能会导致空间不够,所以需要放在空间更大的Flash中unsigned char code animation[] = {}
但是一旦放入Flash,animation
就无法更改内容了