如何在STM32嵌入式开发中优雅地处理按键(单击、双击、长按)?

原创 美男子玩编程 2025-02-10 08:00

点击上方蓝色字体,关注我们


要优雅地处理按键的单击、双击和长按事件,关键在于:

  • 使用去抖动技术,确保每次按键状态的变化都可靠。

  • 通过定时器或者系统时钟来判断按键按下的持续时间和时间间隔。

  • 使用状态机或者标志位来处理不同的按键事件,确保按键事件的识别不被误触发。


为了避免过度复杂化,务必保持代码清晰易读,适当的时间阈值和状态切换逻辑非常重要。


通过这些方法,我们能够有效而优雅地处理按键事件,提升用户交互体验。


下面从硬件和软件两个层面给出详细的解决方案:



1


按键去抖动

按键在物理层面上具有机械抖动特性,即按下或松开时会产生多次的电平波动,导致微控制器读取到多个错误的状态变化。


解决方案通常有两种:


1.1 软件去抖动

通过延时去抖动是最简单的方式,即在检测到按键状态变化时,等待一个小的时间间隔,再读取按键状态。


常用的做法是:设置一个去抖动的时间窗口(比如20-50ms),在按键状态变化时,程序等待一段时间后再读取按键状态。


比如,假设按键按下时,判断是否按键稳定,并防止过早检测到重复变化。


示例代码:


