当前位置: 首页 > news >正文

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

看见大家发了那么多按键的处理方法,我也发一个。

刚参加工作的时候,对比学校里和同事的按键处理函数,发现总是不尽如人意,
有以下几点:

  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沟通。


http://www.mrgr.cn/news/70417.html

相关文章:

  • C++ 语言实现读写.csv文件.xls文件
  • MySQL查询某个数据库中特定表的空间占用大小
  • leetcode83. Remove Duplicates from Sorted List
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】文本Text显示
  • 深度学习:微调(Fine-tuning)详解
  • 【面试分享】xshell连接Linux服务器22端口执行命令top期间的技术细节和底层逻辑
  • 北京大学、华为公司联合发布《中国城市治理数字化转型报告(2024)》49页PDF附下载
  • 谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题
  • 【RabbitMQ】06-消费者的可靠性
  • 【前端】手写一个简单的分页器
  • 如何解决亚马逊商家IP问题:静态住宅IP的优势与选择指南
  • 1547. 切棍子的最小成本-cangjie
  • 网络、子网
  • 实验室信息管理系统源码,医院LIS系统源码,C/S结构,C#语言开发,适合上项目。
  • vxe-vxe-colgroup后端返回数据 对数据进行处理 动态合并分组表头(v-if控制表格渲染(数据请求完成后渲染))
  • ROS2在自定义服务接口中的常数调用(python)
  • c++如何绑定一个类与类内成员的关系
  • AES加密原理
  • Docker使用docker-compose一键部署nacos、Mysql、redis
  • 分段式爬虫和数据采集的有趣话题
  • c++基础30字符
  • 【前端学习笔记】JavaScript学习一【变量与数据类型】
  • 体育数据API纳米篮球数据API:网球数据接口文档API示例③
  • 多态之魂:C++中的优雅与力量
  • 位运算_常见位运算总结
  • C语言 函数