关于这个问题,程序匠人曾经写过一个短文叫“按键漫谈”,图文并茂,可以去百度文库里搜索一下。
如何区别“短击”和“长击”?
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位是对应的地址码,命令码及其反码,但是按键一直按下时,则每隔固定时间发送的是重复码,这个重复是固定一组编码,与你按键对应的的地址和命令没有任何关系,也就是说任顷宽何长按的重复码都是一样的;而连续按则不同,按键松开后再按,则再次发送对应地址码,命令码及其反码,不发送重复码。
程序搭乎团可以根据具体的编码时序分支处理,若是连续按,则跳入一个分支,否则跳入长按处理,长按里面判断很简单,则将上一次的结果重复一次即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)