流水灯按键问题,看看问题出在哪里

为什么切换按键按下去后流水灯不会切换
而是按住流水灯停住,松开继续
#include <reg51.h>
unsigned char dat1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char dat2[8]={0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e};
unsigned char dat3[8]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};

unsigned char MODE=0,STOP=0,num=0;
void mode1();
void mode2();
void mode3();
void keyscan(void);
sbit key1=P3^0;
sbit key2=P3^1;
void delay(unsigned int x);

//主函数
void main(void)
{
while(1)
{
keyscan();
switch(MODE)
{
case 0: if(STOP) {P0=dat1[num];num++;num%=8;}break;
case 1: if(STOP) {P0=dat1[num];num++;num%=8;}break;
case 2: if(STOP) {P0=dat1[num];num++;num%=8;}break;
}
delay(100);
}
}
//延时函数
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
{
for(j=0;j<330;j++);
}
}
//流水灯模式1
void mode1(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
P0=dat1[i];delay(100);
}
}
//流水灯模式2
void mode2(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
P0=dat2[i];delay(100);
}
}
//流水灯模式3
void mode3(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
P0=dat3[i];delay(100);
}
}
//按键
void keyscan(void)
{
if(key1==0)//按键1
{
delay(10);
if(key1==0)
{
MODE++;
MODE%=3;
while(key1==0);
}
}
if(key2==0)//按键2
{
delay(10);
if(key2==0)
{
STOP++;
STOP%=2;
while(key2==0);
}
}
}

因为你mode1,mode2,mode3定义了个寂寞,根本没调用啊
而如果你按下键不放,就进入了while(key1==0)死循环,当然就不动了
这个死循环的目的就是为了按一下,只++一次,避免按下时间不确定导致不知道加了多少次