演示openMSP430微控制器的GPIO中斷驅動:P2口輸出LED流水燈效果,P1.0按鍵中斷控制流水方向反轉。
#include "omsp_system.h"
volatile char shift = 0x01; // 全局狀態變量,控制流水方向
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // 關閉看門狗定時器
P2DIR = 0xff; // P2.0-P2.7 設置為輸出模式
P2OUT = shift; // 初始化P2輸出值
P1DIR = 0x00; // P1.0-P1.7 設置為輸入模式
P1IE = 0x01; // 啟用P1.0中斷
P1IES = 0x00; // 中斷沿選擇:0=上升沿,1=下降沿
P1IFG = 0x00; // 清除所有P1中斷標誌位
eint(); // 開啟全局中斷
while (1) {
if (P2OUT == 0x00) { // 若輸出為0,重置為初始值
P2OUT = shift;
} else if (shift == 0x01) { // 正向流水:左移
P2OUT = (P2OUT << 1);
} else { // 反向流水:右移
P2OUT = (P2OUT >> 1);
}
}
}
// P1口中斷服務程序
interrupt(PORT1_VECTOR) port1_isr(void) {
if (P1IFG & 0x01) { // 確認是P1.0觸發
shift ^= 0x81; // 翻轉最低位與最高位(0x01↔0x80),改變流水方向
P1IFG &= ~0x01; // 清除P1.0中斷標誌位
}
}
shift,確保主循環與中斷服務程序見到一致的最新值interrupt(PORT1_VECTOR)聲明ISR關聯P1口中斷向量P1IFG,否則會重複進入中斷shift ^= 0x81巧妙實現0x01(左移)與0x80(右移)狀態切換shift狀態決定移位方向,實現雙向流水燈