2017-05-13 32 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"); 
}