MSP430利用IO中断方式来实现按键检测


     
      /************************************************************************
       **********MSP430F14-利用IO中断方式实现按键检测程序***********
       以下是结合MC430F14开发板来实现的按键检处理程序实验。分别使用了采个三个按键接到MSP430的通用IO口,按任意一

       个按键可以使板上的LED反转。例程中,单片机一直处于最低功耗状态,用户可以通过按下按键后唤醒单片机。单片机唤

       醒后再进行去抖动动作,同时执行键处理程序;处理完后再次进入LPM4低功耗模式。
       在本程序中用户可以灵活地修改程序来实现你相关的功能。
       本程序适用在手持设备或电池供电的设计中。此程序结构比较通用,用户可参与或套用修改.
       应用目标板:MC430F14x开发板
      *************************************************************************/
      #include <msp430x14x.h>

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

你可能感兴趣的:(IO,vector,IE,delay)