为什么无法切换开关无效


#include 
#include 
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0x7e,0xbd,0xdb,0xe7,0xdb,0xbd};
sbit key=P0^7;
uchar a;
void delay(uint b)
{
 uchar t;
 while (b--)
 {
  for(t=0;t<120;t++);
 }
}

void main()
{
unsigned char zt=0;
while(1)
{
if(key==1){zt=0;}
if(key==0){zt=1;}
switch(zt)
{
case 0:
P1=0x55;
 for(;;)
 {
  delay(500);
  P1=_crol_(P1,1);
  }
break;
case 1:
        for(;;)
        {
            for(a=0;a<6;a++)
            {
                P1=tab[a];
                delay(500);
            }
        }
break;
    }
}
}

为什么达不到切换开关后进入下一个程序

第7行: sbit key=P0^7; 键盘定义
第23行:if(key==1){zt=0;}
第24行:if(key==0){zt=1;}
当没有按下按键时,key=1 是默认的吧,所以按键电路是应该这种功能,按一次反转一次:

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0x7e,0xbd,0xdb,0xe7,0xdb,0xbd};
sbit key=P0^7;
uchar a;
void delay(uint b)
{
    uchar t;
    while (b--)
    {
      for(t=0;t<120;t++);
    }
}

void main()
{
    unsigned char zt=0;
    while(1)
    {
        //if(key==1){zt=0;}这句取消
        if(key==0){      //当按键按下
            delay(500);  //延时防抖
            if (key == 0)
                zt=!zt;
        }
        switch(zt)
        {
            case 0:
                  P1=0x55;
                  for(a=0;a < 8;a++)  //这里也是死循环吗?先改成有限循环调试
                  {
                      delay(500);
                      P1=_crol_(P1,1);
                  }
                  break;
            case 1:
                  //for(;;)  //这里也是死循环吗?
                 // {
                      for(a=0;a<6;a++)
                      {
                          P1=tab[a];
                          delay(500);
                      }
                //  }
                  break;
        }
    }
}