1. 程式人生 > >嵌入式C語言學習系列第1篇---微控制器按鍵消抖操作

嵌入式C語言學習系列第1篇---微控制器按鍵消抖操作

基本思想就是監測,延時,監測。。。,放進迴圈中可進行掃描式操作

/**  * 函式功能: 讀取按鍵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); }}