×
单片机 > 单片机程序设计 > 详情

lpc1114单片机红外遥控程序

发布时间:2020-06-04 发布时间:
|
#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;
        }
    }
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义