1.按键扫描理解
参考 http://www.cnblogs.com/wangguchao/
1.代码部分
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; //当没有按键按下时,key_up置1
return 0;// 无按键按下
}
当 mode 为 0 的时候, KEY_Scan 函数将不支持连续按, 扫描某个按键,该按键按下之后必须要松开,才能第二次触发,否则不会再响应这个按键,这样的好处就是可以防止按一次多次触发,而坏处就是在需要长按的时候比较不合适。当 mode 为 1 的时候, KEY_Scan 函数将支持连续按,如果某个按键一直按下,则会一直返回这个按键的键值,这样可以方便的实现长按检测。 该函数有返回值,如果有按键按下,则返回非 0 值,如果没有或者按键不正确,则返回 0。
2.静态变量 static
参考如下例子#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 都是继承的上一次调用 fun 函数 返回的 f 值,而不是每次调用完就使得 f=1,所以可以认为static在这里的作用是实现初始化,且不会对后来的值有影响。我们来对比一下,如果没有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
从这里可以看出,没有了static,使得每次调用函数时,都会使 f=1。
总结一下:如果只想在函数里调用一次做初始化,不影响后面操作,就可以使用。