MSP430按鍵控制串列埠傳送資料
阿新 • • 發佈:2019-02-12
#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 接收中斷使能
}
//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 接收中斷使能
}