|
初学MSP430要会的按键控制串口发送数据程序
[复制链接]
#include
//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 接收中断使能
}
|
|