interrupt 2
{
unsigned char cNumber1,cNumber2,cCount=0;
EX1 = 0; //关闭中断
Delay(15);
if (IR==1) //然后再检测红线接收脚是有数据招收,有继续,没有则退出
{
EX1 =1; //打开中断
return; //跳出去
}
while (!IR) //确认IR信号出现
{ //等IR变为高电平,跳过9ms的前导低电平信号。
Delay(1);
}
for (cNumber1=0;cNumber1<4;cNumber1++) //收集四组数据,前两组为地址码,仅
{ //仅接着是两个命令码,这是NEC公司所定义的协议里规定的
for (cNumber2=0;cNumber2<8;cNumber2++)//每组数据有8位
{
while (IR) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{
Delay(1);
}
while (!IR) //等 IR 变为高电平
{
Delay(1);
}
while (IR) //计算IR高电平时长
{
Delay(1);
cCount++;
if (cCount>=30)
{
EX1=1;
return;
} //太长了就自动推出中断服务程序
} //高电平计数完毕
cIRReceiveData[cNumber1]=cIRReceiveData[cNumber1] >> 1;//数据最高位补“0”
if(cCount>=8) //协议里定义‘1’的电平为2.25ms,因为Delay(1)延时为0.14ms
{ //加上其他指令执行时的延时,所以大于等于8时,为高电平
cIRReceiveData[cNumber1] = cIRReceiveData[cNumber1] | 0x80;
} //数据最高位补“1”
cCount=0;
}//end for k
}//end for j
if(cIRReceiveData[2]!=~cIRReceiveData[3])//判断接收到指令是不是正确,协议里规定
{//第一次发指令和第二次发的正好的按位取反的,以此保证接收数据的可靠性
EX1=1;
return;
}
cIRReceiveData[5]=cIRReceiveData[2] & 0x0F; //取键码的低四位
cIRReceiveData[6]=cIRReceiveData[2] >> 4; //右移4次,高四位变为低四位
if(cIRReceiveData[5]>9)//把接收到的数据转换成1602上面能显示的ASCII码
{ //具体请看ASCII码表,看转换的关系
cIRReceiveData[5]=cIRReceiveData[5]+0x37;
}
else
cIRReceiveData[5]=cIRReceiveData[5]+0x30;
if(cIRReceiveData[6]>9)
{
cIRReceiveData[6]=cIRReceiveData[6]+0x37;
}
else
cIRReceiveData[6]=cIRReceiveData[6]+0x30;
DisplayOneCharLCD(13,1,cIRReceiveData[6]); //显示接收到数据的第一位
DisplayOneCharLCD(14,1,cIRReceiveData[5]); //显示接收到数据的第二位
EX1 = 1; //打开中断,解码完成,以进行下次解码
}