我们在用中科芯32位MCU CKS32F103C8T6设计产品的时候,经常会用到按键开关。通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,单片机如果在触点抖动期间检测按键的通断状态,则可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,从而引起误处理。因此,为了确保单片机对一次按键动作只作—次响应,就必须考虑如何消除按键抖动。
消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。按键的消抖,可用硬件或软件两种方法。硬件方法一般是在按键上并联一个电容,利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。但实际应用中,这种方式的效果往往不是很好,而且还增加了成本和电路复杂度。软件方法,使用最多也是最简单的是加一个延时函数,就是当检测到按键状态变化后,先等待一个10ms左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。但实际应用中,这种做法实时性较差,因为这样会占用单片机的执行时间。所以我们这里提出一个新的方法,启用一个定时中断,每2ms进一次中断,扫描一次按键状态并且存储起来,连续扫描8次后,看看这连续8次的按键状态是否是一致的。8次按键的时间大概是16ms,这16ms内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的阶段,而非处于抖动的阶段。中断函数部分程序代码如下:
34002掌中宝 void IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
T_250us_cnt++;
if ( T2_250us_cnt >= 8 )
{
34002掌中宝 T2_250us_cnt = 0;
static u8 Keybuf1 = 0xff,WG_AKeyBuf = 0xff;
Keybuf1 = ( ( Keybuf1 << 1 ) | GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_5) );
if ( 0x00 == Keybuf1 ) {
}
Key1Sta = 0;
}
34002掌中宝 else if ( 0xff == Keybuf1 )
{
34002掌中宝 Key1Sta = 1;
}
else
}
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
}
}
此方法来处理按键抖动,效果很好。当然还有更多更好的方法,程序是多样的,本文只是给大家提供一个思路。
本方来源于世强元件网站
点
击
隐
藏