按键扫描(支持连续按)的一般思路
u8 KEY_Scan(void)
{
if(KEY按下)
{
delay_ms(10);//延时10-20ms,防抖。
if(KEY确实按下)
{
return KEY_Value;
}
return 无效值;
}
}
按键扫描(不支持连续按)的一般思路
static 关键字
定义一个静态变量,兼具静态存储的局部变量。和自动变量具有相同的作用域,但当包含这些变量的函数完成工作时,它们并不消失
u8 KEY_Scan(void)
{
static u8 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 没有按下
}
static u8 key_up=1; 语句并不是函数的一部分,因为静态变量和全局变量在程序调入内存是就已经就位了。运行函数是static u8 key_up=1; 看起来是跳过了。key_up的存储类是空连接的静态。
函数中 static u8 key_up=1; 定义后,当KET_Scan运行结束后,key_up并不消失,而是保留了赋予的0值,函数下一次运行时仍旧是执行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 没有按下
}
支持连续按时,在if(key_up && KEY按下)判断语句外,key_up 都会等于1,一直返回KEY_VALUE,
不支持连续按,if(mode==1) key_up=1;失效,按下一次后,key_up=0,不会返回KEY_VALUE。