#define key_input PIND.7 // 按鍵輸入口
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
char read_key(void)
{
static char key_state = 0;
char key_press, key_return = 0;
key_press = key_input; // 讀按鍵I/O電平
switch (key_state)
{
case key_state_0: // 按鍵初始態
if (!key_press) key_state = key_state_1; // 鍵被按下,狀態轉換到鍵確認態
break;
case key_state_1: // 按鍵確認態
if (!key_press)
{
key_return = 1; // 按鍵仍按下,按鍵確認輸出為“1”
key_state = key_state_2; // 狀態轉換到鍵釋放態
}
else
key_state = key_state_0; // 按鍵已抬起,轉換到按鍵初始態
break;
case key_state_2:
if (key_press) key_state = key_state_0; //按鍵已釋放,轉換到按鍵初始態
break;
}
return key_return;
}
另外一個原則就是設計的中斷服務函數執行時間應該盡量的短。這樣假如系統中使用多個中斷的話,就是不采用中斷嵌套的方式,也能夠保證系統能夠及時響應各個中斷的請求。
所以我喜歡在定時中斷中只使用一個標志變量,這樣中斷服務函數執行時間是最快的,就不會阻塞其它中斷的及時響應,而在主程序中判斷標志變量,然后再去掃描按鍵。盡管此時掃描的間隔已經不是嚴格意義上的10ms,或多或少都有一些延誤,而且延誤也是不確定的,但都不會影響按鍵掃描的正確性(一個按鍵的過程至少在300ms以上)。
設定一個定時器中斷,每隔10MS 掃描一次按鍵。,讀取值。。如果多個按鍵,又有多余的定時器,可以試試這個方法,效率高了。搞STM32 剛好。 cool.