下载:ESP32定时中断实现单击、双击、长按等功能的按键状态机Arduino代码。-嵌入式文档类资源-优快云下载
一、问题的提出。
按键处理一直都是嵌入系统必须要做的事情,而在很多实时要求较高的系统里面,采用传统延时防抖读取按键的过程容易产生阻塞。会使系统来不及处理其他事务。如显示扫描,串行接收,WIFI通信等,都是需要及时获得CPU控制权的,如果按键长时间阻塞,就会影响到这些事务的处理。
二、实现原理。
本人使用定时中断按键状态机原理。封装一个CLASS,用于ESP32控制 VS1053解码的播放器器中,以实现单击(切换下一曲);双击(切换上一曲);三连击(功能切换);长按(启动WIFI配网过程)。现将此按键状态机处理代码分享给大家,以期对大家有所帮助。
其基本原理是定时器每间隔一定时间(1毫秒)查询按键状态,并采用计数方法判断按键在指定时间内按下和弹起的次数,存入键值缓冲序列。需要按键处理的过程查询键值序列,依次处理按键输入。
下面以图形方式讲解这一处理过程的原理:

首先设置按键计时变量,当按键首次按下时(t0时刻)开始计时(计数,也就是中断次数)。此时计时初值为0,键值为0。然后每次中断读取按键状态,同时判断计时值。中断过程在每次按键弹起时键值加1,如果计时t1时刻没有到来,此值表示连续按键次数。计时超过t1,如果按键处于弹起状态,则将键值存入缓冲序列,处理过程结束,等待下一次按键处理,如图1所示。
如果t1时刻后按键还处于按下状态,如图2,则一至等待按键弹起(t2时刻到来之前),按键弹起,则将键值存入缓冲序列,处理过程结束,等待下一次按键处理。
如果t2时刻到来,按键还没有弹起,如图3,则当作“长按”状态处理(至到按键弹起)。缓冲序列最后一个键值被赋予值0xFF(255)。
需要按键处理的过程调用键值读取过程,此过程依次读取缓冲序列,返回每一个键值。如果所有缓冲序列都读取完毕,则判断当前是否处于长按状态,长按状态返回0xFF,否则返回0。即返回值为0表示没有按键,返回0xFF表示正处于长按过程,返回其他值表示一次连续按压的次数(单击、双击、三连击等)。
三、程序代码。
本程序采用Arduino软件编写完成,共两个文件,加了详细中文注释,方便阅读。文件KEYS.C为模块文件,按键处理机封装为一个Class对象,供主程序调用。KEYS.ino为Arduino主程序

本文档介绍了一种基于定时中断的ESP32按键状态机实现,用于处理单击、双击、三连击和长按功能。通过在1毫秒间隔内检查按键状态并计数,将按键事件存入缓冲序列,避免了传统延时方法可能造成的系统阻塞。程序使用Arduino编写,包含一个封装的Class,适用于ESP32控制VS1053解码器的播放器。主程序和模块代码均提供了详细注释,便于理解和应用。
最低0.47元/天 解锁文章
1万+





