美文网首页C语言深度学习
嵌入式C语言学习系列第1篇---单片机按键消抖操作

嵌入式C语言学习系列第1篇---单片机按键消抖操作

作者: CodeAllen | 来源:发表于2018-07-08 10:46 被阅读27次

    基本思想就是监测,延时,监测。。。,放进循环中可进行扫描式操作

    /**
      * 函数功能: 读取按键KEY1的状态
      * 输入参数:无
      * 返 回 值: KEY_DOWN:按键被按下;
      *           KEY_UP  :按键没被按下
      * 说    明:无。
      */
    KEYState_TypeDef KEY1_StateRead(void)
    {
      /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
      if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
      {
        /* 延时一小段时间,消除抖动 */
        HAL_Delay(10);
        /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
        if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
        {
          /* 等待按键弹开才退出按键扫描函数 */
          while(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL);
           /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
          return KEY_DOWN;
        }
      }
      /* 按键没被按下,返回没被按下状态 */
      return KEY_UP;
    }
    

    中断模式(利用io口回调中断中处理)

    /**
      * 函数功能: 按键外部中断服务函数
      * 输入参数: GPIO_Pin:中断引脚
      * 返 回 值: 无
      * 说    明: 无
      */
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
      if(GPIO_Pin==KEY1_GPIO_PIN)
      {
    HAL_Delay(20);/* 延时一小段时间,消除抖动 */
    if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
    {
      BEEP_TOGGLE;
      LED1_ON;
      LED2_ON;
      LED3_ON;
    }
    __HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
      }
      else if(GPIO_Pin==KEY2_GPIO_PIN)
      {
    HAL_Delay(20);/* 延时一小段时间,消除抖动 */
    if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
    {
      BEEP_TOGGLE;
      LED1_OFF;
      LED2_OFF;
      LED3_OFF;
    }
    __HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);
      }
    }

    相关文章

      网友评论

        本文标题:嵌入式C语言学习系列第1篇---单片机按键消抖操作

        本文链接:https://www.haomeiwen.com/subject/rhtouftx.html