#include "lpc11xx.h" #include "ct.h" #include "ili9325.h" #include "w25q16.h" uint8_t pulse_start=0; // 脉冲开始标志 uint8_t pulse_bnum=0; // 脉冲计数器 uint8_t pulse_ok=0; // 发现前导码 uint8_t key_repeat=0; // 持续按键 uint16_t tc_buf=0; uint16_t ir_buf[64]; // 装载用户码和数据码 uint8_t user_code_hi; uint8_t user_code_lo; uint16_t user_code; uint8_t key_code; uint8_t key_code_lo; uint8_t ir_sign; // 接收到按键标志 uint8_t ir_process(void) { uint8_t i; uint16_t buf; for(i=0;i<16;i++) { user_code_hi<<=1; buf=ir_buf[i]+ir_buf[++i]; if((buf>2100)&&(buf<2450)) { user_code_hi+=1; } } for(i=16;i<32;i++) { user_code_lo<<=1; buf=ir_buf[i]+ir_buf[++i]; if((buf>2100)&&(buf<2450)) { user_code_lo+=1; } } for(i=32;i<48;i++) { key_code<<=1; buf=ir_buf[i]+ir_buf[++i]; if((buf>2100)&&(buf<2450)) { key_code+=1; } } for(i=48;i<64;i++) { key_code_lo<<=1; buf=ir_buf[i]+ir_buf[++i]; if((buf>2100)&&(buf<2450)) { key_code_lo+=1; } } if(key_code==(uint8_t)~key_code_lo) { user_code = (user_code_hi<<8)+user_code_lo; return 1; // 正确接收 } else return 0; } void TIMER16_1_IRQHandler(void) { if((LPC_TMR16B1->IR&0x10)==0x10) { tc_buf=LPC_TMR16B1->TC; LPC_TMR16B1->TC = 0; if((tc_buf>8500)&&(tc_buf<9500)) // 如果发现9ms { pulse_start=1; LPC_TMR16B1->IR = 0X10; // 清CAP0中断位 return; } if(pulse_start==1) { if((tc_buf>4000)&&(tc_buf<5000)) // 如果发现4.5ms { pulse_ok=1; LPC_TMR16B1->IR = 0X10; // 清CAP0中断位 pulse_start=0; key_repeat=1; return; } else if((tc_buf>2000)&&(tc_buf<3000)) // 如果发现2.5ms { key_repeat++; LPC_TMR16B1->IR = 0X10; // 清CAP0中断位 pulse_start=0; ir_sign=1; return; } } if(pulse_ok==1) { ir_buf[pulse_bnum]=tc_buf; pulse_bnum++; if(pulse_bnum==64) { pulse_ok=0; pulse_bnum=0; ir_sign=1; } } } LPC_TMR16B1->IR = 0X10; // 清CAP0中断位 } int main(void) { LCD_Init(); LCD_Clear(BLUE); W25Q16_Init(); IR_Init(); POINT_COLOR = WHITE; BACK_COLOR = BLUE; LCD_ShowString(12,12,"红外遥控检测机"); LCD_ShowString(12,50,"您拿的红外遥控器用户码是:"); LCD_ShowString(12,90,"您刚才按下的键码是:"); LCD_ShowString(12,130,"您已经连续按下此键的次数是:"); while(1) { if((ir_sign==1)&&(ir_process()==1)) // 接收到一个按键 { LCD_ShowNum(50,70,user_code,5); LCD_ShowNum(50,110,key_code,3); LCD_ShowNum(50,150,key_repeat,3); ir_sign=0; } } }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』