一、思路
基於stm8,按鍵處理,思路是這樣的:
每20ms左右一次去掃瞄按鍵,用乙個key_now記錄當前值,用key_last記錄上次的值,如果key_now和key_last同時有效,則開始進行cnt++。
我設定兩個閾值,long_press為100(100*20ms=2s),short_press為4(4*20ms=80ms,去抖)。
cnt大於long_press,表示是長按,反之再判斷cnt是不是大於short_press,表示是短按,否則把cnt清零。
另外一種情況,我們在設定引數的時候,要不停加1或者減1,我長按,希望數值連續增減,怎麼實現?
接上面的cnt值,再設定乙個連按的閾值,mid_press=50(50*20ms=1s)。
當cnt大於mid_press時,我認為觸發了短按,但此時不清空cnt,只是將cnt減去short_press的值。
如此下去,如果按鍵一直不鬆開,則一直連線觸發短按。
二、實現
硬體上有三個按鍵,分別是set,up,down。
// 控制按鍵時長
#define long_press 100 // 20ms*100=2s,長按
#define short_press 5 // 20ms*5=100ms,短按
#define mid_press 50 // 20ms*50=1s,連按
#define repeat_press 5 // 200ms*5=100ms,連按靈敏引數
#define key_port (gpioc)
#define key_set (gpio_pin_5) // set鍵接pc5
#define key_up (gpio_pin_6) // up鍵接pc6
#define key_down (gpio_pin_7) // down鍵接pc7
uchar pinnow;
bool pinset_now, pinup_now, pindown_now;
bool pinset_last, pinup_last, pindown_last;
bool set_long = false; // set鍵長按
bool set_short = false; // set鍵短按
bool up_short = false; // up鍵短按
bool down_short = false; // down鍵短按
// 初始化
void key_proc_init(void)
// 按鍵處理
void key_scan(void)
}else else
} // up和down鍵有連按和短按,沒有長按
if (pinup_now & pinup_last)
}else }
if (pindown_now & pindown_last)
}else }
// 新增自己對於set_long,set_short,up_short,down_short的處理**
// 處理完了不要忘記把相應的值置為false
pinset_last = pinset_now;
pinup_last = pinup_now;
pindown_last = pindown_now; }
然後用定時器中斷,每20ms去執行乙個key_scan()函式。
用佇列實現的按鍵掃瞄程式
key.c 好處就是 可以實現多個按鍵狀態轉換,判斷是長按還是短按,消抖 include include sys.h define key0 pbin 0 define key1 pbin 1 define key2 pbin 2 define key3 pbin 3 define key0 pbi...
STC微控制器按鍵掃瞄程式
最近在做乙個電子秤相關專案,使用stc系列微控制器作為主控晶元,專案第一階段直接使用iap15w4k58s4驅動兩個矩陣鍵盤,一切除錯順利,在專案即將結束時老闆要求使用另一塊微控制器驅動矩陣鍵盤,讀取鍵值後通過串列埠傳回之前的iap主控 理由是為了節省從矩陣鍵盤到主控板之間的長排線的成本,16p 1...
51微控制器按鍵掃瞄C程式
大二上學期做過8051微控制器的按鍵程式,當時專案要求實現按鍵控制led屏顯示並且接收gprs傳來的資料。當時為了節省成本,就去大西電子市場買來8 8的led塊,然後自己一點一點的拼接成128 16的。做完之後雖然可以執行,但是很勉強,尤其是按鍵掃瞄程式沒有下面這位哥寫得簡潔縝密,所以就貼過來,以後...