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