求教一个数码管程序

2019-07-15 13:49发布

写了个数码管读秒的程序,想法是只显示有效数字部分,一秒一秒的往上加,有效数字前的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()
{
        static 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;
                }
        }
}

IMG_20160528_213159.jpg
IMG_20160528_213202.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。