搜索
bottom↓
回复: 5

NCE红外解码 支持长按

[复制链接]

出0入0汤圆

发表于 2014-4-19 07:59:27 | 显示全部楼层 |阅读模式
#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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-4-19 15:50:24 | 显示全部楼层
当IRIN受干扰时,会影响整体
while (!IRIN);  while (IRIN) 永远不成立时,永远当在这里...
尽量不采用中断及while方式

出0入0汤圆

发表于 2014-4-22 11:36:04 | 显示全部楼层
不错不错。我来看看很好。

出0入0汤圆

发表于 2014-5-8 23:54:18 | 显示全部楼层
应该是NEC

出0入0汤圆

发表于 2014-5-14 00:41:56 | 显示全部楼层
可以用100us扫描来做。

出0入4汤圆

发表于 2019-10-1 18:08:34 来自手机 | 显示全部楼层
这个占用资源少,要好好看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 06:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表