|
|
下面為使用教程,本函數(shù)使用了一個(gè)Key_Event為全局按鍵事件變量,需要在其他函數(shù)中讀取這個(gè)Key_Event。
你需要在定時(shí)器中斷中調(diào)用采樣函數(shù),結(jié)果保存在Key_Event中。
void TIMER_ISR onTimer() {
Key_Sampling(Button);
}
如果你想通過(guò)串口測(cè)試按鍵結(jié)果?
void loop() {
delay(500);
Serial.print("Key Event is");
Serial.println(Key_Event);
Key_Event = NOKEY;
}
另外,這是Arduino平臺(tái)的測(cè)試方法,如果你想移植,也非常簡(jiǎn)單,只需要修改下這一行。
Read_Temp = digitalRead(IO_Set);//采樣一次
如果你是51單片機(jī),那你可以寫(xiě)
Read_Temp = P32;//采樣一次
如果你是32單片機(jī),你可以寫(xiě)
Read_Temp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);//采樣一次
實(shí)際上這種不涉及外設(shè)的功能代碼都是通用的,可以隨意移植的,不同平臺(tái),也只不過(guò)是初始化的時(shí)候不同,51用寄存器初始化,32單片機(jī)用hal庫(kù)或者標(biāo)準(zhǔn)庫(kù)初始化,arduino同理。
另外,如果你想用在多個(gè)按鍵上,怎么處理?
這個(gè)比較復(fù)雜,需要用到結(jié)構(gòu)體:
- typedef struct{//多個(gè)按鍵存儲(chǔ)不同結(jié)構(gòu)體
- unsigned char Key_IO;
- unsigned char Sampling_Counter;//采樣次數(shù)計(jì)數(shù)器
- unsigned long Result_Temp;//采樣結(jié)果緩存
- bool Previous_Key;//之前的按鍵采樣記錄
- bool Now_Key;//當(dāng)前的按鍵采樣記錄
- bool Is_Sampling;//正在采樣標(biāo)志
- bool Start_Sampling;//開(kāi)始采樣標(biāo)志,由下降沿觸發(fā)
- bool Key_Temp;//按鍵狀態(tài)緩存,每次進(jìn)入函數(shù)時(shí)讀取
- unsigned char Rise_Edge_Result;
- } Key_Sampling_Group;
- Key_Sampling_Group IO_15{15,0,0,0,0,0,0,0};//IO15所接按鍵
- Key_Sampling_Group IO_7{7,0,0,0,0,0,0,0};//IO7所接按鍵
復(fù)制代碼 通過(guò)這個(gè)結(jié)構(gòu)體,我們可以用同一個(gè)函數(shù),實(shí)現(xiàn)多個(gè)IO并行檢測(cè),函數(shù)的變量分別保存,不會(huì)互相干擾,節(jié)省flash,雖然其實(shí)這么短的代碼根本不會(huì)超過(guò)500字節(jié)代碼吧,但是如果按鍵比較多,占用還是很可觀的。
使用結(jié)構(gòu)體,傳入時(shí)需要傳入指針(地址),否則會(huì)導(dǎo)致直接將結(jié)構(gòu)體中的數(shù)值復(fù)制一份到函數(shù)中,你在定時(shí)器中斷中這么寫(xiě):
Key_Sampling(Key_Sampling_Group *IO_Set)
這樣就可以傳入結(jié)構(gòu)體的地址,函數(shù)會(huì)使用結(jié)構(gòu)體中的變量,也會(huì)自動(dòng)保存在結(jié)構(gòu)體中。
然后你需要在函數(shù)中每個(gè)用到對(duì)應(yīng)變量的地方修改,比如:
原本是digitalRead(Key_IO);
現(xiàn)在你需要改為digitalRead(IO_Set -> Key_IO);
這樣才能讓函數(shù)讀取到你結(jié)構(gòu)體中的數(shù)據(jù)。
|
|