//*===============================
//接线要求:P0口分时复用输出,P2.6,P2.7做74ls573片选
//入口参数:0000--9999范围内的二进制或十进制数
//出口参数:无
//函数功能:数码管实现小于9999数的十进制显
//by Oliver 21/03,21:59
//==================================
#include <AT89X52.H>
#define uchar unsigned char
sbit WEI="P2"^7;
sbit DUAN="P2"^6;
sbit LED="P1"^4;
uchar wei[]={0xfe,0xfd,0xfb,0xf7};
uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=222;b>0;b--)
for(a=12;a>0;a--);
}
//--------------6ms延时
void undo(void)
{
WEI=1;
P0=0xff;
WEI=0;
}//使位选失效
void wei_cs(uchar a)
{
P0=wei[a];//=====关键之处---------------------------------------------------消隐------
WEI=1;
WEI=0;
}
//-------------------位选---------
void duan_cs(uchar a)
{
P0=duan[a];
DUAN=1;
DUAN=0;
}
//-------------------段选---------
void show(int DATA)
{
uchar qian,bai,shi,ge;
uchar duan_flag=0;
if(DATA>9999)
{
LED=0;
P0=0xfe;
}//判断是否超出显示范围
else
{
qian=DATA/1000;
bai=DATA%1000/100;
shi=DATA%100/10;
ge=DATA%10;
//-------------各位分离
if(qian!=0)
{
duan_cs(qian);
wei_cs(duan_flag++);
}
delay();
if((bai|qian)!=0)
{
duan_cs(bai);
wei_cs(duan_flag++);
}
delay();
if((shi|bai|qian)!=0)
{
duan_cs(shi);
wei_cs(duan_flag++);
}
delay();
if(1)
{
duan_cs(ge);
wei_cs(duan_flag);
}
}
}
void main(void)
{
while(1)
show(1545);
}
消隐的研究:隐红的出现:1 ,段码改变时,位码未变,在位码变化之前,会在前一个位码处产生残影;
2 ,位码改变时,如先使P2^7有效,则段码在位码写入之前会在新的位码处产
生残影。
消除方法:1, 段码改变之前将位码全部置成无效,此时间间隔仍能满足视觉暂留的要求;
2, 位码改变时,先将下一个位码写入P0口,再使P2^7有效,则可消除此种残
影。
另外,如P0口时序要求更为严格,为保证数据安全性,可将连接图中的OC端统一接一控制引脚,使两片573同时输出使能,即可更好消除残影。
文章评论(0条评论)
登录后参与讨论