switch case中调用的子程序中有for循环,导致switch无法跳转

做了个流水灯,通过一个按键切换流水灯的样式,用switch case语句,switch中调用子程序,
在子程序中有for循环,然后这个就不跳转了


#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar keyval,led1,led,i;

sbit key=P1^5;

void delay(uchar a)  //延迟函数
{
while(a--)for(i=0;i<120;i++);
}
void run1() //子程序1
{
int b;
uchar code seg[] = {0xFE,0xFB,0xEF,0xBF,0x7F,0xDF,0xF7,0xFD,0xAA, 0x55,0xE7, 0xDB, 0xBD, 0x7E,0x3C, 0x18, 0x00 };
for(b=0;b<17;b++)
{
P0=seg[b];
delay(200);
P0=0xff;
delay(100); 
}
}
void run2()//子程序2
{
led=0xfe;
P0=led;
led=_cror_(led,1),delay(200);
}
main() //主循环
{
//led=0xfe;
led1=0x55;
while(1)
    {
    if(key==0) //当按键为0电位
        {
        delay(5);
        keyval++;
        keyval%=3;
        }
    switch(keyval)  
        {
        case 0:run1();break;
        case 1:run2();break;
        case 2:P0=led1;led1=~led1;delay(200);break; // 按位取反led1=~led1 若led1=0x01则led1=~led1就为0xfe
        default:break;
        }
    }
}

仿真电路

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

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^