历史上的今天
返回首页

历史上的今天

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

正在发生

2020年02月08日 | MSP430利用IO中断方式来实现按键检测

2020-02-08 来源:eefocus

/************************************************************************
**********MSP430F14-利用IO中断方式实现按键检测程序*********** 
以下是结合MC430F14开发板来实现的按键检处理程序实验。分别使用了采个三个按键接到MSP430的通用IO口,按任意一个按键可以使板上的LED反转。例程中,单片机一直处于最低功耗状态,用户可以通过按下按键后唤醒单片机。单片机唤醒后再进行去抖动动作,同时执行键处理程序;处理完后再次进入LPM4低功耗模式。


在本程序中用户可以灵活地修改程序来实现你相关的功能。

本程序适用在手持设备或电池供电的设计中。此程序结构比较通用,用户可参与或套用修改.

应用目标板:MC430F14x开发板
*************************************************************************/
      #include

      #define key1 0x01
      #define key2 0x02
      #define key3 0x04
      #define delay_small 200

      #define key_1 0xfe      //定义返回键值1
      #define key_2 0xfd      //定义返回键值2
      #define key_3 0xfb      //定义返回键值3

      void key_process_0(void);
      void key_process_1(void);
      void key_process_2(void);
      void key_check (void);
      unsigned char key_value;          //定义键值全局变量
      //*************************************************************************
      void main(void)
      {
       WDTCTL = WDTPW + WDTHOLD;              // 停止看门狗
       P1OUT |= BIT1;                         //关LED
       P1DIR |= BIT1;                        // 设置P1.1为输出

        //以下设置是采用不同的编写方式,新手可以参考使用
        P2IE |= BIT0+BIT1+BIT2;               // P2.0-P2.2 IO口中断使能
        P2IES |= 0x07;                        // P2.0-P2.2 IO口边沿触发中断方式设置,下降沿触发中断
        P2IFG &= ~(key1+key2+key3);           // P2.0-P2.2 IO口中断标志位清除  
        _EINT();                              //中断允许
        // 或直接写成 _BIS_SR(LPM4_bits + GIE);           
        LPM4;                                 // 进入低功耗LPM4,此时单片机功耗最低

       while(1)
       {
        P2IE &= ~(BIT0+BIT1+BIT2);        // P2.0-P2.2 IO口关闭中断允许
        P2IFG &= ~0x07;                   // P2.0-P2.2 IO口中断标志位清除
        key_check ();
        switch (key_value)                //对键值进行处理.采switch语法结构查询
         {
          case key_1: key_process_0();      //调用键处理程序1
                    break;
          case key_2: key_process_1();      //调用键处理程序2
                    break;  
          case key_3: key_process_2();      //调用键处理程序2
                    break;
          default:   break;                                     
         }
        key_value=0x00;                    //键值清除
        P2IE |= BIT0+BIT1+BIT2;            // P2.0-P2.2 IO口中断使能
        P2IFG &= ~0x07;                   // P2.0-P2.2 IO口中断标志位清除
        LPM4;
      }
     }

      //*************************************************************************
      //P2中断服务程序
      #pragma vector=PORT2_VECTOR
      __interrupt void Port_2(void)
      {  
        switch (P2IFG)
        {  
         case 0x01: key_value=0xfe;
                    break;
         case 0x02: key_value=0xfd;
                    break;
         case 0x04: key_value=0xfb;
                    break;    
         default:  P2IFG &= ~0x07;             // P2.0-P2.2 IO口中断标志位清除
                    break;           
        }
        P2IFG &= ~0x07;           // P2.0-P2.2 IO口中断标志位清除
        LPM4_EXIT;
      }


      //*************************************************************************
      void key_process_0(void)          //值处理,用户可以自己修改...
      {
       P1OUT ^= BIT1;  
      }
      //*************************************************************************
      void key_process_1(void)        //值处理,用户可以自己修改...
      {
       P1OUT ^= BIT1;  
      }
      //*************************************************************************
      void key_process_2(void)      //值处理,用户可以自己修改...
      {
       P1OUT ^= BIT1;  
      }

      //**************************************************************************
      void key_check (void)
      { unsigned int i;
        for(i=0;i        
        if(0xff !=(P2IN & 0xf8))           //是否有键存在?
         {
          while(0xff !=( P2IN | 0xf8));   //若有按键,一直等待按键松开(按键按下后,对应管脚输出入为1,退出while、if,标明一直有按键)
         }
        else
         key_value = 0x00;                //延时去抖动无键按下,则清除键变量.
      }  //如果在按键电路中加RC滤波电路,实现按键去抖动的效果会更显著此.


推荐阅读

史海拾趣

ALLIED [Allied Electronics]公司的发展小趣事

Allied Electronics,总部位于美国德克萨斯州的一家分销公司,专注于为各种行业提供电子元件和电子产品。以下是关于Allied Electronics发展的五个相关故事:

  1. 成立和初期发展: Allied Electronics成立于1928年,最初以销售家庭无线电零件和配件为主要业务。随着无线电和电子行业的发展,公司逐渐扩大了产品范围,开始提供更广泛的电子元件和设备,以满足不断增长的市场需求。

  2. 与RS Components的合并: 2000年,Allied Electronics与英国的RS Components公司合并,成为全球领先的电子元件分销商之一。这一合并加强了两家公司在全球市场的地位,并且拓展了它们的产品线和客户群。

  3. 公司战略调整: 随着数字化技术的快速发展,Allied Electronics逐渐调整了业务战略,加大了对电子元件和器件的供应,并拓展了工业自动化、物联网和电子制造等领域的业务。通过与各种行业的合作伙伴建立紧密的关系,公司不断提升了产品质量和服务水平。

  4. 技术创新和数字化转型: Allied Electronics致力于技术创新和数字化转型,通过建立先进的电子商务平台和在线资源中心,为客户提供更便捷的采购体验。同时,公司还加强了与供应商的合作关系,引入了更多的创新产品,满足不同客户的需求。

  5. 持续发展和全球扩张: 作为全球领先的电子元件分销商之一,Allied Electronics不断加大在全球范围内的市场扩张力度,开设了多个销售办事处和物流中心,以更好地服务于全球客户。同时,公司还积极参与行业展会和活动,加强了与全球电子行业的合作与交流,推动了公司的持续发展和壮大。

GTE Microcircuits公司的发展小趣事
减少噪声的方法包括选用低噪声系数的放大器、优化电路布局以减少电磁干扰(EMI)、以及在关键信号路径上使用屏蔽和滤波技术。同时,合理设计电源去耦网络,避免电源噪声对电路的影响也是关键。
品赞(G-Switch)公司的发展小趣事
电路结构相对简单,易于实现和维护。
General Magnetics Inc公司的发展小趣事
采用更高效的电路拓扑结构,减少功率损耗。
Anderson Power公司的发展小趣事
定期对电子变压器进行维护检查,如清理灰尘、检查连接线路等,以确保其长期稳定运行。
ADI(亚德诺半导体)公司的发展小趣事
通过听电子变压器运行时的声音,可以初步判断是否有异常。如声音异常,应进一步检查内部元件。

问答坊 | AI 解惑

我决定了,自己学单片机!

总以军人自居,面对绝对权威的老师,老师是好老师,但是价格要1600,多亏考试时间紧就推迟了,当初我也没去捉摸,现在想来真是太浪费了。要自己搞!…

查看全部问答>

请教高手一个问题

在一次拷贝PCB资料的时候,拷了一个PCB文件后,我直接打开,但是提示有license错误,最终的结果是此PCB不能保存,可以进行修改等基本操作,就是不能保存!此后我电脑上的所有PCB文件都有这个问题,真是哭死!但是从我同事那里传过来的PCB文件我又可 ...…

查看全部问答>

网络变压器HR汉仁

壞尐孩 中山市汉仁电子有限公司(HanRun)成立于1999年, 2001年通过ISO9001:2000国际质量体系认证,2006年通过ISO14001:2004环境体系认证,2008年成功通过中山市科技局、中山市发改局和中山市经贸局的评审,并被批准组建中山市工程技术研究开发中 ...…

查看全部问答>

嵌入式学习推荐书籍

Linux基础 1、《Linux与Unix Shell 编程指南》 【 51CTO推荐在线观看:《Linux标准教程》 】 C语言基础 1、《C Primer Plus,5th Edition》【美】Stephen Prata着 2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan Da ...…

查看全部问答>

vs 2005 WinCE 仿真环境建立问题

我安装了WinCE 4.2 EVC,ActiveSync 在这个环境下,是可以进行WinCE仿真调试的。       程序是EVC自己传到仿真环境里的 后来又安装了VS 2005,在VS 2005中,建立了WinCE简单的演示程序, 但是在运行时,没有WinCE的模拟器可 ...…

查看全部问答>

请教ARM7 lpc2378和uda1341实现录音的问题

买的是周立功的开发板,用的codec是uda1341ts,可以正常放音,但是不能录音,我是用mic通过uda1341的通道1输入,但是在uda1341的输出端18脚,一直检测不到信号,不知道问题出在哪了。 下面是uda1341初始化的设置,请高手帮我看看,分析下原因,谢 ...…

查看全部问答>

急!ghost分区备份误选了local-disk-from,分区全不见了!

急!ghost分区备份误选了local-disk-from tmage结果重新启动后只剩下一c盘了,能找回其他盘数据吗?xp系统,用矮人dos4.5版本系统备份,误选了local-disk-from tmage,80g的硬盘,现在可用空间显示69.1g,我的d,e,f盘数据是不是全部丢失了? ...…

查看全部问答>

从0开始学习TI--M3……2

GPIO部分: 811的GPIO能够承受5V的电平,可以与5V供电的方面的交流。其中特别需要注意的是在1000以下的系列中,PB7\\PC0\\PC1\\PC2\\PC3与JTAG复用,对于811需要特别注意一旦锁死意味着芯片报废,对于1000以上的系列用到这些IO需要先进行解锁操作。 ...…

查看全部问答>

一个单电源转换正负电源电路

一般音响电器工作时,需要提供正负电源。但在汽车、轮船、火车等运载工具上只能用蓄电池供电,这里介绍一款电源电路,希望对大家有所帮助。该电源电路由震荡器、反相器、推动器和整流及滤波器等部分组成,电路工作原理如图所示 震荡器   &nb ...…

查看全部问答>