一、支持连续按:
u8 KEY_Scan(void)
{
if(KEY按下)
{
delay_ms(10);//延时10-20ms,防抖。
if(KEY确实按下)
{
return KEY_Value;
}
return 无效值;
}
}
流程图如下
这种思路很简单,就是通过一直扫描,然后判断按键是否按下,如果按下就返回有效值,否则返回无效值。所以这种方式支持按键连续按。
二、不支持连续按:
u8KEY_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 没有按下
}
这种思路也比较容易理解,那就是通过静态局部变量的key_up的引入,key_up的作用就是记录上一次按键的状态,当上一次key_up=1的时候就代表按键处于没有按下的状态,而如果key_up的值为0,则表明按键已经按下,这次函数就不会进入确认按键是否按下的语句。总结一下就是如果上次按键没有按下,而现在检测到按键按下,就把key_up赋0,并且返回判断过的值。否则就赋1.
三、通过一个形参,把两个函数和为一个函数
u8 KEY_Scan(u8mode)
{
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,则支持连续按,否则不支持连续按。