代碼:
1 #include <msp430f5529.h> //函數庫 2 int sum=0; //全局變量 3 int main(void) 4 { 5 volatile unsigned int i; //局部變量 6 //設置timerA相關參數 7 WDTCTL = WDTPW+WDTHOLD; // 關閉看門狗 8 P1DIR |= BIT2; // 將P1.2設置為輸出端口,驗證狀態 9 P2DIR |= BIT0; //P2.0輸出PWM波 10 TA0CCTL1 = OUTMOD_7; //將輸出模式選擇為模式7 11 TA0CTL = TASSEL_1 + MC_1 + TACLR ; //選擇ACLK時鍾源,timerA計數模式選擇up模式,計數到TA0CCR0,重置timerA計數器 12 TA1CCTL1 = OUTMOD_7; 13 TA1CTL = TASSEL_1 + MC_1 +TACLR ; 14 15 P1REN |= BIT7; // 使能端口1.7 16 P1OUT |= BIT7; // 選擇下拉模式 17 P1IES |= BIT7; // 1.7端口中斷觸發沿選擇下降沿,高到低觸發 18 P1IFG &= ~BIT7; // 1.7端口中斷寄存器清零 19 P1IE |= BIT7; // 1.7端口中斷使能 20 21 __bis_SR_register(GIE); //將GIE置1,打開全局中斷使能 22 23 while(1) // 采用switch,每一個case值對應一個狀態 24 { 25 switch (sum) 26 { 27 case 0: 28 P1OUT &= ~BIT2; //初始狀態為低功耗狀態 29 TA0CCR1 = 0; 30 __bis_SR_register(LPM3_bits); //將LPM3置1,使系統進入低功耗 31 break; //跳出switch函數 32 case 1: //選系統的默認時鍾,頻率為1MHZ。 33 P1OUT &= ~BIT2; //狀態1要求:轉到—60°,900微秒,設置的為1000微秒,時鍾頻率為32768Hz 34 TA0CCR0 = 20000; //驗證進入狀態1 35 TA0CCR1 = 10000; 36 TA1CCR0 = 100; //輸出PWM波周期 37 TA1CCR1 = 34; 占空比 38 P1DIR |=BIT2; 39 P1SEL |=BIT2; 40 P2DIR |=BIT0; 41 P2SEL |=BIT0; 42 break; 43 case 2: 44 P1OUT &= ~BIT2; //狀態2要求:轉到0°。1520微秒 45 TA0CCR0 = 20000; 46 TA0CCR1 = 5000; 47 TA1CCR0 = 100; 48 TA1CCR1 = 50; 49 P1DIR |=BIT2; 50 P1SEL |=BIT2; 51 P2DIR |=BIT0; 52 P2SEL |=BIT0; 53 break; 54 case 3: //時鍾為輔助時鍾ACLK,頻率為32768HZ 55 //P1OUT &= ~BIT2; //狀態3要求:轉到60° 2100微秒 56 TA0CCR0 = 20000; 57 TA0CCR1 = 800; 58 TA1CCR0 = 100; 59 TA1CCR1 = 66; 60 P1DIR |=BIT2; 61 P1SEL |=BIT2; //選擇1.2端口的復用功能,使之能夠實現亮和滅 62 P2DIR |=BIT0; 63 P2SEL |=BIT0; 64 break; 65 66 } 67 if(sum>3) //當sum的值超過3時,要讓sum減3,重新進入循環 68 { 69 sum=sum-3; 70 } 71 } 72 } 73 74 //采用S1中斷按鍵實現 75 #pragma vector=PORT1_VECTOR //端口p1的中斷函數 76 __interrupt void Port_1(void) 77 { 78 unsigned int push_key =0; 79 push_key == P1IFG & (P1IN); 80 __delay_cycles(20000); //精確時間延遲,乘以MCLK時鍾周期,防止抖動 81 if( push_key == (P1IN & BIT7)) 82 { 83 __low_power_mode_off_on_exit(); //SR寄存器置0,退出低功耗 84 sum=sum+1; // 按下p1.7,sum加1,周期變化一次 85 } 86 P1IFG &= ~BIT7; // p1.7中斷重置 87 }