实例源码1---单片机按键消抖操作

2019-04-15 13:04发布

基本思想就是监测,延时,监测。。。,放进循环中可进行扫描式操作   /**   * 函数功能: 读取按键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);   } }