公告:

如何解决数码管动态显示鬼影现象

作者:智凡单片机 / 时间:7个月前 (03/22) / 分类:51单片机 / 阅读:878 / 评论:0

//用switch选择语句实现数码管动态显示

134557247.jpg 如何解决数码管动态显示鬼影现象 51单片机

#include <reg51.H>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
unsigned char code LedChar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
unsigned char code LedBuff[]={  
 //数码管显示缓冲区,初值0xFF确保启动时都不亮
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
void main()
{
unsigned char i=0;
unsigned int count =0;
unsigned int sec=0;
ENLED=0;
ADDR3=1;
TMOD=0x01;
TL0=0x67;
TH0=0xFC;
TR0=1;
while(1)
{
if(TF0==1)
{
 
TF0=0;
 
TH0=0xFC;
 
TL0=0x67;
 
count++; 
 
  
 
 
  
 //一次计数表示1ms
if(count>=1000) 
 
  
 
  
{
count =0;
sec++;
LedBuff[0]=LedChar[sec];
LedBuff[1]=LedChar[sec/10];
LedBuff[2]=LedChar[sec/100];
LedBuff[3]=LedChar[sec/1000];
LedBuff[4]=LedChar[sec/10000];
LedBuff[5]=LedChar[sec/100000];
switch(i)
{
case 0: ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LedBuff[0];break;
case 1: ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LedBuff[1];break;
case 2: ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=LedBuff[2];break;
case 3: ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[3];break;
case 4: ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LedBuff[4];break;
case 5: ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=LedBuff[5];break;
default:break;
}
}
}
}
}


这个程序放在单片机上面跑起来会出现鬼影现象,也就是不该亮的数码管发出了微弱的亮度,虽然短暂,但足够人肉眼察觉,那么该如何解决呢??
之所以数码管动态显示的时候会出现鬼影,是因为数码管在进行位变化和段变化的时候出现了短暂性停顿,因为短暂,所以亮度很小,但是人的肉眼还是可以察觉,即为鬼影。
解决方案一:关闭段
在switch(i)选择语句之前加上P0=0xFF,这样就可以把所有的段选都关闭,在ADDR系列赋值完后再对P0进行赋值.
解决方案二:关闭位
在switch(i)选择语句之前加上ENLED=1,然后在每一个case中ADDR赋值完后加上ENLED=0,在进行break操作就行.

没有评论,留下你的印记,证明你来过。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。