單片機數(shù)碼管顯示-消影問題
看郭天祥的單片機書中數(shù)碼管部分,使用 P0=0xff 的方法可以消除段選數(shù)據(jù)對位選的干擾,另外使用我下面的方法可以達到同樣的效果。但即便這樣數(shù)碼管仍有影子,這種狀況是,當(dāng)前數(shù)碼管有下一個數(shù)碼管的影子,或者當(dāng)前數(shù)碼管有前一個數(shù)碼管的影子。
分析一下產(chǎn)生原因,當(dāng)我們點亮一個數(shù)碼管后,總要先將段選或者位選改為下一個數(shù)碼管的值,而不能同時改變。當(dāng)先改變段選時,那么當(dāng)前數(shù)碼管就會有短暫的時間顯示下一個數(shù)碼管的數(shù)字。當(dāng)先改變位選時,下一個數(shù)碼管就會有短暫的時間顯示當(dāng)前數(shù)碼管的數(shù)字。
那么解決方法是,先將段選置0送入鎖存器,改變位選的值為下一個數(shù)碼管,最后再改變段選值。同理另一種方法是,先將位選賦值 0xff 即關(guān)閉所有數(shù)碼管,改變段選值,最后改變位選值。
另外一種勉強可以的方法是,增加延時時間,這樣正常數(shù)字顯示時間就相對影子數(shù)字的短暫時間變長,看起來影子就變得暗了,但延時太長導(dǎo)致數(shù)碼管閃爍,所以這種方法不建議,郭天祥書中的示例程序使用這種方法。
只貼出前2種方法的代碼。
#include
#include
sbit we=P2^7;
sbit du=P2^6;
unsigned char code table[] = {
0x3f , 0x06 , 0x5b , 0x4f,
0x66 , 0x6d , 0x7d , 0x07,
0x7f , 0x6f , 0x77 , 0x7c,
0x39 , 0x5e , 0x79 , 0x71,
0x00};
void show();
void delayms(unsigned time);
unsigned char num[6]={0,0,14,13,0,12};
unsigned char count=0;
unsigned char nums=0;
unsigned char numm=0;
void main()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TR0=1;
show();
}
void t0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
count++;
if(count%20==0)
{
count=0;
nums++;
if(nums==60)
{
nums=0;
numm++;
num[2]=numm%10;
num[3]=numm/10;
}
num[0]=nums%10;
num[1]=nums/10;
}
}
void show()
{
unsigned char i;
while(1)
for(i=0;i<6;i++)
{
P0=0;
du=1;
du=0;
P0=~(0x20>>i);
we=1;
we=0;
P0=table[num[i]];
du=1;
du=0;
delayms(1);
}
}
void delayms(unsigned time)
{
unsigned i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--)
;
}
第二種
void show()
{
unsigned char i;
while(1)
for(i=0;i<6;i++)
{
P0=0xff;
we=1;
we=0;
P0=table[num[i]];
du=1;
du=0;
P0=~(0x20>>i);
we=1;
we=0;
delayms(1);
}
}