请教一下各位大佬,下面的代码下载进去之后发现上电时按下按键第一次的时候直接跳过第一个“case 0x04:P1 = 0x01; break; //打开红色LED”直接从第二行“case 0x05:P1 = 0x02; break; //打开绿色LED”开始执行。当case循环一周之后就又正常了。重新上电之后又恢复到之前的问题
哪位大佬知道原因烦请指点一下,谢谢
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
bit key_ok;//<<<<<<<<<<<<<<<<<<<<<<<<<<<
unsigned char IRcord[4];//用来存放用户码、用户反码、数据码、数据反码
unsigned char irdata[33];//用来存放32位码值
typedef unsigned char u8;
typedef unsigned int u16;
u16 mode;
sbit key = P3^4;
void delay(u16 i)
{
while(i--);
}
void tim0_isr()interrupt 1 //定时器0中断服务函数
{
irtime++;
}
void ex0_isr()interrupt 0 //外部中断0服务函数
{
static unsigned char i;
static bit startflag;
if(startflag)
{
if(irtime<53&&irtime>=32)
i=0;
irdata=irtime;
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
void TIM0init()//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;
TL0=0x00;
EA=1;
ET0=1;//开总中断
TR0=1;
IT0=1;
EX0=1;
}
void Ircordpro()//红外码值处理函数(关键函数)
{
unsigned char i,j,k=1;
unsigned char cord,value;
for(i=0; i<4; i++) //处理4个字节
{
for(j=1; j<=8; j++) //处理1个字节8位
{
cord=irdata[k];
value=value>>1;
if(cord>7)value=value|0x80;//大于某值为1
k++;
}
IRcord=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
void Key() //按键
{
if(key==0)
{
delay(1000);
if(key==0)
{
key_ok = 1;//<<<<<<<<<<<<<<<<<<<<<<<<<<<
mode++;
if(mode==7)
{
mode=0;
}
while(!key);
}
}
}
void Led_Control()//<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
unsigned char Temp = 0;
// static u8 Temp = 0;
if(irok)
{
Ircordpro();
irok=0;
}
if(irpro_ok)
{
irpro_ok = 0;
Temp = IRcord[2];
}
if(key_ok)
{
key_ok = 0;
Temp = mode+4;
}
switch(Temp)
{
case 0x04:P1 = 0x01; break; //打开红色LED
case 0x05:P1 = 0x02; break; //打开绿色LED
case 0x06:P1 = 0x04; break; //打开蓝色LED
case 0x07:P1 = 0x07; break; //打开白色LED
case 0x08:P1 = 0x03; break; //打开红绿色LED
case 0x09:P1 = 0x05; break; //打开红蓝色LED
case 0x0a:P1 = 0x06; break; //打开绿蓝色LED
default:break;
}
}
void main()
{
P1 = 0x00;
TIM0init();
while(1)
{
Key();
Led_Control();//<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
}
|