#define DEBOUNCE_TIME 50  // 去抖动时间(单位:ms)
volatile uint32_t lastDebounceTime = 0;uint8_t lastButtonState = 0;
void ButtonHandler(void) { uint8_t currentButtonState = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); if (currentButtonState != lastButtonState) { lastDebounceTime = HAL_GetTick(); }
if ((HAL_GetTick() - lastDebounceTime) > DEBOUNCE_TIME) { if (currentButtonState != lastButtonState) { lastButtonState = currentButtonState; if (currentButtonState == GPIO_PIN_SET) { // 处理按键按下逻辑 } else { // 处理按键松开逻辑 } } }}

1.2 硬件去抖动

硬件去抖动可以通过RC滤波器(电阻和电容)来实现,使用硬件设计的方式来滤除按键抖动信号,这种方法可以减少CPU负担。


2


按键事件处理

一旦解决了去抖动问题,接下来就是根据不同的按键模式(单击、双击、长按)来识别和响应按键事件。


我们可以通过计时器和状态机来实现。


2.1 单击检测

单击是指按键被快速按下和松开。为了检测单击,通常我们通过检测按键按下事件,并在一定的时间内等待松开。


如果按键按下和松开之间的时间小于某个阈值,我们认为是单击。


2.2 双击检测

双击是指按键被连续点击两次,通常要求两次按下和松开之间的时间小于某个阈值,且两次按下事件之间的时间间隔小于一定时间。


2.3 长按检测

长按是指按键保持按下超过某个阈值,通常用定时器来检测按下时间。


2.4 设计思路

我们通过一个简单的状态机来控制不同的按键模式,结合定时器来实现按键的时序逻辑。


主要流程如下:

  • 使用一个定时器(如HAL定时器)来记录按键按下和松开的时间。

  • 设定超时时间来区分不同类型的按键事件。

  • 使用状态机或标志位来判断是单击、双击还是长按。


按键事件管理流程:按下按键时,记录当前时间(按下时间戳)。


松开按键时,计算按下与松开的时间差:

  • 如果时间差小于某个阈值(例如500ms),则是单击事件。

  • 如果按下与松开之间的时间差小于双击阈值(例如300ms),则判定为双击。

  • 如果按下时间超过某个阈值(例如1500ms),则判定为长按。


双击检测需要检查两个按下事件之间的时间间隔是否小于一个设定的时间(例如300ms)。


示例代码设计:


#define SINGLE_CLICK_TIME    300  // 单击最大时间间隔(ms)#define DOUBLE_CLICK_TIME    600  // 双击最大时间间隔(ms)#define LONG_PRESS_TIME      1500 // 长按时间(ms)
typedef enum { BUTTON_IDLE, BUTTON_PRESSED, BUTTON_RELEASED, BUTTON_DOUBLE_CLICK_WAIT} ButtonState;
volatile ButtonState buttonState = BUTTON_IDLE;volatile uint32_t buttonPressTime = 0;volatile uint32_t buttonReleaseTime = 0;
void ButtonHandler(void) { uint8_t currentButtonState = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
switch (buttonState) { case BUTTON_IDLE: if (currentButtonState == GPIO_PIN_RESET) { // 按键按下 buttonPressTime = HAL_GetTick(); buttonState = BUTTON_PRESSED; } break;
case BUTTON_PRESSED: if (currentButtonState == GPIO_PIN_SET) { // 按键松开 buttonReleaseTime = HAL_GetTick(); uint32_t pressDuration = buttonReleaseTime - buttonPressTime;
if (pressDuration < SINGLE_CLICK_TIME) { // 单击事件 HandleSingleClick(); } else if (pressDuration >= LONG_PRESS_TIME) { // 长按事件 HandleLongPress(); } else { // 进入双击等待状态 buttonState = BUTTON_DOUBLE_CLICK_WAIT; } } break;
case BUTTON_DOUBLE_CLICK_WAIT: if (currentButtonState == GPIO_PIN_RESET) { uint32_t currentTime = HAL_GetTick(); if (currentTime - buttonReleaseTime < DOUBLE_CLICK_TIME) { // 双击事件 HandleDoubleClick(); buttonState = BUTTON_IDLE; // 处理完后回到初始状态 } else { buttonState = BUTTON_IDLE; // 超过双击最大时间间隔,回到初始状态 } } break; }}
void HandleSingleClick() { // 处理单击事件}
void HandleDoubleClick() { // 处理双击事件}
void HandleLongPress() { // 处理长按事件}
点击阅读原文,更精彩~

美男子玩编程 多领域、有深度的开发者交流平台
评论 (0)
  • 这款无线入耳式蓝牙耳机是长这个样子的,如下图。侧面特写,如下图。充电接口来个特写,用的是卡座卡在PCB板子上的,上下夹紧PCB的正负极,如下图。撬开耳机喇叭盖子,如下图。精致的喇叭(HY),如下图。喇叭是由电学产生声学的,具体结构如下图。电池包(AFS 451012  21 12),用黄色耐高温胶带进行包裹(安规需求),加强隔离绝缘的,如下图。451012是电池包的型号,聚合物锂电池+3.7V 35mAh,详细如下图。电路板是怎么拿出来的呢,剪断喇叭和电池包的连接线,底部抽出PCB板子
    liweicheng 2025-05-06 22:58 776浏览
  • 文/郭楚妤编辑/cc孙聪颖‍相较于一众措辞谨慎、毫无掌舵者个人风格的上市公司财报,利亚德的财报显得尤为另类。利亚德光电集团成立于1995年,是一家以LED显示、液晶显示产品设计、生产、销售及服务为主业的高新技术企业。自2016年年报起,无论业绩优劣,董事长李军每年都会在财报末尾附上一首七言打油诗,抒发其对公司当年业绩的感悟。从“三年翻番顺大势”“智能显示我第一”“披荆斩棘幸从容”等词句中,不难窥见李军的雄心壮志。2012年,利亚德(300296.SZ)在深交所创业板上市。成立以来,该公司在细分领
    华尔街科技眼 2025-05-07 19:25 565浏览
  • 随着智能驾驶时代到来,汽车正转变为移动计算平台。车载AI技术对存储器提出新挑战:既要高性能,又需低功耗和车规级可靠性。贞光科技代理的紫光国芯车规级LPDDR4存储器,以其卓越性能成为国产芯片产业链中的关键一环,为智能汽车提供坚实的"记忆力"支持。作为官方授权代理商,贞光科技通过专业技术团队和完善供应链,让这款国产存储器更好地服务国内汽车厂商。本文将探讨车载AI算力需求现状及贞光科技如何通过紫光国芯LPDDR4产品满足市场需求。 车载AI算力需求激增的背景与挑战智能驾驶推动算力需求爆发式
    贞光科技 2025-05-07 16:54 254浏览
  • Matter协议是一个由Amazon Alexa、Apple HomeKit、Google Home和Samsung SmartThings等全球科技巨头与CSA联盟共同制定的开放性标准,它就像一份“共生契约”,能让原本相互独立的家居生态在应用层上握手共存,同时它并非另起炉灶,而是以IP(互联网协议)为基础框架,将不同通信协议下的家居设备统一到同一套“语义规则”之下。作为应用层上的互通标准,Matter协议正在重新定义智能家居行业的运行逻辑,它不仅能向下屏蔽家居设备制造商的生态和系统,让设备、平
    华普微HOPERF 2025-05-08 11:40 527浏览
  • UNISOC Miracle Gaming奇迹手游引擎亮点:• 高帧稳帧:支持《王者荣耀》等主流手游90帧高画质模式,连续丢帧率最高降低85%;• 丝滑操控:游戏冷启动速度提升50%,《和平精英》开镜开枪操作延迟降低80%;• 极速网络:专属游戏网络引擎,使《王者荣耀》平均延迟降低80%;• 智感语音:与腾讯GVoice联合,弱网环境仍能保持清晰通话;• 超高画质:游戏画质增强、超级HDR画质、游戏超分技术,优化游戏视效。全球手游市场规模日益壮大,游戏玩家对极致体验的追求愈发苛刻。紫光展锐全新U
    紫光展锐 2025-05-07 17:07 447浏览
  • 硅二极管温度传感器是一种基于硅半导体材料特性的测温装置,其核心原理是利用硅二极管的电学参数(如正向压降或电阻)随温度变化的特性实现温度检测。以下是其工作原理、技术特点及典型应用:一、工作原理1、‌PN结温度特性‌硅二极管由PN结构成,当温度变化时,其正向电压 VF与温度呈线性负相关关系。例如,温度每升高1℃,VF约下降2 mV。2、‌电压—温度关系‌通过jing确测量正向电压的微小变化,可推算出环境温度值。部分型号(如SI410)在宽温域内(如1.4 K至475 K)仍能保持高线性度。
    锦正茂科技 2025-05-09 13:52 401浏览
  • 后摄像头是长这个样子,如下图。5孔(D-,D+,5V,12V,GND),说的是连接线的个数,如下图。4LED,+12V驱动4颗LED灯珠,给摄像头补光用的,如下图。打开后盖,发现里面有透明白胶(防水)和白色硬胶(固定),用合适的工具,清理其中的胶状物。BOT层,AN3860,Panasonic Semiconductor (松下电器)制造的,Cylinder Motor Driver IC for Video Camera,如下图。TOP层,感光芯片和广角聚焦镜头组合,如下图。感光芯片,看着是玻
    liweicheng 2025-05-07 23:55 689浏览
  • 二位半 5线数码管的驱动方法这个2位半的7段数码管只用5个管脚驱动。如果用常规的7段+共阳/阴则需要用10个管脚。如果把每个段看成独立的灯。5个管脚来点亮,任选其中一个作为COM端时,另外4条线可以单独各控制一个灯。所以实际上最多能驱动5*4 = 20个段。但是这里会有一个小问题。如果想点亮B1,可以让第3条线(P3)置高,P4 置低,其它阳极连P3的灯对应阴极P2 P1都应置高,此时会发现C1也会点亮。实际操作时,可以把COM端线P3设置为PP输出,其它线为OD输出。就可以单独控制了。实际的驱
    southcreek 2025-05-07 15:06 767浏览
  •         信创产业含义的“信息技术应用创新”一词,最早公开信息见于2019年3月26日,在江苏南京召开的信息技术应用创新研讨会。本次大会主办单位为江苏省工业和信息化厅和中国电子工业标准化技术协会安全可靠工作委员会。        2019年5月16日,美国将华为列入实体清单,在未获得美国商务部许可的情况下,美国企业将无法向华为供应产品。       2019年6
    天涯书生 2025-05-11 10:41 66浏览
  • 在印度与巴基斯坦的军事对峙情境下,歼10C的出色表现如同一颗投入平静湖面的巨石,激起层层涟漪,深刻印证了“质量大于数量”这一铁律。军事领域,技术优势就是决定胜负的关键钥匙。歼10C凭借先进的航电系统、强大的武器挂载能力以及卓越的机动性能,在战场上大放异彩。它能够精准捕捉目标,迅速发动攻击,以一敌多却毫不逊色。与之形成鲜明对比的是,单纯依靠数量堆砌的军事力量,在面对先进技术装备时,往往显得力不从心。这一现象绝非局限于军事范畴,在当今社会的各个领域,“质量大于数量”都已成为不可逆转的趋势。在科技行业
    curton 2025-05-11 19:09 134浏览
  • 飞凌嵌入式作为龙芯合作伙伴,隆重推出FET-2K0300i-S全国产自主可控工业级核心板!FET-2K0300i-S核心板基于龙芯2K0300i工业级处理器开发设计,集成1个64位LA264处理器,主频1GHz,提供高效的计算能力;支持硬件ECC;2K0300i还具备丰富的连接接口USB、SDIO、UART、SPI、CAN-FD、Ethernet、ADC等一应俱全,龙芯2K0300i支持四路CAN-FD接口,具备良好的可靠性、实时性和灵活性,可满足用户多路CAN需求。除性价比超高的国产处理器外,
    飞凌嵌入式 2025-05-07 11:54 120浏览
  • 温度传感器的工作原理依据其类型可分为以下几种主要形式:一、热电阻温度传感器利用金属或半导体材料的电阻值随温度变化的特性实现测温:l ‌金属热电阻‌(如铂电阻 Pt100、Pt1000):高温下电阻值呈线性增长,稳定性高,适用于工业精密测温。l ‌热敏电阻‌(NTC/PTC):NTC 热敏电阻阻值随温度升高而下降,PTC 则相反;灵敏度高但线性范围较窄,常用于电子设备温控。二、热电偶传感器基于‌塞贝克效应‌(Seebeck effect):两种不同
    锦正茂科技 2025-05-09 13:31 393浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