你使用for循環+delay延時處理閃爍燈,CPU幾乎完全被占用,按鍵狀態很難被捕捉到,而且按鍵抬起識別用了while(key==0);死循環等待,這就導致互相擠占CPU時間,程序運行不暢。給你把閃爍燈程序改在定時器中斷里處理,你試試。
#include<reg51.h>
sbit key=P3^2;
sbit led1=P3^4;
sbit led2=P3^5;
sbit led3=P3^0;
sbit led4=P3^1;
unsigned char times=0;
unsigned char time=0;
unsigned char time1=0;
bit flag=1;
void delay(unsigned char a)
{
unsigned char i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
void Timer0Init() //50毫秒@12.000MHz
{
TMOD= 0x01; //設置定時器模式
TL0 = 0xB0; //設置定時初值
TH0 = 0x3C; //設置定時初值
TF0 = 0; //清除TF0標志
// TR0 = 1; //定時器0開始計時
EA=1; //開總中斷
ET0=1; //開定時器0中斷
}
void Twinkle()
{
static unsigned char i=0,j=0;
if(flag==1)
{
time1++;
if(time1==24)
time1=0;
if(time1<12)
{
switch(i)
{
case 0:led1=0;led2=1;led3=1;led4=1;i=1;break;
case 1:led1=1;led2=0;led3=1;led4=1;i=0;break;
}
j=0;
}
else
{
switch(j)
{
case 0:led1=1;led2=1;led3=0;led4=1;j=1;break;
case 1:led1=1;led2=1;led3=1;led4=0;j=0;break;
}
i=0;
}
}
}
void main()
{
unsigned char k = 0; //按鍵狀態
Timer0Init();
while(1)
{
if(key==0)
{
delay(10);
if((key==0)&&(k==0))
{
k=1;
times++;
times%=3;
}
}
else k=0;
switch(times)
{
case 0:led1=led2=led3=led4=1;TR0=0;flag=0;time1=0;break;
case 1:led1=0;break;
case 2:flag=1;TR0=1;break;
}
}
}
void timer0() interrupt 1
{
TL0 = 0xB0; //設置定時初值
TH0 = 0x3C; //設置定時初值
time++;
if(time>=10) //0.5秒
{
time=0;
Twinkle();
}
}
|