1. 程式人生 > >MSP430按鍵控制串列埠傳送資料

MSP430按鍵控制串列埠傳送資料

#include <msp430.h>
//MSP430G2553  - 使用USCI_A0,Up Mode, DCO SMCLK
//
//  介紹: 該程式利用USCI_A0來與計算機通訊 通過接在P1.3口的按鍵來實現按一次傳送一個數據
//  波特率9600,資料格式8N1
//
//  ACLK = 32768, SMCLK = 32768  MCLK =  DCO-16M
//
//               MSP430G2553
//            -----------------
//        /|\|              XIN|-
//         | |                 |
//         --|RST          XOUT|-
//           |                 |
//           |         P1.0/TA1|-->led
//
//  使用 MSP430 LaunchPad , MSP430G2553晶片
//CCS5.2編譯通過,P1.3內部上拉一定要開啟,不然會沒反應
//******************************************************************************

void CLK_Init(void);
void USCIA0_Init(void);
void GPIO_Init(void);
void putchar(unsigned char tx_data);
void putstr(char *s);


unsigned char RX_DATA;
char *string1="Hello430!";
char string2[]="iamzhanhaibo!\n";    //\n是換行符


void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;        // Stop WDT
    CLK_Init();
    GPIO_Init();
    USCIA0_Init();
    //_EINT();//開總中斷
    __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}

// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=PORT1_VECTOR
__interrupt void P1_3ISR(void)
{
    P1IFG &= ~BIT3;//中斷標誌位清零
    P1OUT ^= BIT6;//P1.6狀態翻轉
    IE2 &= ~UCA0RXIE;   //傳送時先關閉接收中斷,不接收
    while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready? 等待TX buffer為空
    UCA0TXBUF = 0x08;                    // TX -> RXed character  傳送字元c
    IE2 |= UCA0RXIE;    //傳送完了開啟接收中斷
}

/*#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
    while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready? 等待TX buffer為空
    UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character  傳送接收到的資料
    RX_DATA=UCA0RXBUF;
    if(RX_DATA&0x01){
        P1OUT |= BIT0;
        putstr(string1);
        putstr(string2);
    }
    else
        P1OUT &= ~BIT0;
}*/

void putchar(unsigned char tx_data)    //傳送字元函式
{
    while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready? 等待TX buffer為空
    UCA0TXBUF = tx_data;                    // TX -> RXed character  傳送字元c
}

void putstr(char *s)   //傳送字串函式
{
    IE2 &= ~UCA0RXIE;   //傳送時先關閉接收中斷,不接收
    //如果沒有發完,就繼續迴圈傳送
    while((*s)!='\0'){
        putchar(*s);
        s++;
    }
    IE2 |= UCA0RXIE;    //傳送完了開啟接收中斷
}

void GPIO_Init(void)
{
    P1DIR = BIT0 + BIT6;    //p1.0,p1.6外接LED為輸出狀態
    P1OUT &= ~(BIT0 + BIT6);

    P1SEL  = BIT1 + BIT2 ;           // P1.1 = RXD, P1.2=TXD
    P1SEL2 = BIT1 + BIT2;             //第二外圍模式選擇

    P1REN |= BIT3; //pull up
    P1OUT |= BIT3;
    P1IE  |= BIT3;       //P1.3中斷使能
    P1IES |= BIT3;       //P1.3下降沿有效
    P1IFG &= ~BIT3;      //P1.3中斷標誌位清零

}

void CLK_Init(void)
{
    BCSCTL3 |= LFXT1S_0;
    if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF){
        while(1);
    }
    BCSCTL1 = CALBC1_1MHZ;          // Set DCO 為1MHz
    DCOCTL = CALDCO_1MHZ;
}

void USCIA0_Init(void)
{
    UCA0CTL1 |= UCSSEL_1;      //ACLK
    UCA0BR0 = 3;                              // ACLK 32768Hz 9600   32768Hz/9600 = 3.41
    UCA0BR1 = 0;                              // 32768Hz 9600
    UCA0MCTL = UCBRS1 + UCBRS0;               // Modulation UCBRSx = 3  模式控制暫存器
    UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**  初始化釋放,可以操作
    IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt  接收中斷使能
}