lpc1114单片机红外遥控程序

  • 学习3201次
#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;
?? ??? ?}
?? ?}
}

发表评论