采用定时器+IO中断的程序
// IR:
// S: H =9.00ms:4.50ms 270
// 1: HH+L)=0.56ms:2.25ms 45
// 0: HH+L)=0.56ms:1.125ms 22
const UI08 POS2HEX[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
UI08 GnIRUC1=0; // 用户码
UI08 GnIRUC2=0; // 用户码
UI08 GnIRKC1=0; // 按键码
UI08 GnIRKC2=0; // 按键码
UI08 GnPOS=0;
UI08 GnIRKEY=KEY_NONE;
// IO中断处理函数
void INT_PROC(void)
{
// int im;
UI08 nTime;
nTime=GvTime4Cnt; // 50us定时计数器
GvTime4Cnt=0;
if(nTime>100)
{
GnPOS=0;
GnIRUC1=0;
GnIRUC2=0;
GnIRKC1=0;
GnIRKC2=0;
}
else if(nTime>16)
{
if((GnPOS&0x18)==0x00)
{
GnIRUC1|=POS2HEX[GnPOS&0x07];
}
else if((GnPOS&0x18)==0x08)
{
GnIRUC2|=POS2HEX[GnPOS&0x07];
}
else if((GnPOS&0x18)==0x10)
{
GnIRKC1|=POS2HEX[GnPOS&0x07];
}
else if((GnPOS&0x18)==0x18)
{
GnIRKC2|=POS2HEX[GnPOS&0x07];
}
GnPOS++;
}
else
{
GnPOS++;
}
if(GnPOS==0x20)
{
if(GnIRUC1==0x40 && GnIRUC2==0xBF && (GnIRKC1^GnIRKC2)==0xFF)
{
GnIRKEY=GnIRKC1;
}
else
{
GnIRKEY=KEY_NONE;
}
GnPOS=0;
}
}
// 定时中断处理函数
// 50us计数一次.
void TIMER_PROC (void)
{
if(GvTime4Cnt<250) GvTime4Cnt++;
} |