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