找回密码
 立即注册
查看: 154|回复: 8

关于NEC遥控器重复码的识别

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:101
  • 最近打卡:2025-05-01 08:57:24
已绑定手机

5

主题

22

回帖

519

积分

高级会员

积分
519
发表于 2025-3-11 17:45:38 | 显示全部楼层 |阅读模式
       各位兄弟,请教一下NEC遥控器重复码的识别。也就是长按是如何实现的?做了很多用到遥控器类的产品,一直没有用到长按功能,现在有客户提出来用长按实现连加、连减。我试着读取2.25ms的重复码,可以正常读取,但是不能实现长按功能,汗!有例程的兄弟不吝赐教!谢谢!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-3-11 17:50:09 | 显示全部楼层
保存一下最后一个键值码,,如果读取到是重复码就把上一次的键值码发送给应用层
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:101
  • 最近打卡:2025-05-01 08:57:24
已绑定手机

5

主题

22

回帖

519

积分

高级会员

积分
519
发表于 2025-3-11 18:46:27 | 显示全部楼层
_奶*** 发表于 2025-3-11 17:50
保存一下最后一个键值码,,如果读取到是重复码就把上一次的键值码发送给应用层 ...

键值码,短按的时候也是必须保存的。

点评

做一个连续检测长度判断,每隔一段时间,例如200ms,判断当前是否还有新接收的键值码。 如果还有的话就判断是否跟上次连续一致,等待多次连续后(例如三次重复)就开始以固定间隔连续增加。 如果判断跟上次不一样,  详情 回复 发表于 2025-3-11 18:57
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-3-11 18:57:37 | 显示全部楼层
Tank*** 发表于 2025-3-11 18:46
键值码,短按的时候也是必须保存的。

做一个连续检测长度判断,每隔一段时间,例如200ms,判断当前是否还有新接收的键值码。
如果还有的话就判断是否跟上次连续一致,等待多次连续后(例如三次重复)就开始以固定间隔连续改变需要设置的变量(例如数值的连续自加)。
如果判断跟上次不一样,就重新开始200ms计时并清除重复计数
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:101
  • 最近打卡:2025-05-01 08:57:24
已绑定手机

5

主题

22

回帖

519

积分

高级会员

积分
519
发表于 2025-3-11 19:52:50 | 显示全部楼层
王*** 发表于 2025-3-11 18:57
做一个连续检测长度判断,每隔一段时间,例如200ms,判断当前是否还有新接收的键值码。
如果还有的话就判 ...

这样也行?32位码,如果连按就出错了

点评

连按不影响长按识别,只有检测到重复码才开始200ms(或者其他长度,需要长一点)的计时,计时到了再进行重复判别 如果按下了其他按键,可以直接清空计时,这样只有在长按的时候才有连加反应 具体效果应该是按下+按键  详情 回复 发表于 2025-3-11 20:01
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-3-11 20:01:55 | 显示全部楼层
Tank*** 发表于 2025-3-11 19:52
这样也行?32位码,如果连按就出错了

连按不影响长按识别,只有检测到重复码才开始200ms(或者其他长度,需要长一点)的计时,计时到了再进行重复判别
如果按下了其他按键,可以直接清空计时,这样只有在长按的时候才有连加反应
具体效果应该是按下+按键,立刻加1,等待识别到重复码超过指定时间长度(长按了一会)然后再开始连续自加
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2025-3-11 20:36:23 | 显示全部楼层
以下内容来自AI,不知道是否可以参考



为了实现NEC遥控器的长按功能(连加/连减),需要正确处理重复码的时序和状态机。以下是基于STC8H单片机的实现思路和示例代码:
NEC协议长按原理
  • 首次按键:发送完整数据帧(引导码+用户码+键码)
  • 长按期间:每110ms发送一个重复码(9ms低电平+2.25ms高电平)
  • 按键释放:停止发送重复码

