MSP430利用IO中斷方式來實現按鍵檢測

來源:互聯網
上載者:User

     
      /************************************************************************
       **********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濾波電路,實現按鍵防震的效果會更顯著此.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.