閒來沒事整理一下文檔。這一篇我們來講一講按鍵的各種觸發事件。
下面我給大家簡單介紹一下有哪些按鍵檢測的方式。
方式1 阻塞式檢測按鍵
void KeyScan(void)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13) == 0)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13) == 0)
{
//按鍵按下執行按鍵按下操作
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13) == 0);//鎖死按鍵
}
}
}
這裏我們使用阻塞式按鍵檢測,他大大的佔用了系統的資源,使用了死等延時浪費系統的時間資源。並且在while循環中,如果按鍵按下那麼沒法執行其他的操作,這是最簡單的按鍵檢測,對我們操作實際項目不適用。
方式2 外部中斷方式檢測按鍵
這裏方式二就是採用外部中斷的方式來檢測判斷按鍵按下。相比較方式1,中斷的方式檢測按鍵不佔用的系統時間資源,比第一種方法要好,缺點是要使用系統的外部中斷。萬一硬件的配置IO口緊缺,無法使用外部中斷就不能執行該操作了。
方式3 使用定時器掃描加按鍵方式操作檢測按鍵
話不多說我們先來一段代碼
#define LONGKEEP_TICK 200 //這裏是長按時間設置根據你的定時器來說如果放在1ms定時器這裏設置時間是 5*200 = 1000ms
uint16_t Count;
uint16_t TempKeyData,KeyData ;
uint16_t KeyReadData ,;
uint16_t Trg , Release ,Cont ,LongPress_flag ;
uint32_t KeyHoldTime = 0;
unsigned char xSYS_KeyScan(void)
{
if(Count++ < 4)//五次進來一次
{
return 0;
}
Count = 0;
TempKeyData = 0;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13)== 0) //按下
{
TempKeyData = 0x01;
}
if(TempKeyData != KeyData)
{
KeyData = TempKeyData;
}
else
{
KeyReadData =TempKeyData;
}
Trg = KeyReadData & (KeyReadData ^ Cont);
Release = KeyReadData ^ Trg ^ Cont;
Cont = KeyReadData;
KeyHoldTime++;
if(KeyHoldTime >= 0xffff)KeyHoldTime = 0xffff;
//掃描處理
if(Trg & 0x01)//短踩處理
{
KeyHoldTime = 0;
//執行按下操作
}
if(Cont & 0x01)//長踩處理
{
if(KeyHoldTime >= LONGKEEP_TICK && LongPress_flag == 0)//長按
{
LongPress_flag = 1;
//執行長按操作
}
}
if(Release & 0x01)//擡起處理
{
key->LongPress_flag = 0;
//執行擡起操作
}
return 0;
}
上面的代碼給大家講述了按鍵的按下、長按、擡起的過程。而且每個動作在按下過程中只能單獨執行一次,這個函數只需要放到定時器裏面去掃描,不需要外部中斷,不需要延時。不佔系統資源,能夠輕鬆的實現檢測按鍵按下、長按、擡起、單擊、雙擊操作,很實用推薦給大家!
希望大家多多關注我!~