本帖最后由 Similarv 于 2020-1-13 18:07 編輯
你的做法當然也沒有問題,不過我是這么做的:
按鍵就只是做按鍵檢測,并且設置相應的“按鍵已觸發”標志(bit變量);至于按鍵的功能則是在別處比如狀態機中去執行。
例子:當按鍵按下之后開/關燈
key.c 文件:
bit key_flag_light; //當按鍵觸發時為1,否則為0, 此變量是給狀態機使用的
static bit key_press_light; //當按鍵按下時為1,未按下為0,此變量僅在key.c內使用。
函數1-keyScan() -- 功能:檢測按鍵是否按下,若按鍵按下則將key_press_light置一,否則清零。
函數2-keyDeal() -- 功能:使用某靜態變量統計key_press_light的時間;當key_press_light從1變為0的時候,檢查靜態變量的值是否大于消抖值,若大于消抖時間則將key_flag_light設置為1;
state.c文件
函數1-StateMachine() -- 功能:當key_flag_light==1時,取反led_flag_out的值,隨后將key_flag_light設置為0.
led.c文件
bit led_flag_out; //當該值==1,開燈;當該值==0;關燈
函數1-ledOutput() -- 功能:根據led_flag_out的取值開燈或者關燈
main.c文件
在10ms或者20ms的時基中依次調用
keyScan();
keyDeal();
StateMachine();
在100ms的時基中調用
ledOutput();
/******/
稍微修改一下,剛剛沒有認真審題,你需要做長按的判定,我這個架構是基于短按的。
修改的地方位于keyDeal()部分,
短按 —— 是等待按鍵松開時裁決靜態變量的計時值。
長按 —— 則是直接在靜態變量等于‘長按時間點’的時刻將key_flag_light置一即可。key_flag_light==1的時候,狀態機自然會處理長按事件,此后keyDeal()里的靜態變量會在按鍵繼續按著的時候繼續加,但其值已經‘大于’‘長按時間點’了,所以key_flag_light不會被重復置一,當按鍵釋放之后,此靜態變量清零,一切重新開始。
|