标题:
[分享]分享一下我用了十几年的按键扫描方法
[打印本页]
作者:
铭为科技
时间:
2013-7-22 11:43
标题:
[分享]分享一下我用了十几年的按键扫描方法
看见大家发了那么多按键的处理方法,我也发一个。
刚参加工作的时候,对比学校里和同事的按键处理函数,发现总是不尽如人意,
有以下几点:
1. 消抖复杂,效率低。很多人直接在电平判断后使用delay()函数,进行消抖,
耽误时间;有人在按键电平中断中消抖,导致其他的中断,比如串口、定时等
反应很慢,不适合做实时系统;
2. 特殊功能按键的处理麻烦。使用简单电平判断的按键扫描,在需要长按响应、
复合按键响应、复合按键长按响应的时候,需要增加很多的标志位,反复使用
if..else判断,有时候把自个都搞乱了。
3. 不便于移植和修改。使用以上两点编写的函数,如果用在直接端口按键上的,
那么在行列扫描按键的时候,就很难适应。导致每个项目都要更改一次。
想了很久之后,我结合PC的键盘处理方法,编写了自己的按键函数,经过几次修改,
定了下来。这十几年来,一直在用,方便移植,而且比较清晰。
——至少我自己这么觉得。
它有以下几个特点:
1. 按键扫描和取值分开。
在中断中(一般10ms),反复调用keyScan()进行按键扫描(包括消抖)。
消抖之后的按键值不返回,作为消息放到全局变量中;
在需要判断的地方使用getKeyValue()获取当前的键值,进行处理。
2. 每一个按键,都有单独的标志位和计时变量。
消抖计时:
如果按键按下,每调用一次10ms中断,gucKeyOkTimer增加;
gucKeyOkTimer超过消抖的阀值(我一般10次,即100ms),则确认有按键了。
任何一次扫描到按键没有按下,gucKeyOkTimer清空;
标志位:
如果一直按着(通过按键电平判断),会有gfOkPressing;
如果按下过一次,需要响应,会有gfOkNeedAck;
复合按键的响应:
因为每个按键,包括复合按键都有自己的标志位和计时变量,可以跟物理按键的
处理方法相同。只是消抖的条件,不是电平的判断,而是物理按键的pressing标志。
3. 我没有使用怪癖诡异的编程方法。有很多取巧的方法可使实现按键的扫描,甚至有
人写了三行代码就实现消抖。——我个人不喜欢这样的程序风格。我喜欢思路清晰的编程方法,
易于维护和移植。当然代价就是多了一些ROM和RAM占用,但我觉得时间和代码的质量更重要。
如果你跟我的思路相同,也遇见过这样的困惑,可以考虑我的按键扫描方法。
我摘录了与按键相关的部分,如果有疑问,欢迎通过邮件或QQ沟通。
key.rar
2013-7-22 11:43 上传
点击文件名下载附件
1.23 KB, 下载次数: 1696
按键处理
作者:
dyun1988
时间:
2014-5-17 21:44
感谢楼主分享!!!!!!!!!!!!!!!!
作者:
jcygh
时间:
2014-5-27 22:32
好好学习,天天进步
作者:
daobatu
时间:
2014-5-31 03:26
。进来学习下
作者:
ekun2006
时间:
2014-6-14 18:23
难得的精神
作者:
001art
时间:
2014-7-3 11:20
高手啊!!!!
作者:
286458071
时间:
2014-7-3 16:30
好东西!!!!
作者:
云不肯说
时间:
2014-7-7 13:19
看看高级的程序
作者:
li8o
时间:
2014-7-8 10:14
高手啊!!!!
作者:
sunnyjn
时间:
2014-7-12 07:18
谢谢楼主分享!!!
作者:
407374914
时间:
2014-7-12 17:51
谢谢楼主分享
作者:
liumin_txgt
时间:
2014-7-12 22:28
谢谢分享
作者:
radiance
时间:
2014-7-14 17:30
好东东。谢谢分享
作者:
袁洁栋
时间:
2014-7-21 22:21
高手啊
作者:
shuangxi
时间:
2014-7-24 13:49
好东东。谢谢分享
作者:
Getty
时间:
2014-7-24 15:47
谢谢楼主啦!!分享很好
作者:
visvi
时间:
2014-7-31 10:48
感觉很给力,谢谢分享
作者:
DDY_yu
时间:
2014-8-1 16:45
谢谢谢!!
作者:
zhwyf
时间:
2014-8-18 23:15
感谢楼主分享
作者:
huangjilin
时间:
2014-8-20 12:40
感谢楼主分享
作者:
wwic
时间:
2014-8-20 17:30
看看是什么啊!~
作者:
happy_coding
时间:
2014-8-21 10:05
谢谢分享
作者:
937166474
时间:
2014-9-1 22:01
新人回一帖,不知所云
作者:
导数题
时间:
2014-9-2 10:24
谢谢分享
作者:
boss654321
时间:
2014-9-2 19:57
这个东东绝对值得一看。
作者:
1004169134
时间:
2014-9-3 20:16
真不错诶!我也一直想解决程序里的冲突,可没耐心去细细思索,看了此文豁然开朗啊!太感谢楼主了
作者:
yc21
时间:
2014-9-7 09:37
好好学习,天天进步
作者:
yzmmdy
时间:
2014-9-10 20:42
谢谢楼主的资料,真是好
作者:
yongxiang6091
时间:
2014-9-10 20:46
谢谢楼主分享!!
作者:
yzmmdy
时间:
2014-9-11 08:25
好资料,值得学习,谢了
作者:
雪落有声
时间:
2014-9-11 08:51
好东东哦,感谢楼主
作者:
nyzjs
时间:
2014-9-11 09:29
感谢楼主分享!!!!!!!!!!!!!!!!
作者:
dajin1234
时间:
2014-9-11 16:34
谢谢分享。。。。。。。。
作者:
周安松
时间:
2014-9-13 04:42
谢谢分享!!
作者:
heam
时间:
2014-9-15 10:53
谢谢分享
作者:
wmt333
时间:
2014-10-12 14:09
谢谢分享!!!!
作者:
xi.min
时间:
2014-10-13 00:40
感谢..............
作者:
T29
时间:
2014-10-16 00:48
感谢楼主 .... 学习了
作者:
T29
时间:
2014-10-16 00:52
状态机识别
作者:
zsshd
时间:
2014-10-16 06:04
感谢楼主分享,学习了!
作者:
huahuasousou
时间:
2014-10-24 12:35
感谢分享!
作者:
2577070273
时间:
2015-2-13 20:19
谢谢分享,学习了
作者:
lilogo
时间:
2015-4-27 10:25
谢谢分享。。。。
作者:
逸铭电子
时间:
2015-4-27 23:07
我也来看看。
作者:
独之雪
时间:
2015-4-27 23:30
貌似不错的样子。。。
作者:
AOdongq1n
时间:
2015-4-27 23:36
进来学习学习
作者:
lb688
时间:
2015-4-28 10:45
学习了。。。
作者:
SengChuary
时间:
2015-4-29 22:32
不错,支持楼主!!
作者:
913059794
时间:
2015-5-7 15:08
好东西
作者:
kmtbm
时间:
2015-6-28 17:44
感谢楼主的无私奉献,让大家共同使用
作者:
kmtbm
时间:
2015-6-28 18:23
直到现在还不能下载,是不是分不够
作者:
wthdyfg2004
时间:
2015-6-30 12:58
很好的程序
作者:
海阔天空2015
时间:
2015-7-2 18:08
资料分享才能有所得,谢谢楼主的资料
作者:
hurbo
时间:
2016-2-1 11:39
谢谢分享,学习高手的按键程序
作者:
hjmnyz
时间:
2016-3-13 21:19
感谢楼主分享
作者:
brightsm
时间:
2016-3-16 00:27
学习一下。
作者:
delie
时间:
2016-4-19 14:31
谢谢分享
作者:
xiancv1
时间:
2016-4-25 16:18
谢谢楼主分享
作者:
whengfu
时间:
2016-4-28 09:36
好多书本上没有的,具有很大实用价值
作者:
hhdsdy
时间:
2016-4-28 09:52
感谢楼主的分享
作者:
zmhulu
时间:
2016-5-7 10:58
谢谢分享。学习下
作者:
841812960
时间:
2016-5-11 12:30
感谢楼主分享
作者:
lyseg01
时间:
2016-6-13 18:43
感谢楼主分享!!!
作者:
WFX777888
时间:
2016-6-14 05:10
谢谢分享资料
作者:
lidong128
时间:
2016-6-14 08:23
感谢楼主分享
作者:
dtdzlujian
时间:
2016-6-15 11:51
huangjilin 发表于 2014-8-20 12:40
感谢楼主分享
谢谢Lz分享,学习了!
作者:
未来的技术女
时间:
2016-6-28 23:25
已经收集不少按键扫描的程序了,等过几天我也来发一发...
作者:
779613083
时间:
2016-6-29 13:44
感谢!!!!
作者:
daihouzhao
时间:
2016-7-21 09:59
谢谢分享!
作者:
小分子
时间:
2016-7-31 23:40
没有看明白
作者:
jubaolun
时间:
2016-8-1 08:37
谢谢楼主分享.学习了.
作者:
wszyg621
时间:
2016-8-1 10:35
好东西,谢谢分享!
作者:
ghostry
时间:
2016-8-1 17:24
感谢分享,学习一下。
作者:
uaeng
时间:
2016-8-2 22:45
感谢楼主分享!!!!!!
作者:
liu712777
时间:
2016-8-13 19:10
haoaodsads
作者:
liu712777
时间:
2016-8-13 19:10
fgdfgf fgfgf
作者:
liu712777
时间:
2016-8-13 19:14
bddfggfgfgfgfg
作者:
谢幕芳华
时间:
2016-8-14 10:18
谢谢楼主的分享,让我又学会另外一种按键扫描处理
作者:
谢幕芳华
时间:
2016-8-14 10:19
谢谢楼主的分享,又让涨知识了
作者:
lion21cn
时间:
2016-8-15 14:43
谢谢分享
作者:
kkfy888
时间:
2016-8-16 01:57
谢谢分享!!!
作者:
7547163
时间:
2016-8-19 19:43
谢谢分享呀
作者:
qaz3
时间:
2016-8-23 09:40
几个环节的活动和规范化的复活点发货后
作者:
转岗
时间:
2016-8-23 17:25
感谢楼主分享,
作者:
intersetings
时间:
2016-8-23 22:42
谢谢分享,好帖
作者:
xtgdsk
时间:
2016-10-29 14:44
感谢楼主 .... 学习了
作者:
westlife96
时间:
2016-10-29 23:03
曾经用过类似的方法。后来看到一篇关于时间片轮换法的结构文章描述之后,发现之前的那些问题都可以通过类似的方法解决。
作者:
123456kkj
时间:
2016-11-10 09:28
感谢楼主分享!!!!
作者:
周琪宝宝
时间:
2016-11-12 19:53
谢谢分享
作者:
yaohw2427
时间:
2016-11-13 23:48
卡在了数码管显示,,,啊,多么痛
作者:
心如刀割
时间:
2016-11-14 15:03
好经验
作者:
孟菲0307
时间:
2016-11-14 15:56
谢谢分享
作者:
xht9951
时间:
2016-11-18 11:52
木有HB,下载不了
。看不到 啊要! 本人还是比较喜欢宋学松老师的按键消抖的算法。
作者:
lhshengshi
时间:
2016-12-1 15:34
看看高级的程序
作者:
jcygh
时间:
2016-12-3 15:07
很给力!
赞一个!
作者:
xilegan
时间:
2016-12-13 19:50
谢谢楼主的分享!
作者:
lhuijiang
时间:
2016-12-13 20:22
稳定第一。
作者:
qqjmk15263
时间:
2017-1-3 15:05
一直没找到好的按键扫描方法,先看看楼主的
作者:
东方既白
时间:
2017-2-2 09:58
希望学习下
作者:
lyseg
时间:
2017-2-3 12:35
谢谢楼主分享!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1