51单片机 按键按下很有才有响应

问题遇到的现象和发生背景

想问下大家 我程序想实现下面的功能:
PWM控制灯光亮度 然后LED按照下图的四个模式流转
就我现在运行程序时候点击S7要过大概2min左右才有反应 流水灯是可以正常运转的 就不知道为什么按键按下这么久才反应
刚学51打算参加蓝桥杯 给这个问题整麻了
打算重写程序了 但是想把这个搞明白 谢谢各位帮忙!
iic的程序应该没啥问题就不贴上来了 单片机用的是蓝桥杯的 IAP15F2K61S2

img

问题相关代码,请勿粘贴截图

#include <reg52.h>
#include <iic.h>
sbit S7 = P3^0;

unsigned char ledbuf;
unsigned char buzzbuf;
unsigned char combuf;
unsigned char segbuf;

unsigned char start = 0;
unsigned char mode = 1;
unsigned int space[] = {400,400,400,400};
unsigned char pwm_duty;
unsigned char pwm = 0;
unsigned char level;

void LED_Control();

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

void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;break;
case 0:
P2 = (P2 & 0x1f) | 0x00;break;
}
}

void Display_bit(unsigned char channel, unsigned char value)
{
SelectHC573(channel);
P0 = value;
SelectHC573(0);
}

void Inittimer0()
{
TMOD = (TMOD & 0xf0) | 0x01;
TH0 = (65535 - 2000)/256;
TL0 = (65535 - 2000)%256;

EA = 1;
ET0 = 1;
TR0 = 1;

}

unsigned char i = 0;
unsigned char stat = 1;
unsigned int count = 0;

void Timer0_Control() interrupt 1
{
TH0 = (65535 - 2000)/256;
TL0 = (65535 - 2000)%256;
count++;
pwm++;
if(pwm < pwm_duty)
Display_bit(4,ledbuf);
else if(pwm <= 20)
Display_bit(4,0xff);
else
{
Display_bit(4,ledbuf);
pwm = 0;
}
if(start == 1)
LED_Control();
}

void LED_Control()
{
switch(mode)
{
case 1:
if(count == space[0])
{
ledbuf = ~(0x01 << i);
i++;
if(i == 8)
{
i=0;
mode++;
}
count = 0;
}break;
case 2:
if(count == space[1])
{
ledbuf = ~(0x80 >> i);
i++;
if(i == 8)
{
i=0;
mode++;
}
count = 0;
}break;
case 3:
if(count == space[2])
{
switch(stat)
{
case 1:
ledbuf = 0x7e;stat++;break;
case 2:
ledbuf = 0xbd;stat++;break;
case 3:
ledbuf = 0xdb;stat++;break;
case 4:
ledbuf = 0xe7;stat=1;mode++;break;
}
count = 0;
}break;
case 4:
if(count == space[3])
{
switch(stat)
{
case 1:
ledbuf = 0xe7;stat++;break;
case 2:
ledbuf = 0xdb;stat++;break;
case 3:
ledbuf = 0xbd;stat++;break;
case 4:
ledbuf = 0x7e;stat=1;mode=1;break;
}
count = 0;
}break;
}
}

void InitSystem()
{
ledbuf = 0xff;
Display_bit(4,ledbuf);
buzzbuf = 0x00;
Display_bit(5,buzzbuf);
segbuf = 0xff;
Display_bit(7,segbuf);
combuf = 0x00;
Display_bit(6,combuf);
}

void PWM_change()
{
unsigned char p;
p = Read_8951();
if(p > 0 && p<=60)
{
pwm_duty = 5;
level = 1;
}
if(p > 60 && p<=120)
{
pwm_duty = 10;
level = 2;
}
if(p > 120 && p<=180)
{
pwm_duty = 15;
level = 3;
}
else
{
pwm_duty = 20;
level = 4;
}
}

void KeyControl()
{
if(S7 == 0)
{
delay(100);
if(S7 == 0)
{
if(start == 0)
start = 1;
else if(start == 1)
{
start = 0;
ledbuf = 0xff;
Display_bit(4,ledbuf);
mode = 1;
i = 0;
stat = 1;
}
while(S7 == 0);
}
}
}
void main()
{
InitSystem();
Inittimer0();
while(1)
{
KeyControl();
PWM_change();
}
}

不知道是不是中断里程序写太多了...