單片機按鍵_長按和短按的一種處理思想


在寫單片機程序的過程中,難免會遇到按鍵的寫法,比如一個按鍵實現長按,
短按。本文只針對這些操作說明一下自己按鍵的思想。可應用到實際工程中。

 

按鍵處理過程:設置一個按鍵標志,按下時為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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM