基于ESP32-S3的状态机消抖方法
·
最近在写无延迟按键消抖代码时候发现的方法
使用其中一个硬件定时器
//创建用于按键消抖的硬件定时器
hw_timer_t *timer = NULL;
配置按键引脚
//按键引脚配置为上拉
pinMode(BTN_BRIGHT, INPUT_PULLUP);
初始化计时器
//初始化定时器:使用定时器0,分频80,向上计数
timer = timerBegin(0,80,true);
写中断函数,定时器每10ms计时一次并且触发一次定时器中断
每次进入中断函数执行一次按键检测函数ReloadKeyCheck
//定时器中断函数
void timer_interrupt()
{
ReloadKeyCheck();
}
定义两个常量KEY_STATE_UP和KEY_STATE_DOWN
#define KEY_STATE_UP 0 //按键状态为-松开
#define KEY_STATE_DOWN 1 //按键状态为-按下
定义按键端口号
#define RELOAD_KEY 4 //按键端口号
按键函数
//按键状态检测函数
void ReloadKeyCheck()
{
static uint16_t DownTime = 0;//检测状态的时间(定时器的触发次数)
static uint8_t KEY_STATE = KEY_STATE_UP;//按键的当前状态
if(KEY_STATE == KEY_STATE_UP)//状态1:按键松开状态
{
if(RELOAD_KEY == 1)//稳定在状态1
{
DownTime = 0;//等待计数归零
}
else if(RELOAD_KEY == 0)//端口输入变为低电平
{
KEY_STATE = KEY_STATE_DOWN;//进入状态2
}
}
else if(KEY_STATE == KEY_STATE_DOWN)//状态2:按键按下状态
{
if(RELOAD_KEY == 1)//端口输入高电平
{
KEY_STATE = KEY_STATE_UP;//回到状态1
}
else if(RELOAD_KEY == 0)//端口输入仍旧为低电平
{
DownTime++;//进入计时过程
if(DownTime == 2)//端口低电平保持时间达到20ms
{
//这里写按键按下时需要执行的函数
...
KEY_STATE = KEY_STATE_UP;//按键状态强制退出状态2,改为状态1
}
}
}
}
绑定中断函数和定时器
//配置定时器,true代表边沿触发,false电平
timerAttachInterrupt(timer,timer_interrupt,true);
设置定时模式
//设置定时模式
//第二个是微秒,比如定时一秒第二个就是1000*1000
//这里要定时10毫秒就是10*1000
//true代表周期性
timerAlarmWrite(timer,10*1000,true);
启动定时器
//启动定时器
timerAlarmEnable(timer);
更多推荐

所有评论(0)