關於按鍵掃瞄程式的終極討論

2021-06-28 21:37:49 字數 1706 閱讀 4677

一、思路

基於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的。做完之後雖然可以執行,但是很勉強,尤其是按鍵掃瞄程式沒有下面這位哥寫得簡潔縝密,所以就貼過來,以後...