历史上的今天
返回首页

历史上的今天

今天是:2025年03月08日(星期六)

2020年03月08日 | 基于MSP430F5529的按键消抖问题

2020-03-08 来源:eefocus

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


上一篇博文发了按键中断的例程和详细的注释,但是好像把程序烧进单片机之后执行效果并不是很好:每按一次按键灯的状态不一定只改变一次,有时灯本来是亮的,按一次后还是亮的;或者按下去之后灯灭了,按键抬起来之后灯又亮了。


造成该现象的原因就是按键的抖动问题。

按键的抖动一般是机械性抖动,当开关断开或闭合时接触点处不会一下子接通也不会一下子断开,而是会产生轻微的抖动导致电路的多次接通和断开,这个过程大致会持续5ms-10ms。想像一下如果中断程序是瞬间完成的,那么接触点每抖动一下都会引起一次中断,所以就会引起按下按键后灯的状态改变次数是不确定的,也就是效果和我们的预期不一致;由于按下和抬起时都会有抖动产生,所以就会出现按下去灯灭,抬起来灯亮的情况。


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


1、延时消抖

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

于是我们的中断程序为


#pragma vector = PORT2_VECTOR

__interrupt void Port_2 () {

__delay_cycles(10000);            //延时消抖 所传递参数为cpu周期

P1OUT |= BIT0;

}


似乎是可以的,设置按键下降沿触发中断,按下后避过抖动时间然后改变灯的状态,但是还有按键抬起呢?抬起时的抖动一样会触发中断,这时我们可以加一条语句


#pragma vector = PORT2_VECTOR

__interrupt void Port_2 () {

__delay_cycles(10000);            //延时消抖 所传递参数为cpu周期

if((P2IN & BIT1)==0) {

P1OUT ^= BIT0;

}

P2IFG &= ~BIT1;

}


判断延时后按键处于按下状态时才改变灯的状态,否则就不变。

如果想上升沿触发中断的话就改一下判断条件就好了。


2、利用定时器

还有一个办法,就是不用按键去触发中断,而是定时检测按键的状态。

当按键按下后,电平状态为 高—低—高,那么我们就去不停的检测按键的电平状态,若发现电平由高变低,那么改变灯的状态就好了。

利用定时器,每隔10ms左右(可调整)去检测按键电平,用两个变量分别记录上一次的状态和本次的状态,发现符合条件就改变灯的状态。

具体实现如下:


#include  

int main(void) {

    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

P1DIR |= BIT0;

P2DIR &= ~BIT1;


P2OUT |= BIT1;

P2REN |= BIT1;

TA0CTL |= TASSEL_1 + MC_1 + TAIE + TACLR;

TA0CCR0 = 32;

__bis_SR_register(LPM4_bits + GIE);

return 0;

}

#pragma vector=TIMER0_A1_VECTOR

__interrupt void TIMER0_A1_ISR() {

static unsigned char key_now=0;

unsigned char key_past=0;

key_past=key_now;

if(P2IN & BIT1) key_now=1;

else key_now=0;

if(key_now==0&&key_past==1) P1OUT ^= BIT0;

TA0CTL &= ~TAIFG;

}


推荐阅读

史海拾趣

Enovation Controls LLC公司的发展小趣事

由于篇幅限制,我无法直接为您提供5个完整的、每篇至少500字的Enovation Controls LLC公司发展起来的相关故事。但我可以概述5个关键事件或阶段,这些事件对于Enovation Controls LLC公司的发展起到了重要作用。

  1. EControls的成立与专长

Enovation Controls LLC的前身可以追溯到1994年成立的EControls公司。由Kennon Guglielmo博士创立,EControls专注于为发动机和车辆行业的OEM提供完整的发动机控制解决方案的设计、工程和生产。凭借其在发动机控制领域的专业技术和经验,EControls逐渐在行业中树立了领先地位。

  1. EControls与FW Murphy的合并

