现在看,按键检测,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方式也支持,因为外部提供扫描码. 已经把什么长按键短按键处理都标准化了. |
文章评论(0条评论)
登录后参与讨论