#include "msp430x11x1.h"
#define uint unsigned int #define uchar unsigned char
unsigned short *sptr; // Stack pointer extern void getsptr (void); // Get Stack Pointer
uchar interrupt_flag; uint times;
interrupt[PORT2_VECTOR] void P2_ISR(void); interrupt[WDT_VECTOR] void watchdog_timer(void);
void delay(uchar k) { uchar i;
for(i=0;i<k;i++); }
void beep(void) { P1OUT |= BIT3; // beep on delay(120); P1OUT &= ~BIT3; // beep off }
void reset_port(void) { P1OUT &= ~BIT0; P1OUT &= ~BIT1; P1OUT &= ~BIT2; P1OUT &= ~BIT3;
P2OUT &= ~BIT1; P2OUT &= ~BIT2; }
void sleep(void) { P2IES |= BIT0; //P2.0 interrupt hi->low edge P2IFG &= ~BIT0; //P2.0 IFG cleared P2IE |= BIT0; //P2.0 interrupt enabled
getsptr(); // Get the current stack pointer - 2 sptr-=1; IE1 &= ~WDTIE; // disable WDT interrupt
reset_port(); LPM4; }
void main(void) { uchar i;
WDTCTL = WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1; // Set Watchdog Timer interval to 0.5ms
P1DIR |= BIT0; P1DIR |= BIT1; P1DIR |= BIT2; P1DIR |= BIT3;
P2DIR &= ~BIT0; //设为on/off按钮输入 P2DIR |= BIT1; P2DIR |= BIT2;
reset_port(); P2IES |= BIT0; //P2.0 interrupt hi->low edge P2IFG &= ~BIT0; //P2.0 IFG cleared P2IE |= BIT0; //P2.0 interrupt enabled
delay(250);
_EINT(); // Enable Interrupts
sleep(); //进入低功耗
beep(); //提示
times=0; IE1 |= WDTIE; // Enable WDT interrupt
interrupt_flag=0;
if((P2IN&BIT0) != BIT0 ) //当on/off按钮按着超过5秒后进入低功耗 { times=0; while((P2IN&BIT0) != BIT0 ) { if( times>6000 ) //5s { beep(); sleep(); break; } } }
while(1) {
IE1 |= WDTIE; // Enable WDT interrupt interrupt_flag=0; ....... if( times > 12000 ) { beep(); sleep(); }
} } interrupt[PORT2_VECTOR] void P2_ISR(void) { // Exit LPM4, disable P2.0 interrupt P2IE &= ~BIT0; //P2.0 interrupt disabled P2IFG &= ~BIT0; //P2.0 IFG cleared
interrupt_flag=1;
*sptr &= ~(SCG1+SCG0+OSCOFF+CPUOFF); // Clear LPM4 from the stacked status register
beep(); }
interrupt[WDT_VECTOR] void watchdog_timer(void) { times++;
}
(文章推荐人:电池)
|