找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
123
返回列表 发新帖
楼主: 中科网
打印 上一主题 下一主题
收起左侧

分享一下十几年我一直使用的按键处理方法

  [复制链接]
81#
ID:22225 发表于 2015-8-28 23:54 | 只看该作者
谢啦              
回复

使用道具 举报

82#
ID:86928 发表于 2015-8-29 01:27 | 只看该作者
好东西  谢谢楼主的无私奉献!
回复

使用道具 举报

83#
ID:77282 发表于 2015-8-29 16:01 | 只看该作者
看过了,思路不错 顶一下
回复

使用道具 举报

84#
ID:66287 发表于 2015-8-31 08:17 | 只看该作者
方法还是很好的
回复

使用道具 举报

85#
ID:87781 发表于 2015-12-5 17:56 | 只看该作者
只是文字上简单介绍了下,没有代码的
回复

使用道具 举报

86#
ID:99905 发表于 2015-12-25 01:15 | 只看该作者
好!实践出真知!
回复

使用道具 举报

87#
ID:96326 发表于 2015-12-25 08:52 | 只看该作者

有个实例最好了,更有利于初学者。
回复

使用道具 举报

88#
ID:64089 发表于 2015-12-25 11:35 | 只看该作者
思维是非常好的,只是内容略显空洞,只是简单描述一下没有实例分析,基本上没有实用价值。
回复

使用道具 举报

89#
ID:100571 发表于 2015-12-26 10:48 | 只看该作者
谢谢楼主。
回复

使用道具 举报

90#
ID:99525 发表于 2015-12-27 14:53 | 只看该作者
学习借鉴一下
回复

使用道具 举报

91#
ID:148163 发表于 2016-11-15 23:03 | 只看该作者
看看下,谢谢楼主分享                                                                                 
回复

使用道具 举报

92#
ID:98451 发表于 2016-11-15 23:35 | 只看该作者
学习一下,谢谢楼主
回复

使用道具 举报

93#
ID:148310 发表于 2016-11-16 18:00 | 只看该作者
刚刚注册,下载不了,不知道和宋学松老师的有什么区别
回复

使用道具 举报

94#
ID:253953 发表于 2018-11-27 20:26 | 只看该作者
东西挺好的,
回复

使用道具 举报

95#
ID:381145 发表于 2024-7-14 16:50 | 只看该作者
下载,打开EXEL文件错误
回复

使用道具 举报

96#
ID:1064915 发表于 2024-7-15 14:36 | 只看该作者
nsj21n 发表于 2015-12-25 11:35
思维是非常好的,只是内容略显空洞,只是简单描述一下没有实例分析,基本上没有实用价值。

分享一下十几年我一直使用的按键处理方法
看见大家发了那么多按键的处理方法,我也发一个。
刚参加工作的时候,对比学校里和同事的按键处理函数,发现总是不尽如人意,有以下几点:
1. 消抖复杂,效率低。很多人直接在电平判断后使用delay()函数,进行消抖,耽误时间;有人在按键电平中断中消抖,导致其他的中断,比如串口、定时等反应很慢,不适合做实时系统;
2. 特殊功能按键的处理麻烦。使用简单电平判断的按键扫描,在需要长按响应、复合按键响应、复合按键长按响应的时候,需要增加很多的标志位,反复使用if..else判断,有时候把自个都搞乱了。
3. 不便于移植和修改。使用以上两点编写的函数,如果用在直接端口按键上的,那么在行列扫描按键的时候,就很难适应。导致每个项目都要更改一次。

想了很久之后,我结合PC的键盘处理方法,编写了自己的按键函数,经过几次修改,定了下来。这十几年来,一直在用,方便移植,而且比较清晰。
——至少我自己这么觉得。

它有以下几个特点:
1. 按键扫描和取值分开。
    在中断中(一般10ms),反复调用keyScan()进行按键扫描(包括消抖)。
    消抖之后的按键值不返回,作为消息放到全局变量中;
    在需要判断的地方使用getKeyValue()获取当前的键值,进行处理。

2. 每一个按键,都有单独的标志位和计时变量。
    消抖计时:
    如果按键按下,每调用一次10ms中断,gucKeyOkTimer增加;
    gucKeyOkTimer超过消抖的阀值(我一般10次,即100ms),则确认有按键了。
    任何一次扫描到按键没有按下,gucKeyOkTimer清空;

    标志位:
    如果一直按着(通过按键电平判断),会有gfOkPressing;
    如果按下过一次,需要响应,会有gfOkNeedAck;

复合按键的响应:
因为每个按键,包括复合按键都有自己的标志位和计时变量,可以跟物理按键的处理方法相同。只是消抖的条件,不是电平的判断,而是物理按键的pressing标志。
3. 我没有使用怪癖诡异的编程方法。有很多取巧的方法可使实现按键的扫描,甚至有人写了三行代码就实现消抖。——我个人不喜欢这样的程序风格。我喜欢思路清晰的编程方法,易于维护和移植。当然代价就是多了一些ROM和RAM占用,但我觉得时间和代码的质量更重要。
如果你跟我的思路相同,也遇见过这样的困惑,可以考虑我的按键扫描方法

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

97#
ID:41347 发表于 2024-7-15 16:11 | 只看该作者
想知道运用的例程
回复

使用道具 举报

98#
ID:1129414 发表于 2024-7-22 15:16 | 只看该作者
牛皮,十几年的经验
回复

使用道具 举报

99#
ID:21455 发表于 2024-7-30 10:57 | 只看该作者
没有源码?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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