第一篇文章,就写点简单的代码,供大家参考吧!
以下是用4094(4000CMOS系列IC,串行移位寄存器,和74HC595类似)驱动数码管的驱动程序
放在定时器中断里面
#define c0 1 //本人用2803驱动很多个4094,这是为2803服务,不容易出错
#define c1 0
#define cnum4094 4 //一共有4个4094
void dispplay(void) interrupt 1
{
unsigned char i,j; //for循环用的变量
TH0=disptimeh; //定时器处理
TL0=disptimel;
++dispadd; //位选扫描用
if(dispadd>7)
dispadd=0;
i=0x80;
temp[3]= i>>dispadd;
temp[0]=; //7段数码管代码放在这,一共8x3个数码管
temp[1]=; //等号后面内容根据实际情况定
temp[2]=;
oe4094c=c0; //移位输出
str4094c=c0;
clk4094c=c0;
for(i=0;i<cnum4094;i++)
{
for (j=0;j<8;j++)
{ temp=temp>>1;
do4094c=CY;
nod(); //nod()是延时子程序,是为了降低时钟频率,让4094移位不出错
clk4094c=c1;
nod();
clk4094c=c0;
}
}
str4094c=c1;
nod();
str4094c=c0;
nod();
oe4094c=c1;
}
以上能驱动24个7节数码管,如果要显示更多可以加4094,扫描速度>40就不会闪烁。根据以往经验,显示100个数码管也不成问题。这种方式在游戏机开发上有广泛应用。
如果觉得移位太多,速度不够可以用几条数据线,同时移位几组4094即可。即1条CLK,1条STR,几条SDO,en不用也可。这样用来驱动点阵也绰绰有余。