在寫單片機程序的過程中,難免會遇到按鍵的寫法,比如一個按鍵實現長按,
短按。本文只針對這些操作說明一下自己按鍵的思想。可應用到實際工程中。
按鍵處理過程:設置一個按鍵標志,按下時為1,松開時為0,然后每xxms執行這個函數,有按鍵按下時,計數器+1,然后根據計數的數值做一個判斷。
單次按鍵需要在松開的時候判斷計數器的值,長按的話可以直接判斷計數的值到達用戶自定義的值即可,詳細的程序框架如下:
流程分析:
程序框架:
//參考偽代碼
int main(void)
{
...
key_flag_old = read_io(GPIO_xx) ? 1:0 ; //判斷初始化按鍵的狀態
...
while(1)
{
......
//是否調用軟件定時器
.......
}
}
void soft_timer() //軟件定時器,時間自定
{
key_process();//按鍵處理
time_sys = clock_time();//在此獲取時間,重新計時
}
void key_process(void) //按鍵處理
{
key_flag_cur = read_io(GPIO_xx)? 1:0 ; //讀取當前按鍵的狀態
if(key_flag_cur != key_flag_old) //按鍵按下或者松開檢測,按下時,狀態一直為1,松開時為0
{
key_on = !key_on;
key_flag_old = key_flag_cur;//把當前狀態給舊的狀態,以免重復運行該判斷
}
if(key_on) //單次和長按都可判斷
{
key_always_cnt++;
}
if(key_always_cnt >= n)
{
key_always_cnt = 0;
key_always_process();//長按按鍵的操作
}
if(!key_on && key_always_cnt>0) //按鍵松開時候進行檢測,如果一直按着執行長按,這里也可以寫1,可用於消抖
{
key_once_process();//單次按鍵的函數操作
key_always_cnt = 0;
}
}
如果有什么疑問,歡迎大家討論,轉貼請注明出處,謝謝。
---------cofin_add