STM32F103基于HAL庫使用SysTick_Handler實作穩定讀取按鍵按下動作(包含消抖演算法)
- SysTick_Handler介紹
- 程式介紹
今天我給大家分享一個基于
SysTick_Handler中斷實作的按鍵掃描
SysTick_Handler介紹
SysTick_Handler是HAL庫配置的stmf103芯片里運行時會每隔1ms被呼叫的一個回呼函式,所以我在這個回呼函式里面寫了按鍵讀取的程式Key_Scan();,這個函式每隔1ms會在回呼函式里面被呼叫一次

按鍵接法是這樣的,自然狀態下引腳讀取時高電平,按鍵按下時引腳讀取時低電平

程式介紹
程式流程圖如圖所示:

這個程式判斷按鍵按下需要2個條件:
- 按鍵持續按下時間超過32ms
- 按鍵在非按下狀態
那這個程式是怎么實作消抖的呢?很簡單,按鍵彈起的時候一直都是高電平,程式需要讀到連續的32個毫秒的高電平才會判斷為按鍵按下,中間哪怕有一個低電平的抖動,sw1Count計數器都會清零,重新開始32毫秒的計數,因此實作了消抖,而且程式在判斷到了按鍵按下之后pushFlag1置1,這樣在按鍵持續按下的時候就不會識別為多個按鍵按下的操作,
uint8_t sw1Count;
uint8_t pushFlag1;
void Key_Scan(void)
{
/*檢測SW1是否按下 */
if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET )
{
sw1Count++; //SW1鍵按下,計數sw1Count加1
if(sw1Count>=32) //1MS中斷一次,sw1Count大于等于32,即按鍵已按下32ms
{
if(pushFlag1==0) //判斷有沒有重按鍵,1為有,0為沒有
{
swState1=1; //設定按鍵標志 HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,1);
sw1Count=0;
pushFlag1=1; //設定重按鍵標志
}
else
sw1Count=0;
}
else
swState1=0;
}
else //無按鍵按下
{
sw1Count=0; //清零sw1Count
swState1=0; //清除按鍵標志
pushFlag1=0; //清除重按鍵標志
}
}
一鍵三連,謝謝鐵汁們=
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236664.html
標籤:其他
