本帖最后由 cov0xt 于 2015-12-15 09:44 编辑
单片机的反应速度比人类快得多,所以要2次检测按键是否按下,并延迟一段时间,才算确定按键按下,教程里给了如下代码:
unsigned char Key_Scan()
{
unsigned char keyValue = 0 , i; //保存键值
//--检测按键1--//
if (GPIO_KEY != 0xFF) //检测按键K1是否按下
{
Delay10ms(1); //消除抖动
if (GPIO_KEY != 0xFF) //再次检测按键是否按下
{
keyValue = GPIO_KEY;
i = 0;
while ((i<50) && (GPIO_KEY != 0xFF)) //检测按键是否松开
{
Delay10ms(1);
i++;
}
}
}
return keyValue; //将读取到键值的值返回
}
问题来了,我认为该代码的松手检测,是没有必要的。
该代码表示,在500毫秒内,如果松手了,则不用等完所有的500毫秒。
我觉得人类不可能在500毫秒内,完成松手动作,还不如不检测松手,直接等上500毫秒呢,松手代码直接改为:Delay10ms(50);
unsigned char Key_Scan()
{
unsigned char keyValue = 0i; //保存键值
//--检测按键1--//
if (GPIO_KEY != 0xFF) //检测按键K1是否按下
{
Delay10ms(1); //消除抖动
if (GPIO_KEY != 0xFF) //再次检测按键是否按下
{
keyValue = GPIO_KEY;
Delay10ms(50);
}
}
return keyValue; //将读取到键值的值返回
} |