proteus仿真数码管有问题

#include
sbit a=P2^2;
sbit b=P2^3;
sbit c=P2^4;
sbit shijia=P3^0;
sbit shijian=P3^1;
sbit fenjia=P3^2;
sbit fenjian=P3^3;
unsigned int ms=0,s=0,min=0,h=0;
unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7e,0x39,0x5e,0x79,0x71};

void delay(unsigned int i)
{while(i--);}

void anjian()
{
    if(shijia==0)
    {h++;while(shijia!=1);}
    if(shijian==0&&h>=1)
    {h--;while(shijian!=1);}
    if(fenjia==0)
    {min++;while(fenjia!=1);}
    if(fenjian==0&&min>=1)
    {min--;while(fenjian!=1);}
}

void main()
{
    unsigned char i=0;
    while(1)
    {
        P2=0xff;
        switch(i)
        {
            case 0:P0=table[ms/10%10];a=0;b=0;c=0;i++;break;   
            case 1:P0=table[ms/100%10];a=1;b=0;c=0;i++;break;
                        case 2:P0=table[s%10];a=0;b=1;c=0;i++;break;
            case 3:P0=table[s/10];a=1;b=1;c=0;i++;break;
            case 4:P0=table[min%10];a=0;b=0;c=1;i++;break;   
            case 5:P0=table[min/10];a=1;b=0;c=1;i++;break;  
            case 6:P0=table[h%10];a=0;b=1;c=1;i++;break;   
            case 7:P0=table[h/10];a=1;b=1;c=1;i=0;break;  
        }
        ms++;
        if(ms==1000)
        {ms=0; 
         s++;}
        if(s==60)
        {s=0; 
         min++;}
        if(min==60)
        {min=0; 
         h++;}
        if(h==24)
        {h=0;}
        anjian();
        delay(50);
    }
}


利用keil 5去实现时钟的仿真,问题出现在时的十位在仿真的时候显示的数字会一直跳。开始的时候不会维持在0的状态;
时的十位代码:case 7:P0=table[h/10];a=1;b=1;c=1;i=0;break;

不按也会跳?
看一下编译器输出信息。
在anjian函数里暂时注释掉和h相关的代码,也许是按键电平错误导致