2009年,EControls与FW Murphy合并,成立了Enovation Controls LLC。FW Murphy是一家历史悠久的公司,由Frank W. "Pat" Murphy于1939年创立,专注于发动机仪表和保护的创新。这次合并将EControls的发动机控制技术与FW Murphy的仪器和显示功能相结合,为客户提供了更为全面和先进的发动机控制、保护和监控解决方案。

  1. 创新传统的建立

Enovation Controls继承了FW Murphy的开拓精神和对简单、可靠发动机保护的追求。公司拥有一支由300多名员工组成的多元化国际团队,他们通过全球销售、制造和应用工程业务为世界各地的客户提供服务。这种全球化的布局和多元化的团队为Enovation Controls的创新和发展提供了强大的支持。

  1. 业务部门的拓展

合并后,Enovation Controls经营着四个业务部门:动力控制、车辆技术、天然气生产控制和燃料系统。这些业务部门覆盖了广泛的行业和应用领域,包括离路车辆、娱乐和商业船只、农业和水泵、发电、工业和移动设备等。通过不断拓展业务领域和深化技术应用,Enovation Controls在电子行业中建立了稳固的地位。

  1. 新产品的推出与市场反响

Enovation Controls不断推出新产品和技术创新,以满足客户不断变化的需求。例如,在2016年推出的TEC-10控制器就是一款为工业需求量身定制的控制器。这款控制器具有强大的功能和灵活性,适用于各种应用场景。由于其出色的性能和易用性,TEC-10控制器在市场上获得了广泛的好评和认可。

这些事件和阶段共同构成了Enovation Controls LLC公司发展起来的重要历程。通过不断创新、拓展业务领域和推出新产品,Enovation Controls在电子行业中取得了显著的成就和地位。

Anderson Power Products公司的发展小趣事

Anderson Power Products(APP)是一家专注于电源连接器和配件的制造商,以下是该公司发展的相关故事:

  1. 公司成立与初期阶段:Anderson Power Products成立于1936年,总部位于美国华盛顿州斯特林。最初,公司主要从事电源连接器的制造和销售。创始人是William M. Anderson和Harold J. McKenzie,他们致力于提供高质量、可靠的连接器产品,以满足不断增长的市场需求。

  2. 技术创新与产品发展:随着市场的不断变化和技术的进步,Anderson Power Products不断进行技术创新和产品开发。公司推出了一系列新型的电源连接器和配件产品,包括Powerpole®连接器、SB®连接器等,这些产品具有高功率密度、高可靠性和易用性的特点,得到了广大客户的青睐。

  3. 客户合作与市场拓展:Anderson Power Products与全球各个行业的客户建立了长期稳定的合作关系。公司的客户群涵盖了汽车、航空航天、工业、能源等多个领域。通过与客户的紧密合作,Anderson Power Products不断拓展市场份额,提升品牌知名度,成为电源连接器领域的领先供应商之一。

  4. 全球布局与生产基地:为了更好地服务全球客户,Anderson Power Products在全球建立了多个生产基地和销售办事处。除了在美国的总部外,公司还在欧洲、亚洲等地区设立了生产工厂和销售办事处,以满足不同地区客户的需求。这些生产基地拥有先进的设备和技术,能够为客户提供高质量的连接器产品。

  5. 持续创新与未来展望:作为一家专注于电源连接器的公司,Anderson Power Products将继续致力于技术创新和产品发展。公司将不断推出适应市场需求的新产品,提升生产效率和产品质量,以满足客户不断变化的需求。同时,Anderson Power Products也将继续关注行业的发展趋势和技术变革,不断调整战略,保持在行业内的竞争优势。

Crosspoint Solutions公司的发展小趣事

在电子行业的激烈竞争中,Crosspoint Solutions公司凭借一项革命性的技术创新脱颖而出。公司研发出一款高度集成的交叉点开关芯片,该芯片在数据传输速度和稳定性上均达到了行业领先水平。这一创新迅速吸引了各大电子设备制造商的注意,公司因此获得了大量订单,市场份额迅速扩大。

Central Semiconductor公司的发展小趣事

在20世纪70年代末,当许多半导体制造商纷纷转向硅器件的生产时,Central Semiconductor却洞察到了后缘半导体市场的空白。公司决定坚守锗器件的生产,并凭借这一决策填补了市场空白。这种对旧技术的坚持不仅让Central在一段时间内保持了竞争优势,也为公司在后续发展中积累了宝贵的经验。

随着技术的进步,Central并没有固步自封,而是逐渐将产品系列扩展到包括表面安装设备等更先进的产品。这种转型不仅满足了市场对小型化产品的需求,也展示了Central对市场变化的敏锐洞察和适应能力。

DAYA公司的发展小趣事

随着全球化趋势的加速,大雅智能积极实施国际化战略,拓展海外市场。通过与国外知名企业的合作与交流,大雅智能引进先进技术和管理经验,不断提升自身的核心竞争力。同时,大雅智能还积极参加国际展览和论坛活动,展示其创新成果和产品实力。这些努力让大雅智能在国际舞台上崭露头角,为全球消费者提供更多优质的电子产品。

ENSIGN公司的发展小趣事

ENSIGN不仅关注传统电子行业的发展,还积极探索新的业务领域。最近,ENSIGN集团宣布收购位于亚利桑那州的医疗保健园区River Park Post Acute和Elmwood Senior Living,以及其他七家公司。这一收购标志着ENSIGN正逐步向医疗保健领域进军,寻求多元化的发展机会。

问答坊 | AI 解惑

A/D转换按键4,关于上下限参数设定?

#include \"reg51.h\" #include \"intrins.h\" sbit p24=P2^4;//数码管位控制口 sbit p25=P2^5; sbit p26=P2^6; sbit p27=P2^7; sbit p23=P2^3;//控制灯 sbit eoc=P2^2; sbit oe=P2^0; sbit ale_start=P2^1;//A/D转换口 sbit p10=P1^0;// ...…

查看全部问答>

有关恒流源研制的资料

有关恒流源研制的资料…

查看全部问答>

WinCE6.0的手写输入法有哪些?

如题 WinCE6.0下,有些什么手写输入法,哪位兄弟弄过,提点一下。 名字?全屏/部分屏?开源/商业版?商业版的license大概怎么样?…

查看全部问答>

请教TCPMP问题

我用的掌微A4的方案,编译的TCPMP在CE 5.0上面播放没问题,但是在CE6上面总是出现致命错误,无论DirectDraw还是GDI方式都会出现错误(播放mp3是第二次打开程序时出错) 但是调试时没有办法跟踪到具体代码,咨询一下有经验的大侠,能指点一下是哪个 ...…

查看全部问答>

关于GPRS无线数据传输的问题!

领导安排了一项工作,我又是新手,特来此请教,不胜感激。 在野外有一些设备的运行数据通过GPRS DTU数据传输模块传到公司的计算机上,并编写数据的分析软件加以分析。 设备数据在一些专用测试仪中,可以通过串口传给DTU模块。 问题1:DTU将通过S ...…

查看全部问答>

我要做一个带有语音提示功能的系统该用什么开发?

我要做一个带有语音提示功能的系统该用什么开发?…

查看全部问答>

低频交流采样及波形显示的设计

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑 求帮助解决啊!谢谢各位!  …

查看全部问答>

关于在lm3s系列实现uip1.0的dhcp协议,

各位,我要在lm3s8965实现uip的dhcpc协议,在主函数main里边我初始化了dhcp,以下语句(没有定义USE_STATIC_IP):   #ifndef USE_STATIC_IP    //    // Initialize the DHCP Client Application.  &nbs ...…

查看全部问答>

A 240w monolithic class d audio amplifier output stage

本帖最后由 dontium 于 2015-1-23 13:16 编辑 A 240w monolithic class d audio amplifier output stage   …

查看全部问答>

求一个闲置了的EKS-LM3S811是EKS哦!再求一个stm32的最小系统吧

所求如题,有的话加我qq295973228,注意是eks不是EK哦!!!…

查看全部问答>