普通按键和电容按键扫描函数
当我今天学习电容按键时,我发现扫描函数中的扫描函数mode我不明白。我在网上查询后了,特此记录。我看到的博客地址是:点击这里
现阶段主要接触的按键函数有普通按键扫描函数和 扫描电容按钮的函数如下:
普通按键函数
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 1; else if(KEY1==0)return 2; else if(WK_UP==1)return 3; }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return 0;// 按按键按下///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/ }
其他地方很容易理解。我主要谈谈mode的应用。
在这个函数中mode0时不支持连按,当mode一时支持连按。每次只有当key_up只有在1时才能扫描按钮,如果是mode==1.每次进入函数都会key_up1,即每次执行此函数都是有效的(注意)key_up是static的,也就是它的值不会随着函数生命周期的结束而结束)。如果不支持连按,只有当所有按钮都没有按下时。key_up才会置1。也就是说,所有按钮松开后的下一个按钮必须有效。
电容按键函数
#define TPAD_GATE_VAL 100 u8 TPAD_Scan(u8 mode) {
static u8 keyen = 0;
u8 times = 3, res = 0;
u16 retVal;
if(mode) {
keyen = 0;
times = 6;
}
retVal = TPAD_Get_MaxVal(times);
if(retVal > (tpad_default_value + TPAD_GATE_VAL)) {
if(keyen == 0) res = 1;
keyen = 3;
}
if(keyen) keyen--;
return res;
}
支持连按还是很好理解,主要是为什么当mode == 0 的时候是不支持连按的(其实也挺好理解的,主要是我太笨了),当mode=0的时候,当执行过一次有效扫描后keyen=3;然后keyen–后变成2,如果这时候我们的手没有松开,那么下一次执行这个函数的时候仍然会进入
if(retVal > (tpad_default_value + TPAD_GATE_VAL)) {
if(keyen == 0) res = 1;
keyen = 3;
}
这个判断语句体,也就是说keyen又会被置为3,也就是如果我们的手没有松开,那么keyen永远不会等于0,所以永远无效。
如果我们的手松开了,那么keyen就不会被置为3了,就会随着keyen–的执行逐渐变为0,最终有效。