关于静态变量的理解
链接: static静态变量的理解.
我是从这里面找到资料的。
为什么我会查询关于静态变量的资料呢?
因为在正点原子STM32例程里面有按键实验和电容触摸按键的实验,里面都运用到了static变量,来操控按键是否可以连续按下。
普通按键的例子
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY3按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY_UP!!
u8 KEY_Scan(u8 mode)
{ //因为在消抖完之后key_up被设置为了0 ,所以这里key_up就一直是0了
static u8 key_up=1;//按键按松开标志 // 标志按键一直松开 这个是静态局部变量,只能被初始化一次,后面你怎么改他就变成你改的值了。
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(10);//去抖动
key_up=0; //消抖完之后就先设置按键已经按下,然后再去判断哪个按键,这时候不管再怎么按上面的if都不会执行了
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; //当你什么案件都没有按下去的时候,key_up又重新置1,这时候又可以重新来一个轮回判断按键了
return 0;// 无按键按下
}
触摸按键的例子
//扫描触摸按键
//mode:0,不支持连续触发(按下一次必须松开才能按下一次);1,支持连续触发(可以一直按下)
//返回值:0,没有按下;1,有按下;
#define TPAD_GATE_VAL 100 //触摸的门限值,也就是必须大于tpad_default_val+TPAD_GATE_VAL,才认为是有效触摸.
u8 TPAD_Scan(u8 mode)
{
static u8 keyen=0; //0,可以开始检测;>0,还不能开始检测
u8 res=0;
u8 sample=3; //默认采样次数为3次
u16 rval;
if(mode)
{
sample=6; //支持连按的时候,设置采样次数为6次
keyen=0; //支持连按
}
rval=TPAD_Get_MaxVal(sample); //rval = sample次里面的最大值,如果这个最大值比默认值+门限值还大则有效
if(rval>(tpad_default_val+TPAD_GATE_VAL))//大于tpad_default_val+TPAD_GATE_VAL,有效
{
if(keyen==0)res=1; //keyen==0,有效
//printf("r:%d\r\n",rval);
keyen=3; //至少要再过3次之后才能按键有效 //这里keyen变成了3,所以上面的static 的keyen也改了 不是0了
}
if(keyen)keyen--; //如果keyenable = 3为真 keyen = keyen-1 这时候keyen = 2的 ,然后发现上面一串都执行不了,因为keyen!=0,然后回来这里2-1,一个轮回又1-1=0
return res;
}
在代码里面我都写入了自己分析代码时候的注释。
代码的逻辑还是比较清晰简单的,重点在于连按的问题下面。
一个简单的例子来说明static局部变量
#include <stdio.h>
long factor1( int n)
{
static long int f = 1; //static
f*=n;
return f;
}
long factor2( int n)
{
long int g = 1; //auto
g*=n;
return g;
}
int main(void )
{
int i ,j ;
for ( i=1; i <=5; i++)
printf ( "factor 1 =%ld\n" , factor1( i) ) ;
for ( j=1; j <=5; j++)
printf ( "fsctor 2 =%ld\n" , factor2( j) ) ;
return 0;
}
运行结果:
比较factor 1和factor 2,在factor1里面的变量f是static的,而factor2里面的变量g是auto的,也就是普通的变量。
可以看出,
static的局部变量(例如f)只会被初始化一次,后面再调用它的时候,就会延续上一次改变后的值,不会再次初始化了。
而普通变量(例如g)在下一次调用的时候,会再一次初始化,所以结果g一直是1,而f会每一次都改变,开始是1,然后2、6、24、120这样不断改变下去。
关于触摸按键和按键输入两个例子
这两个例子都是非常好的例子,可以供学习借鉴使用。