写了个数码管读秒的程序,想法是只显示有效数字部分,一秒一秒的往上加,有效数字前的0全部隐去,可是烧完程序后数码管虽然只显示出了有效数字,但同时该有效数字还向前移了一位隐隐约约的也显示出来了,本人初学者,实在是分析不出原因,请各位大侠指点一下吧,谢谢了
#include <reg51.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
code uint8 num[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
uint8 a[6];
uint16 sec;
void refresh()
{
sta
tic uint8 i = 0;
switch(i)
{
case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; if(sec>=1) P0 = num[a[i]]; else P0 = 0xFF; i++; break;
case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; if(sec/10>=1) P0 = num[a[i]]; else P0 = 0xFF; i++; break;
case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; if(sec/100>=1) P0 = num[a[i]]; else P0 = 0xFF; i++; break;
case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; if(sec/1000>=1) P0 = num[a[i]]; else P0 = 0xFF; i++; break;
case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; if(sec/10000>=1) P0 = num[a[i]]; else P0 = 0xFF; i++; break;
case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; if(sec/100000>=1) P0 = num[a[i]]; else P0 = 0xFF; i = 0; break;
default: break;
}
}
void timer0_init(void)
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
}
void main()
{
uint16 counter;
ENLED = 0;
ADDR3 = 1;
timer0_init();
while(1)
{
if(TF0 == 1)
{
TF0 = 0;
TH0 = 0xFC;
TL0 = 0x67;
counter++;
refresh();
}
if(counter == 1000)
{
counter = 0;
sec++;
a[0] = sec%10;
a[1] = sec/10%10;
a[2] = sec/100%10;
a[3] = sec/1000%10;
a[4] = sec/10000%10;
a[5] = sec/100000%10;
}
}
}
-
-
一周热门 更多>