// UART1 测试程序范例,本范例给出了初始化UART的示范并演示了如何把一个数组里的数据发送
// 到超级终端,同时检测接收到的数据,并把接收到的数据发送的超级终端显示。
#include <uart.h>
#include <p30F3011.h>
unsigned int recdata;
unsigned int CMDHandS[]={0xAA,0x00,0xCC,0x33,0xC3,0x3C,0xFE}; //握手指令
unsigned int CMDCOLOR[]={0xAA,0x40,0x00,0x1F,0xFF,0xFF,0xCC,0x33,0xC3,0x3C,0xFE}; //设置调色板
unsigned int CMDSTA[]={0xAA,0xE0,0x55,0xAA,0x5A,0xA5,0x00,0x07,0x20,0xCC,0x33,0xC3,0x3C,0xFE}; //触摸使能
//---------------------------------------------------------------------------
// 配置字设置
_FOSC(CSW_FSCM_OFF & XT_PLL4); // 晶体XT振荡,带4xPLL, 关闭时钟丢失监控
_FWDT(WDT_OFF); // 关闭看门狗
_FBORPOR(PBOR_OFF & MCLR_EN); // 关闭掉电复位, 允许外部复位MCLR
_FGS(CODE_PROT_OFF); // 关闭代码保护
//---------------------------------------------------------------------------
#define BAUDRATE 115200 // 波特率设置,超级终端需要设置为9600-8-N-1-N
#define FCY 7372800 // 晶体 = 7.3728Mhz; PLLx4
#define SW1 PORTEbits.RE8 // 按键1定义,按键为常高(“1”),按下接地(“0”)
#define LF 0x0A // 换行符
#define CR 0x0D // 回车符
#define NULL 0x00 // 空字符
void InitUART1(void); // 申明UART1初始化程序
void send_str(unsigned int *p);
// UART1 TX 发送中断入口
void __attribute__((__interrupt__)) _U1TXInterrupt(void)
{
while(U1STAbits.TRMT==0);
IFS0bits.U1TXIF = 0; // 清零UART1发送中断标志位
}
// UART1 RX 接收中断入口
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
while(U1STAbits.URXDA==1)
{
recdata = U1RXREG;
U1TXREG = recdata; // 把从PC机键盘敲入的字符显示到超级终端上
}
IFS0bits.U1RXIF = 0; // 清零UART1接收中断标志位
}
int main(void)
{
char Txdata[] = {'U','a','r','t','1',' ','T','e','s','t',CR,LF,NULL};
unsigned char TxIndex;
InitUART1(); // 初始化 UART1
TRISE = 0xFFFF; // 设置PORTA为输入,为按键SW1做准备
while(1) // 设置一个死循环
{
TxIndex = 0; //数组下标值清零,指向数组里的第一个数据
while (SW1); //当SW1按下的时候启动传输
send_str(CMDHandS); //握手
send_str(CMDCOLOR);
while (!SW1); //等待SW1按键放开
send_str(CMDSTA); //触摸使能
//while (Txdata[TxIndex]) // 当发送数据为 NULL 字符的时候结束
// {
// WriteUART1((int)Txdata[TxIndex++]); //调用外设库函数发送字符
// while(BusyUART1()); // 等待移位寄存器里的数据发送结束
// }
while(1);
}
} // 回到主循环
void InitUART1(void)
{
unsigned int baudvalue;
unsigned int U1MODEvalue;
unsigned int U1STAvalue;
CloseUART1();
ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 & UART_TX_INT_EN & UART_TX_INT_PR2);
U1MODEvalue = UART_EN & UART_IDLE_CON & UART_DIS_WAKE & UART_DIS_LOOPBACK &
UART_EN_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT;
U1STAvalue = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE &
UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR ;
baudvalue = ((FCY/16)/BAUDRATE) - 1 ; // 设置波特率发生器值
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue) ; // 启动UART1
}
//发送一个固定的数据串到串口,0xFE为数据串结尾
void send_str(unsigned int *p)
{
for(;*p!=0xFE;p++)
{
WriteUART1(*p);
while(BusyUART1());
}
}