原创 消隐的研究

2010-6-12 19:15 1883 5 5 分类: MCU/ 嵌入式

70edd8bd-93d3-4325-b749-b2a0678d1a63.jpg


//*===============================
//接线要求: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条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条