51单片机如何处理红外遥控器长按???

51单片机如何处理红外遥控器长按???,第1张

坚持一个原则,授正弯神之以渔,举一反三。

关于这个问题,程序匠人曾经写过一个短文叫“按键漫谈”,图文并茂,可以去百度文库里搜索一下。

如何区别“短击”和“长击”?

a) 定义一个变量:KEY_JSQ = 按键闭合计数器 b) 定义一个常数:AN_CJ_DL = 按键长闹稿击时间常数

c) 定时检测按键,当按键闭合时,KEY_JSQ按一定的频率递增; d) 当KEY_JSQ>= AN_CJ_DL 时,确认一次有效长击。

e)

当按键释放时,再判一次KEY_JSQ,如果KEY_JSQ<AN_CJ_DL,则说明刚才释放的那次击键为“短击”

f) 需要指出的是,当一个按键上同时支持“短击”和“长击”时, 二者的执行时

机是不同的。 i. 一般来说,“长击”一旦被检测到就立即执行。 ii. 而对于“短击”来说,因为当按键举亏刚被按下时,系统无法预知本次击键的

时间长度,所以,“短击”必须在释放后再执行。

g) 当按键释放后,KEY_JSQ应当被清零。

判断完成之后,红外编码,然后发射

以NEC格式为例:

按键一次: 依次发送 引导码 + 地址 + 地址取反 + 数据 + 数据取反

长按键: 隔110ms左右发一次引导凳颂码(重复),并不带任何数据(全部为高枣雹郑电平)

所以根据这个特点可以识别长按键:

程序接收一帧数据后,提取出地址和数据,然后判断

......

//有地址和数据的,为一次按键

.....

//地址肆早和数据为空的,为重复按键

if((ir_addr_code==0xffff)&&(ir_origin_data==0xff)&&(ir_data==0xff))

{

repeat=1

key= last_key

}

每种协议都是不一样的,比如是日立的协议吧,就是通常说的一种,长按时发的第一个知橘32位是对应的地址码,命令码及其反码,但是按键一直按下时,则每隔固定时间发送的是重复码,这个重复是固定一组编码,与你按键对应的的地址和命令没有任何关系,也就是说任顷宽何长按的重复码都是一样的;

而连续按则不同,按键松开后再按,则再次发送对应地址码,命令码及其反码,不发送重复码。

程序搭乎团可以根据具体的编码时序分支处理,若是连续按,则跳入一个分支,否则跳入长按处理,长按里面判断很简单,则将上一次的结果重复一次即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12514898.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存