最近在写无延迟按键消抖代码时候发现的方法
使用其中一个硬件定时器

//创建用于按键消抖的硬件定时器
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);
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