基于MSP430F5529的按键消抖问题

注:板子:MSP430F5529 开发环境:CCSv5

上一篇博文发了按键中断的例程和详细的注释,但是好像把程序烧进单片机之后执行效果并不是很好:每按一次按键灯的状态不一定只改变一次,有时灯本来是亮的,按一次后还是亮的;或者按下去之后灯灭了,按键抬起来之后灯又亮了。
造成该现象的原因就是按键的抖动问题。
按键的抖动一般是机械性抖动,当开关断开或闭合时接触点处不会一下子接通也不会一下子断开,而是会产生轻微的抖动导致电路的多次接通和断开,这个过程大致会持续5ms-10ms。想像一下如果中断程序是瞬间完成的,那么接触点每抖动一下都会引起一次中断,所以就会引起按下按键后灯的状态改变次数是不确定的,也就是效果和我们的预期不一致;由于按下和抬起时都会有抖动产生,所以就会出现按下去灯灭,抬起来灯亮的情况。

知道了抖动产生的原因,我们就可以思考解决的办法了。

1、延时消抖

很显然如果中断的反应不要那么快,是不是就可以避免这个问题了呢?那么有一个办法就是把中断程序的执行时间延长,让中断执行的慢一点,这样在第一次触发中断后cpu去执行中断程序,当抖动引发的中断请求发出时中断标志位IFG已经被置位所以这些中断请求相当于被覆盖掉了,从而达到消抖的目的。
于是我们的中断程序为

#pragma vector = PORT2_VECTOR
__interrupt void Port_2 () {
	__delay_cycles(10000);            //延时消抖 所传递参数为cpu周期
	P1OUT |= BIT0;
}

似乎是可以

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值