#include "remote.h"
UINT IrCode; //高8位为系统码,低八位为数据码
/*************************************************************************** *FUNCTION NAME: DelayIr
*CREATE DATE: 2012/6/7
*CREATED BY: XS
*FUNCTION: IR采样延时:0.14ms
*MODIFY DATE: 2012/6/7
*INPUT: 无
*
*RETURN: 无
***************************************************************************/ void DelayIr(UCHAR timer)
{
UCHAR i;
while(timer--)
{
for (i = 0; i<13; i++);
}
}
/*************************************************************************** *FUNCTION NAME: RemoteDecode
*CREATE DATE: 2012/6/7
*CREATED BY: XS
*FUNCTION: IR遥控解码
*MODIFY DATE: 2012/6/7
*INPUT: 无
*
*RETURN: 无
***************************************************************************/ void RemoteDecode(void)
{
UCHAR i,j,n = 0;
UCHAR irDat[4] = {0};
EX0 = 0;
DelayIr(1);
if (IRIN==1)
{
EX0 = 1;
return;
}
DelayIr(29);
if (IRIN==1)
{
EX0 = 1;
return;
}
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
DelayIr(2);
}
for (i=0;i<4;i++) //收集四组数据
{
for (j=0;j<8;j++) //每组数据有8位
{
while (IRIN) //等IR 变为低电平,跳过4.5ms的前导高电平信号。
{
DelayIr(2);
}
while (!IRIN) //等IR 变为高电平
{
DelayIr(2);
}
while (IRIN) //计算IR高电平时长
{
DelayIr(2);
n++;
if (n>=30) //0.14ms计数过长自动离开。
{
EX0 = 1;
return;
}
} //高电平计数完毕
irDat[i] = irDat[i] >> 1; //数据最高位在前
if (n>=8)
irDat[i] = irDat[i] | 0x80; //数据最高位补“1”
n = 0;
}
}
// if (irDat[2] != ~irDat[3]) //数据码与其反码比较
// {
// EX0 = 1;
// return;
// }
IrCode = (irDat[2]<<8) + irDat[3];
EX0 = 1;
}
/*************************************************************************** *FUNCTION NAME: ExitInt0
*CREATE DATE: 2012/6/8
*CREATED BY: XS
*FUNCTION: 红外遥控解码:NEC码:系统码+系统反码+数据码+数据反码
*MODIFY DATE: 2012/6/8
*INPUT: 无
*RETURN: 无
***************************************************************************/ void ExitInt0(void) interrupt 0
{
RemoteDecode();
}。