|
楼主 |
发表于 2013-11-23 12:21:29
|
显示全部楼层
xyz2008 发表于 2013-11-23 10:39
在下太笨,还是没想通,怎么判断是不是长按键,按下,楼主给的例子,似乎只是一个短按的例子 ...
呵呵,在详细说一下长按和短按的思路:
1,从键值上是无法区分长按和短按的,所以给出的例子中是可以同时测试到长按,短按的(当然shift键也能测试到,因为shift键的键值不一样)
2, 长短键是在KeyScan()中已经判定了,短按键就向buf发一个按键值,长按键就定期向buf中发送按键值(按键值和短按键的一样),所以我前面强调了长按键=N个短按键.
3,再说一下长按键在KeyScan()中的判定思路:
a,KeyScan()先判定io的状态一直处于不变,且都是有效按下(IO状态有高电平的),这时开始计时按键的时间
b,如果这个按键按下足够长的时间后,将其判定为长按键,然后继续累计时间,每达到发送间隔,则发送一个键值到buf中.
c,按键释放后,将所有长按键相关的变量恢复成初始状态,等待下一次按键的出现.
4,在说一下长按键的一些其他问题:
a,短按键优先级高于长按键,即如果你长按a,然后同时短按b,则不断相应b,a被挂起,直到没有其他按键的变化.
b,支持多个按键的同时长按,因为都是并发处理的,所以多个按键和一个按键是没啥区别,唯一的不同是,触发时间只一个,所以多个按键的变化导致触发时间不断被重置,所以多个长按键同时按,以最后一个的按下开始计时,只有一个触发计时的设计也导致了长按键的优先级比短按键的低
c,程序中没有区分长按和短按,所以但长按释放时会多触发了一个短按,由于实际长按的时候,产生多少个长按的键值码并不是太重要,所以这里我没有去处理这个'bug'
d,由于长按键只是循环发送键值码到buf中,所以这个驱动不支持长按出第二功能的方式,所以我另外提供了shift键,来提供转意按键的输出. |
|