按键有两种模式
①支持连按(例如电视调台长按持续换台)
②不支持连按
C语言小知识
C语言关键字 static声明的静态变量,存储在静态存储区。
它在函数调用结束之后,不会被释放。它的值会一直保留下来。所以可以说static申明的局部变量,具有记忆功能。
Q:每次调用getValue函数之后,返回值是多少?
int getValue(void)
{
int flag=0;
flag++;
return flag;
}
int getValue(void)
{
static int flag=0;
flag++;
return flag;
}
解释
前者每次调用getValue函数,flag都会被重新置0(每次调用函数,flag都=0);而后者第一次调用了getValue函数,flag被正常置0,当第二次调用此函数时,flag则不会被重新赋值,而是等于上一次调用的返回值。(第二次调用函数,flag=1,第三次调用,flag=2...)
接下来可以写不同模式的按键函数啦
①支持连按的一般思路
u8 KEY_Scan(void)
{
if(KEY按下)
{
delay_ms(10);//延时10-20ms,防抖。
if(KEY确实按下)
{
return KEY_Value;
}
return 无效值;
}
}
②不支持连续按
(思路:判断上一次的状态,如上一次是松开的状态,表示这次按下是有效的;上一次本就是按下的,表示这次按下的状态只是因为连按的影响,而不是真正的第二次按下,所以说这次就是无效的)
u8 KEY_Scan(void)
{
static u8 key_up=1; //因为key_up要保留上一次的值用来判断上一次按键的状态,所以不能被重新赋值
if(key_up && KEY按下)
{
delay_ms(10); //延时,防抖
key_up=0; //标记这次key已经按下,下一次调用函数,如果按键没有松开,则key_up一直为0,则按键无效
if(KEY确实按下)
{
return KEY_VALUE;
}
}else if(KEY没有按下) key_up=1; //判断按键没有被按下,key_up=1
return 没有按下
}
③两种模式合二为一
即有一个mode的入口参数,mode=1,支持连续按,mode=0,不支持连续按
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;
if(mode==1) key_up=1; //支持连续按,比上面那个函数写法只多了这一行
if(key_up && KEY按下)
{
delay_ms(10);//延时,防抖
key_up=0;//标记这次key已经按下
if(KEY确实按下)
{
return KEY_VALUE;
}
}else if(KEY没有按下) key_up=1;
return 没有按下
}
解释
mode=1,即支持连续按,key_up一直=1,则等于下面这种效果,即同①
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //无效
if(mode==1) key_up=1; //支持连续按
if(key_up && KEY按下)
{
delay_ms(10);//延时,防抖
key_up=0;//标记这次key已经按下
if(KEY确实按下)
{
return KEY_VALUE;
}
}else if(KEY没有按下) key_up=1;
return 没有按下
}