1. 基本介绍
LED点阵
LED点阵是由发光二极管排列组成的显示器件,通常应用较多的是88点阵,然后通过多个88点阵组成不同分辨率的LED点阵显示屏,如4个88组成的1616点阵
8*8点阵由64个LED组成,每个LED是放置在行线和列线的交叉点上,因此通过横纵坐标就可以实现对任何一个LED亮和灭。
74CH595芯片
74HC595芯片是串转并移位锁存器,即芯片通过一个IO口串行接收8bit的数据,然后将8bit数据转为并行输出的移位缓存器。
单片机可以只通过1个IO口串行的输出8bit数据,通过这个芯片转为并行的8bit数据,就可以控制led点阵中的8条阳极,此时在加一个相同的芯片控制阴极,就可以实现两个IO口控制8*8的led点阵,节省了IO口的数量。
- QA~QH:并行数据输出,即将串行输入的数据通过8个引脚并行输出出去
- SER:串行数据输入,芯片通过这个引脚逐位接收数据
- SCK:移位寄存器时钟输入,芯片在每个SCK上升沿时,通过SER读取1bit数据
- RCK:存储寄存器时钟输入,芯片在每个RCK上升沿时,将SER读取到的数据通过QA-QH并行端口输出
- Q‘H:串行数据输出,在芯片中存满8位数据后,再输入数据时,就会将原来存的8bit数据通过该引脚逐位挤出去
- ^G:输出有效
- ^SCLR:低电平复位引脚
2. 电路原理图
16*16LED点阵
74HC595模块
由原理图可知,74HC595的C和D是直接与LED点阵的阴极连接在一起的,因此只要将LED点阵的阳极(J28、J34)与74HC595的A和B输出(J27、J32)连接在一起即可。同时将J24与单片机上的引脚连接。
3. 软件编程
单独显示
sbit SER = p1^0;
sbit SCK = p1^1;
sbit RCK = p1^2;
/*传入4个595模块的值*/
void SendLedData(u8 Neg9to16, u8 Neg1to8, u8 Pos9to16, u8 Pos1to8)
{
int i = 0;
SCK = 0;
RCK = 0;
/*第一个595芯片工作,数据为Negative 9-16引脚*/
for(i = 0; i < 8; i++)
{
SER = Neg9to16 >> 7; //数据最高位
SCK = 0;
SCK = 1; //制造上升沿读取数据
Neg9to16 = Neg9to16 << 1;//移到下一位
}
for(i = 0; i < 8; i++)
{
SER = Neg1to8>> 7;
SCK = 0;
SCK = 1;
Neg1to8 = Neg1to8<< 1;
}
/*第三个595芯片工作,数据为Positive9-16引脚*/
for(i = 0; i < 8; i++)
{
SER = Pos9to16>> 7;
SCK = 0;
SCK = 1;
Pos9to16= Pos9to16<< 1;
}
for(i = 0; i < 8; i++)
{
SER = Pos1to8>> 7;
SCK = 0;
SCK = 1;
Pos1to8= Pos1to8<< 1;
}
RCK = 0; //制造上升沿,595芯片并行输出
RCK = 1;
}
void main()
{
SendLedData(0x00, 0x00, 0x00, 0x01); //只亮第一行
SendLedData(0xff, 0xfe, 0xff, 0xff); //只亮第一列
}
字模显示
/*“姜”字横向取模*/
u8 colData[] = {
0x10,0x04,0x20,0x02,0xFE,0x3F,0x80,0x00,0xFC,0x1F,0x80,0x00,0xFF,0x7F,0x40,0x00,
0x20,0x00,0xFF,0x7F,0x10,0x04,0x08,0x04,0x38,0x02,0xC0,0x01,0x30,0x0E,0x0E,0x10,
};
u8 rowData[32] =
{
0x01,0x00, 0x02,0x00, 0x04,0x00, 0x08,0x00,
0x10,0x00, 0x20,0x00, 0x40,0x00, 0x80,0x00,
0x00,0x01, 0x00,0x02, 0x00,0x04, 0x00,0x08,
0x00,0x10, 0x00,0x20, 0x00,0x40, 0x00,0x80,
};
sbit SER = P3^4;
sbit RCK = P3^5;
sbit SCK = P3^6;
void sendLedData(u8 n1, u8 n0, u8 p1, u8 p0)
{
int i;
RCK = 0;
SCK = 0;
for(i = 0; i < 8; i++)
{
SER = n1>>7;
SCK = 0;
SCK = 1;
n1= n1 << 1;
}
for(i = 0; i < 8; i++)
{
SER = n0>>7;
SCK = 0;
SCK = 1;
n0= n0 << 1;
}
for(i = 0; i < 8; i++)
{
SER = p1>>7;
SCK = 0;
SCK = 1;
p1= p1 << 1;
}
for(i = 0; i < 8; i++)
{
SER =p0>>7;
SCK = 0;
SCK = 1;
p0= p0 << 1;
}
RCK = 0;
RCK = 1;
}
void displayLedData(u8 row[], u8 col[])
{
int i;
//按行显示,共显示16行
for(i = 0; i < 16; i++)
{
sendLedData(~colData[2*i+1], ~colData[2*i], rowData[2*i+1], rowData[2*i]);
}
}
void main(void)
{
displayLedData(rowData, colData);
}