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的值并返回,而不会像之前那样不断的累乘了。

 

 

posted @ 2017-08-17 15:05  口袋里的超超  阅读(3268)  评论(0编辑  收藏  举报