单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 26246|回复: 237
收起左侧

[分享]分享一下我用了十几年的按键扫描方法

  [复制链接]
铭为科技 发表于 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

1.23 KB, 下载次数: 1321

按键处理

评分

参与人数 11黑币 +79 收起 理由
zzffw + 5 很给力!
荒谬的真理 + 5 绝世好帖!
zxc562 + 5 共享资料的黑币奖励!
wangjunwu1995 + 5 22223
sunlei058378 + 15
archerelf + 2 很给力!
init() + 5 很给力!
一毛零logo + 5 说的很吸引人,感觉应该不错
absflash + 15 很给力!
YJGG + 12 赞一个!
遥远716 + 5 很给力!

查看全部评分

回复

使用道具 举报

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 | 显示全部楼层
感谢楼主分享,学习了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表