实现思路
  • 外部中断捕获红外信号下降沿
  • 定时器测量脉冲宽度区分引导码/重复码
  • 状态机管理按键状态(短按/长按)
  • 连发加速功能(首次延迟后加速)  
    1. #include <STC8H.H>
    2. #include <intrins.h>
    3. // 红外接收引脚配置
    4. sbit IR_PIN = P3^2;  // 假设使用INT0中断(P3.2)
    5. // 全局变量
    6. bit ir_flag = 0;     // 红外数据就绪标志
    7. unsigned char ir_data[4]; // 存储用户码、用户反码、键码、键反码
    8. unsigned char repeat_count = 0;  // 重复码计数器
    9. unsigned long last_repeat_time = 0; // 上次重复时间戳
    10. unsigned char key_hold = 0;      // 当前长按键值
    11. // 定时器0初始化(1ms计时)
    12. void Timer0_Init(void) {
    13.     AUXR |= 0x80;   // 1T模式
    14.     TMOD &= 0xF0;   // 模式0(16位自动重载)
    15.     TL0 = 0xCD;     // 初始化值
    16.     TH0 = 0xD4;
    17.     TR0 = 1;        // 启动定时器
    18.     ET0 = 1;        // 允许中断
    19.     EA = 1;
    20. }
    21. // 外部中断0初始化
    22. void INT0_Init(void) {
    23.     IT0 = 1;        // 下降沿触发
    24.     EX0 = 1;        // 允许中断
    25.     EA = 1;
    26. }
    27. // 处理红外数据
    28. void ProcessIR(unsigned char key) {
    29.     static unsigned long last_key_time = 0;
    30.     static unsigned char repeat_delay = 500; // 首次连发延迟500ms
    31.     static unsigned char repeat_speed = 200; // 连发速度200ms
    32.    
    33.     if(key_hold != key) { // 新按键
    34.         key_hold = key;
    35.         // 执行短按操作
    36.         if(key == 0x45) { // 假设0x45是音量+
    37.             // 执行加操作
    38.         }
    39.         repeat_count = 0;
    40.     } else { // 长按状态
    41.         unsigned long now = (TH0 << 8 | TL0) + (unsigned long)TF0 * 65536;
    42.         if(now - last_key_time > (repeat_count ? repeat_speed : repeat_delay)) {
    43.             // 执行连发操作
    44.             repeat_count++;
    45.             last_key_time = now;
    46.             // 加速逻辑(可选)
    47.             if(repeat_count > 10) repeat_speed = 100;
    48.             else if(repeat_count > 5) repeat_speed = 150;
    49.         }
    50.     }
    51. }
    52. // 外部中断0服务函数
    53. void INT0_ISR(void) interrupt 0 {
    54.     static unsigned int time_cnt;
    55.     static unsigned char bit_cnt;
    56.     static unsigned char data_cnt;
    57.    
    58.     time_cnt = 0;
    59.     while(!IR_PIN); // 等待高电平
    60.    
    61.     // 测量9ms引导码
    62.     while(IR_PIN) {
    63.         time_cnt++;
    64.         _nop_();_nop_();_nop_(); // 约10us延时
    65.         if(time_cnt > 1000) break; // 超时退出
    66.     }
    67.    
    68.     if(time_cnt > 900 && time_cnt < 1100) { // 9ms引导码
    69.         // 接收数据帧...
    70.     }
    71.     else if(time_cnt > 4000 && time_cnt < 5000) { // 4.5ms重复码
    72.         key_hold = ir_data[2]; // 保存键值
    73.         ir_flag = 2; // 重复码标志
    74.     }
    75. }
    76. // 主函数
    77. void main(void) {
    78.     Timer0_Init();
    79.     INT0_Init();
    80.    
    81.     while(1) {
    82.         if(ir_flag) {
    83.             if(ir_flag == 1) { // 首次按键
    84.                 // 处理键值ir_data[2]
    85.                 ir_flag = 0;
    86.             } else if(ir_flag == 2) { // 重复码
    87.                 ProcessIR(ir_data[2]);
    88.                 ir_flag = 0;
    89.             }
    90.         }
    91.         
    92.         // 检测按键释放(1秒无重复码认为释放)
    93.         if(key_hold && (GetCurrentTime() - last_repeat_time > 1000)) {
    94.             key_hold = 0;
    95.             repeat_count = 0;
    96.         }
    97.     }
    98. }
    复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:101
  • 最近打卡:2025-05-01 08:57:24
已绑定手机

5

主题

22

回帖

519

积分

高级会员

积分
519
发表于 2025-3-11 21:01:16 | 显示全部楼层
王*** 发表于 2025-3-11 20:01
连按不影响长按识别,只有检测到重复码才开始200ms(或者其他长度,需要长一点)的计时,计时到了再进行 ...

这应该是物理按键的思路,遥控的不一样。或许是我没想明白?

点评

物理按键和这种数据方式传来的按键,从底层来看不都是处理按键按下的过程嘛,其实是一样的 将数据方式重新转换为按键的几个特征点,然后通过时间长度来识别就行了  详情 回复 发表于 2025-3-11 21:04
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-3-11 21:04:34 | 显示全部楼层
Tank*** 发表于 2025-3-11 21:01
这应该是物理按键的思路,遥控的不一样。或许是我没想明白?

物理按键和这种数据方式传来的按键,从底层来看不都是处理按键按下的过程嘛,其实是一样的
将数据方式重新转换为按键的几个特征点,然后通过时间长度来识别就行了
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 04:14 , Processed in 0.175542 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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