用单片机驱动LED数码管有很多方法,按显示方式分,有静态显示和 动态(扫描)显示,按译码方式可分硬件译码和软件译码之分。 静态显示就是显示驱动电路具有输出锁存功能,单片机将所要显示的
数据,显示数据稳定,占用很少的CPU时间。动态显示需要CPU时刻 对显示器件进行数据刷新,显示数据有闪烁感,占用的CPU时间多。
这两种显示方式各有利弊;静态显示虽然数据稳定,占用很少的CPU
时间,但每个显示单元都需要单独的显示驱动电路,使用的硬件较多;
动态显示虽然有闪烁感,占用的CPU时间多,但使用的硬件少,能节
省线路板空间。
硬件译码就是显示的段码完全由硬件完成,CPU只要送出标准的BCD
码即可,硬件接线有一定标准。软件译码是用软件来完成硬件的功能,
硬件简单,接线灵活,显示段码完全由软件来处理,是目前常用的显
示驱动方式。
比较常用的显示驱动芯片有: 74LS164 , CD4094+ULN2003(2803) ,
74HC595+ULN2003(2803) , TPIC6B595,AMT9095B, AMT9595等许多。
另外,市场上还有一些专用的LED扫描驱动显示模块如MAX7219等,
功能很强,价格稍高一些。下面是一个用74LS164驱动显示的例子
和一个用4094扫描驱动显示的例子:
上例图中加了一个PNP型的三极管来控制数码管的电源,是因为164农业科技网络书屋没有数据锁存端,
数据在传送过程中,对输出端来说是透明的,这样,数据在传送过程中,数码管上有
闪动现象,驱动的位数越多,闪动现象越明显。为了消除这种现象,在数据传送过程
人类登月50周年
中,关闭三极管使数码管没电不显示,数据传送完后立刻使三极管导通,这样就实现
锁存功能。这种办法可驱动十几个164显示而没有闪动现象。
这个例子是用4094做位选,用89C2051的P1口线做段驱动来扫描驱动9位数码管的显示。 由于4094只有8个输出口线,其中第九位是用CPU口线直接进行位选的。9个LED的所有
相同位置的段口线都接到一起,然后接到单片机的一个口线上,供八段,使用8条CPU
口线。其软件的工作过程是这样的:要在LED上显示1--9位数,首先将1的段码送到P1
口线上,然后向4094送位选数据01,使4094的Q1口线输出高电平,选中第一位数码管,
使阳极得电,在第一位上就显示出1,重复上述过程,一直到第九位,然后不断重复
这一过程,就实现了扫描显示。
#include<at89x52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
/*
sbit K1 = P3^4;
sbit K2 = P3^5;
sbit K3 = P2^4;
sbit K4 = P2^5;
*/
sbit STR = P2^0;//定义CD4094各端口;
sbit DATA = P2^1;
sbit CLK = P2^2;
//code unsigned char C51BOX2[3] _at_ 0x43;
void Out_4094(uchar data1);//CD4094写数据子函数祥林嫂之死;
void Delay(uint a); //延时子函数;
//主程序开始;
void main()
{
uchar i; //无限循环;
while(1)
{
for(i=0;i<255;i++) //让CD4094端口的LED不断从0-255显示;
{
Delay(10000); //延时;
Out_4094(i); //调用显示子函数;
Delay(10000); //延时;
}
}
//while(1);
}
void Out_4094(uchar data1) //写总账CD4094子函数;
{
uchar i; //定义子函数;
STR="0"; //保持然来的状态不变;
for(i=0;i<8;i++) //写八位数据进CD4094;
{
if(data1&0x01) //判断并发串行数据;
{
DATA="1"; //发高电平;
}
else
{
DATA="0"; //发低电平工程塑料应用;
}
CLK="0"; //形成上升延脉冲;
_nop_();
_nop_(); //延时;
_nop_();
CLK=1;
data1>>=1; //数据移位,送下一位数据;
}
STR="1"; //数据送完;更新显示;
}
void Delay(uint a) //药物分析杂志延时子函数;
{
uint b;
for(b=0;b<a;b++);
}