STM32按键检测之短按与长按方法

在电路设计中,我们经常需要读取外部的电平信号。比如,在项目中,我们需要通过按键来输入一些数据,那么就需要检测按键是否被按下。电平分为高电平读取和低电平读取,读取高电平,需要设置io为下拉电阻输入模式,反之,设置io为上拉电阻输入模式。
s4按下时,单片机io为高电平,s1-s3按下时,为低电平。我们设置s1为上拉输入模式,s4为下拉输入模式。本节使用按键实现2个功能:
s1短按一次,led2点亮,s1再短按一次,led2熄灭。s1长按,led1点亮,s1再长按,led1熄灭。这种方式可以用来实现短按调节菜单,长按保存参数。
s4短按一次,led4点亮,s4再短按一次,led4熄灭。s4长按且不松手,led4闪烁。这种方式可以用来实现短按调节数字,长按快速调节数字。在下一节,我们讲解数码管数字显示时,再来实现数字慢调和快调这个功能。下图是程序的大概流程思路以及框架:
关于io输入输出初始化,上一节讲过如何配置。这里按键设置上拉输入和下拉输入,led设置推挽低速输出。一般来说,我们会把应用代码写在单独的一个文件里,比如按键检测就是key.c,然后其他文件用到的函数和宏定义,可以直接写在对应的头文件里key.h。在哪个文件里使用,就在该文件里include头文件即可。每个外设电路都由一组c文件和h文件组成,一般来说,在复杂的项目中,在user.c文件里调用外设函数编写用户程序,在主函数里调用用户函数即可。下图就是一个按键的头文件。
下图列出了一些按键检测的核心代码,key.c部分代码:
scankey()函数中的if语句是用来判断键值是否变化的,如果键值变化,则执行按键处理函数keydeal();
按键键值读取的思路:while语句每循环一次所需时间是已知的,假设是100us,按键在被按下的过程中,io的电平是剧烈变化的,只有完全按下时,io的电平才会稳定。因此,当检测到低电平时,开始计数,每100us检测一次,假设检测了100次都是低电平,那么就可以确定按键真的被按下了。这里千万别采用长延时,防止程序被堵塞,一直空等待。
有的人是这样设计的,当检测到低电平时,就开始延迟100ms,然后再次检测到低电平,就认为按键被按下一次。这种方式是不合理的,在这100ms延时期间,cpu什么也没干,一直在那空运行,以至于其他程序无法被执行。而我们现在采用的策略是,while循环体里一般会有一些程序要被执行,这些程序执行是需要花时间的,那么循环一次花的时间,乘以循环次数,就可以达到延迟的目的。这样做,既可以延迟,也不影响其他程序执行。下面列出一些按键检测的核心代码。
关于长按,短按,是根据不同的循环次数来区分的。当达到长循环次数时,就认为长按,在键值上加上长按标志。如果松手后,循环次数没有达到长按次数,就认为是短按。如果检测到长按,就在长按执行代码里,设置另一个变量,每循环几次就执行数字递增或者递减。这就是长按快速计数的原理。
如果长按用来实现数据保存,那么,就直接在长按执行代码里设置保存标志位或者直接保存数据。这里key4按键长按led闪烁是在按键检测函数里直接执行的,而短按是在键值处理函数里执行的。之所以这么做,是因为按键长按不松手,键值一直不变,按键处理函数只会被执行一次,请看前文的scankey函数。key1长按,短按都是在键值处理函数里执行的。
在按键处理函数中,首先分离出长按标志位,然后根据键值去匹配是哪个按键被按下。在键值处理代码段里,根据长按标志位来判断执行短按操作还是长按操作。

EtherCAT运动控制器在数控加工手轮随动中的应用
氮化镓是什么充电器类型
语音识别芯片的基本原理和工作流程
openharmony是什么
高速光纤能连接智慧工厂吗?
STM32按键检测之短按与长按方法
什么是TMR传感器?TMR的输出响应与GMR和AMR的比较
一加120Hz刷新率屏幕确认研发完成,有更多新突破
禁止尺寸超手机电子产品乘客登机,美国又搞什么鬼?
波士顿动力公司研制的一款名为 “Spot Mini” 的四足机器人
工控机的组成 工控机的主要类别有哪些
现阶段的区块链现状是怎样的
盛大手机硬性植入 智能市场体现摩尔定律
IHS Markit5G研究表示:82%运营商大力展开5G技术试验,12%将在年底前推出商用5G服务
关于数据存储计划简述与构建和部署及其好处
锂电材料煅烧技术获得新突破,陶瓷内胆回转窑优势显著
通过分析失效器件来推断失效环境
5G开启运营商人才培训的又一轮高潮
人工智能怎样让会议变得多彩
生态积累并非一蹴可几,高通选择稳健循序渐进