请教马老师在你的新书中,Demo_11_4练习中,两个按键消抖问题??
在P342页,两个按键K1和K2,当按K1按下,10ms延时后,如果K1仍按下则返回K1的返回值,但此时是K2按下(误动作)不是K1按下(K1松手),则返回K2的值,那么这样看来K2没有10ms延时去抖了!!谢谢!! 顶一顶!! 不知道可不可以直接把那个键盘扫描函数放在中断中执行,不用TIMEOK 标志 回LZ位:
这段程序没有考虑2个键同时按下的情况,但可以做稍微的修改,就能处理2键同时按下的情况了.
unsigned char read_key(void)
{
static unsigned char key_state = 0,key_old;
unsigned char key_press,key_return = key_no;
key_press = key_input & key_mask; // 读按键I/O电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (key_press != key_mask)
{
key_old = key_press;
key_state = key_state_1;
}
break; // 键被按下,状态转换到键确认态
case key_state_1: // 按键确认态
if (key_press == key_old)
{
if (key_press == 0b01000000) key_return = key_k1;
else if (key_press == 0b10000000) key_return = key_k2;
else key_return = key_k3; // 2个键按下
key_state = key_state_2; // 状态转换到键释放态
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press == key_mask) key_state = key_state_0;
break; //按键已释放,转换到按键初始态
}
return key_return;
}
回2楼:
键盘扫描函数可以放在中断中执行,但缺点是:
1.中断函数名不能返回结果
2.增加了中断执行的时间,如果有其它中断的话,就会延误中断的响应.能够不使用中断嵌套是最好的方法,这样每个中断的服务就要快.按键扫描耽误几个ms是没有问题的.一次按键的过程通常为300ms左右,不会丢失的.
主要考虑第2点,所以不提倡按键扫描放在中断中处理. 谢谢,马老师!!! 谢谢,回复的太晚了,已经完成多键处理和连_发了 记号 记号 记号 我最近在培训单片机,,,,讲师说,,机械开关接外部中断,,,如果采用脉冲触发方式中断,就不需要去抖动,,,我觉得不对,,,不知道你们们觉得呢??
页:
[1]