说明下面正点原子按键扫描函数逻辑思路
u8 KEY_Scan(u8 mode)
{
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(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; //标记按键已经被释放
return 0;// 无按键按下
}
1. static u8 key_up=1;静态变量key_up初始化,说一下静态变量,如下图1所示,切记不是说声明为静态变量后,其值就是一直不变的。初始化一般来讲可以随意赋值,这里不影响。
图1
2.main主函数第一次调用时(key=KEY_Scan(0);),key_up被初始化为1,此时如果有按键按下,进入if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))语句,key_up被赋值为0,并且返回返回值参与下一步的逻辑运算,此时等待此次操作结束,再次调用key=KEY_Scan(0);函数时,key_up被再次赋值为1,如果此时再有按键按下,继续上述的操作。
总结来讲,上述(u8 KEY_Scan(u8 mode))函数主要时检测是否有按键按下的函数,如果有按键按下,并且返回到底是那个按键按下。(所以说可以看到key_up在大部分条件判断下,都被赋值为1,因为要保证进入按键是否按下的检测函数)