2017-05-13 27 views
0
#include <msp430.h> 

#define BUTTON BIT3 // Port 1.3 
#define REDLED BIT0 // Port 1.0 
#define GRNLED BIT6 // Port 1.6 

#define ZERO 0x08 
#define ONE  0x48 
#define TWO  0x09 
#define THREE 0x49 

int counter = 0; 

int main(void) { 


// Watchdog setup 
WDTCTL = WDTPW + WDTHOLD; // stop watchdog (password + hold counter) 

// LED initial setup 
P1DIR |= REDLED + GRNLED;    // set P1.0 and P1.6 as output (1) pins 
P1OUT &= ~REDLED;      // Disable REDLED 
P1OUT &= ~GRNLED;      // Disable GRNLED 

// Button setup 
P1DIR &= ~BUTTON;      // button is an input 
P1OUT |= BUTTON;      // pull-up resistor 
P1REN |= BUTTON;      // resistor enabled 

P1IE |= 0x08;       //P1.3 interrupt enable 
P1IES &= ~0x08;       //lower edge 
P1IFG &= ~0x08;      //zero flag 
while(1){ 


    } 
} 
#pragma vector=PORT1_VECTOR 
__interrupt void Port_1(void){ 
     counter += 1; 
     counter = (counter % 4); 
     switch(counter){ 
      case 0: 
       P1OUT = ZERO; 
       break; 
      case 1: 
       P1OUT = ONE; 
       break; 
      case 2: 
       P1OUT = TWO; 
       break; 
      case 3: 
       P1OUT = THREE; 
       break; 
     } 

     P1IFG &= ~0x08; 
} 

我不能進入閏年例程。我檢查中斷標誌,當我按下按鈕標誌將1但LED不變,我認爲我不能輸入interrup.If我可以, LED必須改變。錯誤是什麼?中斷與C

+0

你有一箇中斷處理程序。但是,你如何安裝它,我的意思是,你如何告訴主板在中斷時調用這個例程? –

回答

3

程序啓動時,全局中斷在默認情況下處於禁用狀態。您需要添加在main()末尾設置全局中斷使能(GIE)位的代碼。最獨立於平臺(不是真正的)的方法是調用__enable_interrupts()函數。

#include <msp430.h> 
#include <intrinsics.h> 
... 
__enable_interrupts(); 

或者,直接設置GIE位:

__bis_status_register(GIE); 

要檢查中斷是否允許(不是中斷處理程序,他們總是會被默認禁用內):

if (__get_SR_register() & GIE) { 
    printf("interrupts enabled\n"); 
} else { 
    printf("interrupts disabled\n"); 
}