|
发表于 2010-6-18 11:39:46
|
显示全部楼层
我也说说我对按键处理吧...
我的按键程序大概有三部分组成:
按键扫描, 按键状态分析, 按键功能处理
我把按键分为三种处理:
1.每按一次都起作用的按键(按着不放,我也不理会它,但是也不会造成程序的死等)
2.长按有效的按键(就是按着超过了2~3秒才有效的按键,就像手机的关机/开机按键,同样继续按着不放,我也不理会它,但是也不会造成程序的死等)
3.长按连续有效的按键(就是按着超过了0.5~1秒,这个按键就连续起作用,相当于用比较快的速度去按这个按键,就像电视遥控器上的音量按键)
按键的扫描只是为了得到按键码...得到正确的按键码方法比较简单...其实使用第一种扫描的方法,我觉得也没有什么不妥的地方,关键是,你怎么去调用这个扫描的程序,加入去抖动 和避免程序的死等(只有小1MS的延时我会用死循环去做,其它的定时,延时,都是通过系统时钟得到的,所以程序觉得不会有死等的东西出现).
对整个按键的处理程序,我的重点基本上是放在按键状态的分析.按键扫描程序是定时的去得到一个按键号,而得到的这个按键号,也不是每次扫描得到了就发出来的...主要是参考红外线遥控器,100~150MS才把这个码发出来,给按键状态分析程序用.(同样的方法,对得到的遥控码或者是其它按键芯片给过来的按键号,也是这样处理的.)
按键状态分析程序 是对得到的按键号进行分析,然后设立两个旗标:新的按键码旗标,相同的按键码旗标,
如果得到的是新按键码,而且按按键是允许短按一次就可以起作用的,(这个可以根据实际需要考虑是否等到按键释放了才起作用的.)转化成按键功能处理程序需要的格式的按键功能码.
如果得到的是相同的按键码,就要区别:
这个按键是不是要常按才起作用的,如果是的,设立一个定时变量(注意这个定时变量不是死等的,并且如果得到的按键码不同了,这个变量也就会失效了),只要时间够了,就可以给出 按键功能码了,并且同时给一个常按的按键旗标...
如果按键是连续按着的也起作用的话(就像一些参数调整的ADD+,DEC-按键,按着不放就连续加减),这时用到两个定时变量,一个是判断按键按下是否超过了连续增减的时间,一般我是做500MS~1S,另一个是,过了这个时间,就按一定的时间(另一个变量,一般我是设在50MS~200MS间,就看对参数调节要求的快慢了.)把 按键功能码 发给按键功能处理程序.并且同时给出一个连续按键的旗标.
接下来就是:按键功能码处理程序了...这个就不多说了...该干什么就干什么去....
另外:我比较反感:有些人自己能悟到了一些东西,想明白了一些事情,就认为很了不起,去鄙视和辱骂其它一时没有把事情弄明白的人. |
|