延时5ms达不到消抖的目的,尤其是在EMC中大量存在尖峰脉冲时,给你个思路
#define KEY_TIME 10
unsigned char key_num =0;//键值
void keyscan(void)
{
static unsigned char key[6]={0,0,0,0,0,0};//假设有6个按键
if (KEY1STAT() == 0) {//0表示有键按下
key[0]++;
if (key[0] >= KEY_TIME) {
key[0] = KEY_TIME;
}
return;
} else {
if (key[0] >= KEY_TIME) {
key_num = 1;//键值
}
key[0] = 0;
}
//1,2,3,4。。。依次类推
}
基本思路是:连续判断按键状态,有键按下count++,无键count=0(或者--,这样可以消除误弹起),当count加到KEY_TIME时,说明有键按下,
可以使用10ms中断调用scan函数,通常手动按键的时间约为200ms,可根据灵敏度调节KEY_TIME的值
|