数码管有抖动,不该亮的亮了.我用了中断
#include
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 LedBuff[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char Led_[]={
0x7E,0xBD,0xDB,0xE7,0xDB,0xBD,0x7E
};
unsigned int cnt = 0;
unsigned char flagls = 1;
unsigned char x = 0;
long sec1 = 10;
long sec2 = 0;
void main()
{
static long sec1 = 10;
static long sec2 = 0;
EA = 1;
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 =1;
while(1)
{
if(flagls == 1)
{
flagls = 0;
LedBuff[0] = Ledchar[sec1%10];
LedBuff[1] = Ledchar[sec1/10%10];
sec1--;
P0 = Led_[x];
x++;
if(x > 6)
{
x = 0;
}
if(sec1 < 0)
{
sec2++;
if(sec2 <10)
{
LedBuff[0] = Ledchar[sec2%10];
LedBuff[1] = 0xBF;
}
if(sec2>=10 && sec2<=20)
{
LedBuff[0] = Ledchar[sec2%10];
LedBuff[1] = Ledchar[sec2/10%10];
LedBuff[2] = 0xBF;
}
}
}
}
}
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0;
TH0 = 0xFC;
TL0 = 0x67;
cnt++;
if(cnt >= 1000)
{
cnt = 0;
flagls = 1;
}
P0 = 0xFF;
switch(i)
{
case 0:ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[i];i++;break;
case 1:ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[i];i++;break;
case 2:ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[i];i++;break;
case 3:ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;P0=Led_[x],i=0;break;
}
}
数码管消抖。最终的结果为:双向流水灯,一秒切换一个。同时,数码管从10倒计时到-20