NCE红外解码 支持长按

2020-01-12 17:20发布

#include <intrins.h> //中断服务宏
#include "delay.h"
#include "main.h"

sbit IRIN = P3^2; //红外接收器数据线(外部中断0)

//--------------------------------------------------------------------------
void ext_int_0_inti(void) //外部中断0初始化
{
        IRIN = 1; //红外引脚
        IT0  = 1; //IT0 = 0低电平触发,IT0 = 1则为下降沿触发
        EX0  = 1; //INT0中断开
}
void extInt_0_interrupt(void) interrupt 0 //using 0//INT0中断  由P3.2引脚产生
{
        unsigned char s_j, s_k, s_N=0, s_IRCOM[4];
        static unsigned char s_time;
        EX0 = 0;

        do {_delay_us(100); s_N++;} while (!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号
        if (s_N<90) {goto EXIT;} //前导低电平 低于9ms 退出
        s_N = 0;

        do{_delay_us(100); s_N++;} while (IRIN); //等IR变为低电平
        if (s_N>2 && s_N<25) //2.25ms为重复
        {
                if (s_time>9) {g_system.button_event = 1;} else {s_time++;} //一秒后连续触发
                goto EXIT;
        }
        if (s_N>44) //4.5ms的前导
        {
                s_time = 0;
                for (s_j=0; s_j<4; s_j++) //收集四组数据
                {
                        for (s_k=0; s_k<8; s_k++) //每组数据有8位
                        {
                                s_N = 0;
                                while (!IRIN); //等IR变为高电平
                                 while (IRIN)
                                {
                                        _delay_us(100);
                                        s_N++;
                                        if (s_N>24 ) {goto EXIT;} //高电平计数超过2.25ms自动离开
                                }
                        //        if (s_N>17) {goto EXIT;} //高电平计数超过1.69ms自动离开
                                s_IRCOM[s_j] >>= 1;
                                if (s_N>8) {s_IRCOM[s_j] |= 0x80;} //N<0.565ms为低电平;N>0.565ms&&N<1.69ms为高电平
                        }
                }
                if ((s_IRCOM[2]!=~s_IRCOM[3])//判断接收数据是否正确
        //        && (IRCOM[0]!=0x00) && (IRCOM[1]!=0xFF)//比较用户码是否正确
                ) {goto EXIT;}
                g_system.button_datum = s_IRCOM[2]; //装载数据
                g_system.button_event = 1; //发起按键事件
        }
        EXIT :
        EX0=1;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。