打印

聊聊AD按键扫描(原创)---欢迎各位来聊,

[复制链接]
9719|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
walnutcy|  楼主 | 2007-9-4 22:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
见过好多按键扫描,全是SWITCH结构,看得头大,

后来花时间做了一种矩阵式按键扫描,,

这里讲讲算法,不添加代码,是为了让各位朋友自己动手,体验一把,

当然希望朋友们能有更好的算法提出,这里仅起一个抛砖引一玉的作用,

:定时采样,将按键分为7种状态:
无键按下/按键按下/短按/长按/长按连发/长按抬起,

处用多次采样计数来区别各个状态,

然后做一个矩阵表,以按键电压和按键状态为两轴,

根据按键状态发消息到消息队列即可.

当然在发到消息队列前也可根据当前系统状态转换消息,,


这种按键的优缺点在于:

代码紧凑,容易理解,维护简单,

但发出的消息与系统当前任务无关,只能靠发消息前转换得到,

偶曾用此办法实现好几款机的按键,,效果不错,

相关帖子

沙发
huangqi412| | 2007-9-4 23:20 | 只看该作者

学习了,没见过。

使用特权

评论回复
板凳
ayb_ice| | 2007-9-5 07:35 | 只看该作者

你这和AD扫键有什么关系吗...

使用特权

评论回复
地板
xwj| | 2007-9-5 08:14 | 只看该作者

是啊,文不对题啊

使用特权

评论回复
5
computer00| | 2007-9-5 08:33 | 只看该作者

这个键盘扫描部分在我的ARM 00 OS里面就有现成的源代码拉

使用特权

评论回复
6
walnutcy|  楼主 | 2007-9-5 08:51 | 只看该作者

回3楼,5楼

3楼: 你这和AD扫键有什么关系吗...

回:
  比如有两排按键,每排10个按键,就可以做一个10*6的矩阵存储要发送的消息,
然后根据多次扫描得到的按键状态查表发消息,,

呵呵,,

5楼: 这个键盘扫描部分在我的ARM 00 OS里面就有现成的源代码拉

圈圈的这份代码没看过,呵呵,,有空去欣赏一下,谢过先...

使用特权

评论回复
7
gyt| | 2007-9-5 10:49 | 只看该作者

看了6楼的回答

还是没有回答3楼的问题啊

使用特权

评论回复
8
walnutcy|  楼主 | 2007-9-5 21:23 | 只看该作者

回6楼..呵呵,,

7楼: 看了6楼的回答 

还是没有回答3楼的问题啊
 
 
////////////////////////////////////////////////////////////

这个见第一帖:


然后做一个矩阵表,以按键电压和按键状态为两轴,........
.............


再说说吧,
比如30ms定时采样AD口,,得到AD电压,然后通过硬件参数转换得到在当前AD口对应的第几个按键,多次采样用来判断状态,,进行状态转换,是否按下,抬起,长按等等.


比如我的判断条件是:连检到两次(AD电压在某一个按键电压附近)表示按下,1秒内(即33次)AD电压变动,则认为抬起,发短按消息,
依次类推,时间可以自己设定...

按键检测时还可以加上去抖效果,,就像按键按下时是检两次以确让按下一样,去掉用户按下或抬起时引起的按键电压不稳....

 
////////////////////////////////////////////////////////////

使用特权

评论回复
9
gyt| | 2007-9-6 10:40 | 只看该作者

楼主没有明白3楼的问题

3楼的意思是说,这样做法和AD没什么关系。

用普通的键,也是一样的做法。

使用特权

评论回复
10
ayb_ice| | 2007-9-6 11:09 | 只看该作者

9L正解...

使用特权

评论回复
11
saystar| | 2007-9-6 16:48 | 只看该作者

re

AD scan key 很大程度上要依赖硬件环境,我做过一款同样是AD scankey 以PWM输出给电阻电容组成的网络(其实很简单的电路而已),然后AD电压得知key value.主要目的是节约IO资源(2/3个IO可以检测**个key,理论上还可以扩展)而不是LZ的为算法.至于算法,纯粹是个人爱好,Switch结构性好可读性强,对于复杂的按键逻辑来说是有好处的,至少后面人看程序要清晰很多.当然,消息队列(对OS系统)或者查表法(对简单逻辑)也可以,在算法上来说各有所长.

使用特权

评论回复
12
walnutcy|  楼主 | 2007-9-6 17:49 | 只看该作者

谢谢,学习了。呵呵

使用特权

评论回复
13
古道热肠| | 2007-9-7 11:43 | 只看该作者

有点多任务的味道

  用定时器触发检测,类似于ucOSII中的任务,再用消息机制,便于挖崛出CPU的潜能。

使用特权

评论回复
14
walnutcy|  楼主 | 2007-9-8 12:09 | 只看该作者

呵呵,用8位机做汽车音响MCU,带有RADIO+DVD+CDC,

不过没用uCOS-II,没有那么多资源,
是祼奔的,呵呵,

借鉴了多任务的思想.

使用特权

评论回复
15
ayb_ice| | 2007-9-8 13:08 | 只看该作者

UCOS-II没有什么用...

使用特权

评论回复
16
sodwell| | 2007-9-8 21:18 | 只看该作者

re

不要什么都用uc/os  !一般来说,那玩意实际意思不大,当然也肯定有用它的产品

使用特权

评论回复
17
walnutcy|  楼主 | 2007-9-12 22:19 | 只看该作者

见过一韩国人的方案:用来做CD解码、MP3解码

使用特权

评论回复
18
农民讲习所| | 2007-9-13 07:15 | 只看该作者

俺哪个通用教材的通用按键程序支持任意的取键值方式

AD方式也支持,因为外部提供扫描码.

已经把什么长按键短按键处理都标准化了.

使用特权

评论回复
19
glf| | 2009-8-17 09:10 | 只看该作者
AD的组合不好做

使用特权

评论回复
20
戒指320| | 2009-8-19 22:57 | 只看该作者
没见过,学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

1443

帖子

5

粉丝