打印

关于一个红外HX1838 NEC协议的中断解码程序。

[复制链接]
1531|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
受到警告 楼主
aa258|  楼主 | 2015-11-30 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dirtwillfly 于 2015-11-30 16:14 编辑

void InterruptTimer2 (void) interrupt 5                  //中断解码函数
{
        //定时器2计数器重新置0,自动重新计数,原数据已转存到RCAP2H和RCAP2L
        TH2=0;
        TL2=0;

        if(TF2)                                                                                  //判断是否时间溢出中断
        {
                TF2=0;                                                                          //清楚中断标志
                time_cnt++;
                if(time_cnt>1000) time_cnt=100;
                if(time_cnt>1) continue_botton=0;                  //没有连续按键

        }
        else if (EXF2)                                                                  //判断是否是输入捕捉中断
        {//输入捕捉中断
                EXF2=0;                                                                          //清楚中断标志
                temp_time =RCAP2H;
                temp_time=temp_time*256+RCAP2L;
                if(time_cnt!=0)                                                          //判断是否为第一个下降沿
                {                                                                                  //是第一个下降沿
                        time_cnt=0;
                }
                else                                                                          //不是第一个下降沿
                {
                        if(temp_time >924&&temp_time<1325)          //接收码“0”的判断
                        {
                                temp_time=0x0000;
                        }
                        else if (temp_time>1945&&temp_time<2445)          //接收码“1”的判断
                        {
                                temp_time=0x8000;
                        }
                        else if (temp_time>11400&&temp_time<13600)          //起始码判断
                        {                                                                                          //是起始码
                                bitcnt=0;
                                IR_address_temp=0;
                                IR_data_temp=0;
                                return;
                        }
                        else if(temp_time>9800&&temp_time<11400)          //连续按键判断
                        {
                                continue_button =1;
                                time_cnt=0;
                                return;
                        }
                        else
                        {
                                time_cnt=0;
                                return;
                        }
                }
                else
                {
                        time_cnt=0;
                        return;
                }
                /*数据处理*/
                bitcnt++;                                                                                                          //接收数据位计数
                if(bitcnt<16)                                                                                                  //前15位地址位接收
                {
                        IR_address_temp= IR_address_temp|(uint)temp_time;
                        IR_address_temp=IR_address_temp>>1;
                }
                else if(bitcnt==16)                                                                                          //末位地址接收
                {
                        IR_address_temp=IR_address_temp| (uint)temp_time;
                }
                else if(bitcnt<32)                                                                                          //前15位数据位接收
                {
                        IR_data_temp=IR_data_temp|(uint)temp_time;
                        IR_data_temp=IR_data_temp>>1;
                }
                else if(bitcnt=32)                                                                                          //末位数据位接收,收到一次完整的指令
                {
                IR_address_temp=IR_address_temp|(uint)temp_time;
                        IR_address=IR_address_temp;                                                                 //保存地址缓存
                        IR_data=IR_data_temp;                                                                         //保存数据缓存

相关帖子

沙发
dirtwillfly| | 2015-11-30 16:15 | 只看该作者
感谢分享

使用特权

评论回复
板凳
LOUIS`| | 2016-12-17 17:41 | 只看该作者
谢谢分享····            

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