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