3.STM32F4按鍵掃描函數


//按鍵處理函數
//返回按鍵值
//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。 

注:因為該函數里面有 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的值並返回,而不會像之前那樣不斷的累乘了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM