关于#单片机#的问题,如何解决?

刚学单片机,碰到个问题,通过按钮和复位控制数管数字+1,但是仿真里测试,按钮加0,1,7时正常,但是加到其余次数时,第一位数会变成8,仿真重新画了,程序看了又看,眼拙没发现啥问题,头都懵了,求解救!

img

#include
#define uint unsigned int
#define uchar unsigned char
sbit key1=P1^0;
sbit key2=P1^1;
sbit q=P3^0;
sbit b=P3^1;
sbit s=P3^2;
sbit g=P3^3;
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X89};
void delayms(uint k);

void main()
{
  uint num;
    while(1)
    {
       if(key1==0)
         {
           delayms(10);
             if(key1==0)
             {
               while(key1==0)
                 {
                  q=1;
              P2=tab[num/1000];
              delayms(5);
              q=0;
                    
              b=1;
              P2=tab[(num/100)%10];
              delayms(5);
              b=0;
                    
              s=1;
              P2=tab[(num/10)%10];
              delayms(5);
              s=0;
                    
               g=1;
                    P2=tab[num%10];
          delayms(5);
          g=0;    
                 }
                 num++;
             }    
            }
            
      if(key2==0)
          {
          delayms(10);
          if(key2==0)
          {
              while(key2==0)
                 {
                  q=1;
              P2=tab[num/1000];
              delayms(5);
              q=0;
                    
              b=1;
              P2=tab[(num/100)%10];
              delayms(5);
              b=0;
                    
              s=1;
              P2=tab[(num/10)%10];
              delayms(5);
              s=0;
                    
               g=1;
                    P2=tab[num%10];
          delayms(5);
          g=0;
                 }
              num=0;
           }
           }
                   q=1;
              P2=tab[num/1000];
              delayms(5);
              q=0;
                    
              b=1;
              P2=tab[(num/100)%10];
              delayms(5);
              b=0;
                    
              s=1;
              P2=tab[(num/10)%10];
              delayms(5);
              s=0;
                    
               g=1;
                    P2=tab[num%10];
          delayms(5);
          g=0; 
            }
    }
    
void delayms(uint k)
{
  uint i,j;
    for(i=0;ifor(j=0;j<125;j++);
}





没做段消隐,在每位打开前添加段消隐,依据数码管类型消隐值也不同或0或ff。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^