| 采用定时器+IO中断的程序 //  IR:
 //  S:  H:L    =9.00ms:4.50ms           270
 //  1:  H:(H+L)=0.56ms:2.25ms           45
 //  0:  H:(H+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;
 
 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++;
 }
 |