按键一次: 依次发送 引导码 + 地址 + 地址取反 + 数据 + 数据取反
长按键: 隔110ms左右发一次引导凳颂码(重复),并不带任何数据(全部为高枣雹郑电平)
所以根据这个特点可以识别长按键:
程序接收一帧数据后,提取出地址和数据,然后判断
......
//有地址和数据的,为一次按键
.....
//地址肆早和数据为空的,为重复按键
if((ir_addr_code==0xffff)&&(ir_origin_data==0xff)&&(ir_data==0xff))
{
repeat=1
key= last_key
}
按下时返皮发送正常的编码,发送完毕,若按键依然按下,则发送重复码,重复码和引导码有共同的特点,就是周期短了一些(引导:13.5ms;重复:11.25ms),这个不就可以区分了吗?只要接收的码周期是13.5,即一历冲组新发送的编码肢世歼,若是11.25则是重复码,重复码时,则将之前接收到的编码作为本次接收到的编码处理即可。
坚持一个原则,授正弯神之以渔,举一反三。关于这个问题,程序匠人曾经写过一个短文叫“按键漫谈”,图文并茂,可以去百度文库里搜索一下。
如何区别“短击”和“长击”?
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应当被清零。
判断完成之后,红外编码,然后发射
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)