📄 uart.c
字号:
#include <msp430x14x.h>
#include "uart.h"
#include "key_scan.h"
//定义串口操作变量
// 串口 1 的接收标志
char nRev_UART1;
// 串口 1 的发送缓冲区
char UART1_TX_BUF[60];
int nSend_TX1;
int nTX1_Len;
char nRX1_Len;
char nRX1_Len_temp;
char nTX1_Flag;
int nRes_UART1;
void Init_UART1(void)
{
//将寄存器的内容清零
U1CTL = 0X00;
//数据位为8bit
U1CTL += CHAR;
//将寄存器的内容清零
U1TCTL = 0X00;
//波特率发生器选择SMCLK
U1TCTL += SSEL1;
//波特率为57600
UBR0_1 = 0X8B;
UBR1_1 = 0X00;
//调整寄存器
UMCTL_1 = 0X00;
//使能UART1的TXD和RXD
ME2 |= UTXE1 + URXE1;
//使能UART1的RX中断
IE2 |= URXIE1;
//使能UART1的TX中断
IE2 |= UTXIE1;
//设置P3.6为UART1的TXD
P3SEL |= BIT6;
//设置P3.7为UART1的RXD
P3SEL |= BIT7;
//P3.6为输出管脚
P3DIR |= BIT6;
return;
}
void Init_Port(void)
{
P5DIR = 0XFF;
P5SEL = 0X00;
P5OUT = get_code(8);
P4DIR = 0XFF;
P4SEL = 0X00;
P4OUT = get_code(8);
P1DIR = 0X0F;
P1SEL = 0X00;
//将所有的管脚在初始化的时候设置为输入方式
P3DIR = 0;
//将所有的管脚设置为一般I/O口
P3SEL = 0;
return;
}
void Init_CLK(void)
{
unsigned int i;
//将寄存器的内容清零
//XT2震荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
BCSCTL1 = 0X00;
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1
BCSCTL2 = 0X00; //将寄存器的内容清零
BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
}
///////////////////////////////////////
// 处理来自串口 1 的发送中断
#pragma vector=UART1TX_VECTOR
__interrupt void UART1_TX_ISR(void)
{
if(nTX1_Len != 0)
{
// 表示缓冲区里的数据没有发送完
nTX1_Flag = 0;
TXBUF1 = UART1_TX_BUF[nSend_TX1];
nSend_TX1 += 1;
if(nSend_TX1 >= nTX1_Len)
{
nSend_TX1 = 0;
nTX1_Len = 0;
nTX1_Flag = 1;
}
}
}
void delay_us(unsigned int t)
{
while(--t>0)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
void delay_ms(unsigned int t)
{
while(t-->0)
delay_us(999);
}
void main(void)
{
// 关闭看门狗
WDTCTL = WDTPW + WDTHOLD;
nRev_UART1 = 0;
nSend_TX1 = 0;
// 关闭中断
_DINT();
// 初始化时钟
Init_CLK();
// 初始化端口
Init_Port();
// 初始化串口1
Init_UART1();
// 打开中断
_EINT();
// 进入处理循环
for(;;)
{
switch( Key_Scan() )
{
case 0:
{
UART1_TX_BUF[0] = 'k';
UART1_TX_BUF[1] = 'e';
UART1_TX_BUF[2] = 'y';
UART1_TX_BUF[3] = '0';
UART1_TX_BUF[4] = ' ';
UART1_TX_BUF[5] = 13;
nTX1_Len = 6;
// 设置中断标志,进入发送中断程序
IFG2 |= UTXIFG1;
nRX1_Len = 0;
delay_ms(200);
break;
}
case 1:
{
UART1_TX_BUF[0] = 'k';
UART1_TX_BUF[1] = 'e';
UART1_TX_BUF[2] = 'y';
UART1_TX_BUF[3] = '1';
UART1_TX_BUF[4] = ' ';
UART1_TX_BUF[5] = 13;
nTX1_Len = 6;
// 设置中断标志,进入发送中断程序
IFG2 |= UTXIFG1;
nRX1_Len = 0;
delay_ms(200);
break;
}
case 2:
{
UART1_TX_BUF[0] = 'k';
UART1_TX_BUF[1] = 'e';
UART1_TX_BUF[2] = 'y';
UART1_TX_BUF[3] = '2';
UART1_TX_BUF[4] = ' ';
UART1_TX_BUF[5] = 13;
nTX1_Len = 6;
// 设置中断标志,进入发送中断程序
IFG2 |= UTXIFG1;
nRX1_Len = 0;
delay_ms(200);
break;
}
case 3:
{
UART1_TX_BUF[0] = 'k';
UART1_TX_BUF[1] = 'e';
UART1_TX_BUF[2] = 'y';
UART1_TX_BUF[3] = '3';
UART1_TX_BUF[4] = ' ';
UART1_TX_BUF[5] = 13;
nTX1_Len = 6;
// 设置中断标志,进入发送中断程序
IFG2 |= UTXIFG1;
nRX1_Len = 0;
delay_ms(200);
break;
}
default: break;
}//switch
}//for(;;)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -