关于一种新的按键处理的思路,今天和应广的技术支持通了一个电话,讨论到了按键下理的问题,他和我说了有两种按键处理的方法,一种就是我用的那一种,即每10ms判断一次按键的情况,然后oldkey,newkey的方法,他还说了另一种更为简单的办法,当然这个也只能用在最简单的情况,他说每30ms判断一次按键的情况,如果按键是按下的情况那么就执行相应的按键处理程序,仔细分析一下他说的很有道理啊!!!
下面分析一下这种情况的可行性,首先无论是按键按下或是释放的时候都有一个抖动的时间,这个时间一般是10ms左右,首先从逻辑上来分析一下这个问题消抖的目的无非就是将这个不稳定的抖动的状态的多次高低电平的变化,使其只有作用一次低电平(假如这里是低电平有效)的相应的处理,条条大路通罗马,假如一第一个下降沿的时候单片机检测到这个低电平,而后是按键的处理程序,然后是按键处理的失能,想要再次使能按键的作用只有等待按键的再次变为高电平,试想如果这个检测的时间如果太短或太长的话会有什么情况,如果这个时间设置的太短的假如是1ms那么在这个10ms的时间里会他就会检测到10次,现在以最坏的情况一分析的话,如果按照原来的按键处理程序的话,按照最坏的情况就会有5次按键作用的情况,也就是说有5次高电平和5次低电平都被检测到了,有5次的按键使能故能最多作用5次的样子.假如这个时间足够长的话,比如检测一次要1年的时间,那么这其间的按键作用都会丢失掉,这是非常可怕的啊,其实这个时间在逻辑上只能大于10ms就行了,只要这个时间大于1倍的按键抖时间就能保证在这个抖动时间里按键最多只检测两次,而只有在抖动时间里按键的检测次数超过3次才能导致多次触发的情况发生,因为这个抖动的时间一共是20ms这个情况是在最坏的情况下考虑到的最坏的,最坏的情况下没有按键的多次作用那么在其他情况下也就更不会有按键的多次作用了.
下面直接上源代码:
/***************************************************************************************************
函数功能:扫描按键值,交将扫描到的按键触发信息转换成数字赋给Key_num
函数入口:无
函数出口:无
作者 :任丁
***************************************************************************************************/
void KeyScan(void)
{
if(KEY1==0&&KEY2==1&&KEY3==1)
{
key_num=1; //KEY1键按下,返回1
return;
}
elseif(KEY1==1&&KEY2==0&&KEY3==1)
{
key_num=2; //KEY2键按下,返回2
return;
}
elseif(KEY1==1&&KEY2==1&&KEY3==0)
{
key_num=3; //KEY3键按下,返回3
return;
}
elseif(KEY1==1&&KEY2==0&&KEY3==0)
{
key_num=4; //KEY2键和KEY3键同时按下,返回4
return;
}
|
|