#include <msp430.h> //函數庫
int sum=0; //全局變量
int main(void)
{
volatile unsigned int i; //局部變量
//設置timerA相關參數
WDTCTL = WDTPW+WDTHOLD; // 關閉看門狗
P1DIR |= BIT2; // 將P1.2設置為輸出端口,驗證狀態
P2DIR |= BIT0; //P2.0輸出PWM波
TA0CCTL1 = OUTMOD_7; //將輸出模式選擇為模式7
TA0CTL = TASSEL_1 + MC_1 + TACLR ; //選擇ACLK時鐘源,timerA計數模式選擇up模式,計數到TA0CCR0,重置timerA計數器
TA1CCTL1 = OUTMOD_7;
TA1CTL = TASSEL_1 + MC_1 +TACLR ;
P1REN |= BIT7; // 使能端口1.7
P1OUT |= BIT7; // 選擇下拉模式
P1IES |= BIT7; // 1.7端口中斷觸發沿選擇下降沿,高到低觸發
P1IFG &= ~BIT7; // 1.7端口中斷寄存器清零
P1IE |= BIT7; // 1.7端口中斷使能
__bis_SR_register(GIE); //將GIE置1,打開全局中斷使能
while(1) // 采用switch,每一個case值對應一個狀態
{
switch (sum)
{
case 0:
P1OUT &= ~BIT2; //初始狀態為低功耗狀態
TA0CCR1 = 0;
__bis_SR_register(LPM3_bits); //將LPM3置1,使系統進入低功耗
break; //跳出switch函數
case 1: //選系統的默認時鐘,頻率為1MHZ。
P1OUT &= ~BIT2; //狀態1要求:轉到—60°,900微秒,設置的為1000微秒,時鐘頻率為32768Hz
TA0CCR0 = 20000; //驗證進入狀態1
TA0CCR1 = 10000;
TA1CCR0 = 100; //輸出PWM波周期
TA1CCR1 = 34; 占空比
P1DIR |=BIT2;
P1SEL |=BIT2;
P2DIR |=BIT0;
P2SEL |=BIT0;
break;
case 2:
P1OUT &= ~BIT2; //狀態2要求:轉到0°。1520微秒
TA0CCR0 = 20000;
TA0CCR1 = 5000;
TA1CCR0 = 100;
TA1CCR1 = 50;
P1DIR |=BIT2;
P1SEL |=BIT2;
P2DIR |=BIT0;
P2SEL |=BIT0;
break;
case 3: //時鐘為輔助時鐘ACLK,頻率為32768HZ
//P1OUT &= ~BIT2; //狀態3要求:轉到60° 2100微秒
TA0CCR0 = 20000;
TA0CCR1 = 800;
TA1CCR0 = 100;
TA1CCR1 = 66;
P1DIR |=BIT2;
P1SEL |=BIT2; //選擇1.2端口的復用功能,使之能夠實現亮和滅
P2DIR |=BIT0;
P2SEL |=BIT0;
break;
}
if(sum>3) //當sum的值超過3時,要讓sum減3,重新進入循環
{
sum=sum-3;
}
}
}
//采用S1作為按鍵實現
#pragma vector=PORT1_VECTOR //端口p1的中斷函數
__interrupt void Port_1(void)
{
unsigned int push_key =0;
push_key == P1IFG & (P1IN);
__delay_cycles(20000); //精確時間延遲,乘以MCLK時鐘周期,防止抖動
if( push_key == (P1IN & BIT7))
{
__low_power_mode_off_on_exit(); //SR寄存器置0,退出低功耗
sum=sum+1; // 按下p1.7,sum加1,周期變化一次
}
P1IFG &= ~BIT7; // p1.7中斷重置
}
|