旧集问题(2):按键检测
0赞
现在看,按键检测,AD或IO,流程一样。
新闻出处:21ic 发布时间: 2007-09-13
walnutcy 发布于 2007-9-4 22:10:00
见过好多按键扫描,全是SWITCH结构,看得头大,
后来花时间做了一种矩阵式按键扫描,
这里讲讲算法,不添加代码,是为了让各位朋友自己动手,体验一把,
当然希望朋友们能有更好的算法提出,这里仅起一个抛砖引一玉的作用,
:定时采样,将按键分为7种状态:
无键按下/按键按下/短按/长按/长按连发/长按抬起,
处用多次采样计数来区别各个状态,
然后做一个矩阵表,以按键电压和按键状态为两轴,
根据按键状态发消息到消息队列即可.
当然在发到消息队列前也可根据当前系统状态转换消息,,
这种按键的优缺点在于:
代码紧凑,容易理解,维护简单,
但发出的消息与系统当前任务无关,只能靠发消息前转换得到,
偶曾用此办法实现好几款机的按键,,效果不错,
walnutcy 发布于 2007-9-5 8:51:00
3楼: 你这和AD扫键有什么关系吗...
回:
比如有两排按键,每排10个按键,就可以做一个10*6的矩阵存储要发送的消息,
然后根据多次扫描得到的按键状态查表发消息,,
呵呵,,
5楼: 这个键盘扫描部分在我的ARM 00 OS里面就有现成的源代码拉
圈圈的这份代码没看过,呵呵,,有空去欣赏一下,谢过先...
gyt 发布于 2007-9-5 10:49:00
还是没有回答3楼的问题啊
walnutcy 发布于 2007-9-5 21:23:00
7楼: 看了6楼的回答
还是没有回答3楼的问题啊
////////////////////////////////////////////////////////////
这个见第一帖:
然后做一个矩阵表,以按键电压和按键状态为两轴,........
.............
再说说吧,
比如30ms定时采样AD口,,得到AD电压,然后通过硬件参数转换得到在当前AD口对应的第几个按键,多次采样用来判断状态,,进行状态转换,是否按下,抬起,长按等等.
比如我的判断条件是:连检到两次(AD电压在某一个按键电压附近)表示按下,1秒内(即33次)AD电压变动,则认为抬起,发短按消息,
依次类推,时间可以自己设定...
按键检测时还可以加上去抖效果,,就像按键按下时是检两次以确让按下一样,去掉用户按下或抬起时引起的按键电压不稳....
////////////////////////////////////////////////////////////
gyt 发布于 2007-9-6 10:40:00
3楼的意思是说,这样做法和AD没什么关系。
用普通的键,也是一样的做法。
saystar 发布于 2007-9-6 16:48:00
AD scan key 很大程度上要依赖硬件环境,我做过一款同样是AD scankey 以PWM输出给电阻电容组成的网络(其实很简单的电路而已),然后AD电压得知key value.主要目的是节约IO资源(2/3个IO可以检测八九个key,理论上还可以扩展)而不是LZ的为算法.至于算法,纯粹是个人爱好,Switch结构性好可读性强,对于复杂的按键逻辑来说是有好处的,至少后面人看程序要清晰很多.当然,消息队列(对OS系统)或者查表法(对简单逻辑)也可以,在算法上来说各有所长.
古道热肠 发布于 2007-9-7 11:43:00
用定时器触发检测,类似于ucOSII中的任务,再用消息机制,便于挖崛出CPU的潜能。
walnutcy 发布于 2007-9-8 12:09:00
不过没用uCOS-II,没有那么多资源,
是祼奔的,呵呵,
借鉴了多任务的思想.
sodwell 发布于 2007-9-8 21:18:00
不要什么都用uc/os !一般来说,那玩意实际意思不大,当然也肯定有用它的产品
农民讲习所 发布于 2007-9-13 7:15:00
AD方式也支持,因为外部提供扫描码.
已经把什么长按键短按键处理都标准化了.