1. 程式人生 > >3.STM32F4按鍵掃描函數

3.STM32F4按鍵掃描函數

可重入函數 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按鍵掃描函數