见无数教师、工程师、学生写的按键扫描程序,写的都是读引脚,有按键按下,delay(10ms),再读,直到按键释放。说实话这种代码就是垃圾!delay(10ms)MCU可以处理很多事情。如果MCU进入低功耗状态可以省很多能量(在这个叫嚣着绿色经济,节约能源的时代)。
我也拜读了Hopower的方案,该方案耗费太多RAM,同时无法识别多个按键同时按下的状况。
我曾经在某个杂志里读到一篇**是关于如何去抖的,这可能目前国内的工程师研究按键去抖比较好的,但是我还没有测试多个按键同时按下的状况。
系统中使用定时器进行1ms定时中断,在中断中 “K_Process ++;”,在主程序中轮询Read_Keys,根据K_Output输出的值是否为零判断是否有按键。
-----------------------------------------------------------------------------------------------------------------
#define K_Const 0x00 // 0~7位中某一位(bit)为1时,表示允许对应位的按键长时间按下则重复输出,
// 对应位为0表示该按键只允许单次按键按下
unsigned char K_Temp;
unsigned char K_Store;
unsigned char K_Ready;
unsigned char K_Process;
/*=================================================
Name : Read_Keys
OUT :
Description : If the key is confirmed, return 1,
else no key is pressed, return 0.
=================================================*/
unsigned char Read_Keys(void)
{
// unsigned char K_Input;
unsigned char K_Output;
if (K_Process < 20)
return 0;
K_Process = 0;
K_Output = ~P1 & 0x0F; // P0~P3为按键接口
K_Ready = K_Temp & K_Output | K_Ready & (K_Temp ^ K_Output); // 去抖表达式
K_Temp = K_Output;
K_Output = K_Ready & (~K_Store | K_Const); // 用于输出重复键和非重复键
K_Store = K_Ready;
return K_Output;
}
-----------------------------------------------------------------------------------------------------------------
但是这个中断去抖操作不是我看到的最好的按键去抖方案。考虑到别人版权问题,不便公开,大家可以去国外的某些论坛去看看,有些工程师曾经讨论过那个方案,国内的工程师的进取心和创新能力让人揪心啊! |