首先:我使用的是普中的单片机,用到了74HC595芯片(这是一个串行输入,并/串 行输出的移位寄存器芯片(就是用来扩展IO口的))
第一步:先写预处理模块
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
//因为采用的595芯片,所以用来显示的位和段选码都要自己写,我这个是用来显示“为中国加油”这几个汉字的
//led矩阵的连接方式为共阴
//这个是位选
u8 smgwei[]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x00,
0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x00,
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x00,
0x01,0x02,0x04,0x08,0x00,0x20,0x40,0x80,
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
};
//这个是段选
u8 smgduan[]=
{
0x02,0x85,0x7E,0x05,0x54,0xA4,0xFC,0x00,
0x00,0x1C,0x14,0xFF,0xFF,0x14,0x1C,0x00,
0xFF,0x81,0xD5,0xFD,0xD5,0xA1,0xFF,0x00,
0x24,0x5F,0x84,0xFC,0x00,0x3C,0x24,0x3C,
0x8A,0x54,0x20,0xF8,0xA8,0xFE,0xA8,0xF8,
};
/*这三个是595芯片里面的管脚
SRCLK和RCLK1是用来移位的(都是上升沿有效),SER是数据寄存器
*/
***it SRCLK=P3^6;
***it RCLK1=P3^5;
***it SER=P3^4;
u8 k;
第二步:是写驱动595芯片的模块程序
void delay(u8 z)//用来延时的
{
while(z--);
}
//因为我用的led矩阵是8*8的,所以我这里采用的是两个595芯片连接
//如果是16*16的,就可以采用四个595芯片连接
void HC595SendByte(u8 dit1,u8 dit2)
{
u8 a;
for(a=0;a<8;a++)
{
SER=dit1>>7;//因为是移位芯片,所以要先取最高位移进去
dit1<<=1;//将次高位变为最高位
SRCLK=0; //移位,(上升沿有效) 下同
_nop_();
SRCLK=1;
}
for(a=0;a<8;a++)
{
SER=dit2>>7;
dit2<<=1;
SRCLK=0;
_nop_();
SRCLK=1;
}
RCLK1=0;//将数据输出给led矩阵(上升沿有效)
_nop_();
RCLK1=1;
}
第三步:用来实现汉字闪动显示的模块
void MOV(u16 j)//传过得的参数用来控制显示的快慢
{
u8 i;
while(j--)//这里采用while循环是因为要延时;若不用,就会导致显示内容闪的很快
{
for(i=0;i<8;i++)
{
//因为用的是一维数组,使用在数组中取值输入到595芯片时,加了个K
HC595SendByte(~smgwei[i+8*k],smgduan[i+8*k]);//位码取反是因为led矩阵采用是共阴接法,写的时候写了反的
delay(10);
}
}
delay(200000);
if(k==4)//当k等于4的时候,说明数组的内容已经显示完了,
{
k=0;
delay(10000);
}
else
k++;
}
最后一步:写主函数
void main()
{
while(1)
{
MOV(500);
}
}