3.STM32F4按鍵掃描函數
阿新 • • 發佈:2017-08-17
可重入函數 size print 防止 courier csharp 生命 brush lin
//按鍵處理函數 //返回按鍵值 //mode:0,不支持連續按;1,支持連續按; //0,沒有任何按鍵按下 //1, KEY0 按下 2, KEY1 按下 3, KEY2 按下 4, WKUP 按下 WK_UP //註意此函數有響應優先級,KEY0>KEY1>KEY2>WK_UP!! u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按鍵按松開標誌 if(mode)key_up=1; //支持連按 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)) { delay_ms(10);//去抖動 key_up=0; if(KEY0==0)return 1; else if(KEY1==0)return 2; else if(KEY2==0)return 3; else if(WK_UP==1)return 4; }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; return 0;// 無按鍵按下 }
KEY_Scan 函數,則是用來掃描這 4 個 IO 口是否有按鍵按下。 KEY_Scan 函數, 支持兩種掃描方式,通過 mode 參數來設置。
當 mode 為 0 的時候, KEY_Scan 函數將不支持連續按, 掃描某個按鍵,該按鍵按下之後必須要松開,才能第二次觸發,否則不會再響應這個按鍵,這樣的好處就是可以防止按一次多次觸發,而壞處就是在需要長按的時候比較不合適。
當 mode 為 1 的時候, KEY_Scan 函數將支持連續按,如果某個按鍵一直按下,則會一直返回這個按鍵的鍵值,這樣可以方便的實現長按檢測。 該函數有返回值,如果有按鍵按下,則返回非 0 值,如果沒有或者按鍵不正確,則返回 0。
註:因為該函數裏面有 static 變量,所以該函數不是一個可重入函數
static u8 key_up=1;//按鍵按松開標誌
靜態變量復習例子
#include<stdio.h> int fun(int n) { static int f=1; f=f*n; return f; } void main() { int i; for(i=1;i<=5;i++) printf("fun(%d)=%d\n",i,fun(i)); }
運行結果:
fun(1)=1 fun(2)=2 fun(3)=6 fun(4)=24 fun(5)=120
說明f在加了static的類型限制之後,就相當於全局變量,函數調用完了之後,修改過的f的值仍然是有效的(即這個程序相當於求i的階乘了)。而如果不加static的類型限制,那麽,會是什麽結果呢,我們看下面的代碼:
#include<stdio.h> int fun(int n) { int f=1; f = f * n; return f; } void main() { int i; for(i=1;i<=5;i++) printf("fun(%d)=%d\n",i,fun(i)); }
運行結果:
fun(1)=1 fun(2)=2 fun(3)=3 fun(4)=4 fun(5)=5也就是說,這時函數fun中的變量f的生命周期就僅限於fun函數的範圍內了,在main中每次傳入新的參數i,f就會計算1*i的值並返回,而不會像之前那樣不斷的累乘了。
3.STM32F4按鍵掃描函數