MSP430F169(三) ---- 使用UART实现PC与单片机的数据收发并在1602 液晶显示

Dolly ·
更新时间:2024-11-10
· 966 次阅读

本代码需要注意的细节 每次字符串的发送时间至少间隔三秒,发送的字符的数量最好在32个以内,防止数据接收不全。 本代码波特率的设置为1200.如果波特率设置过高,会出现数据接收不全的问题。我试过9600的波特率,会出现问题。读者可以自行修改代码,实现更高的传输速率。 有关的细节会在代码中说明 代码实现 主函数 #include #include "Config.h" #include "LCD.h" #include "Init.h" #include "UART.h" //#include "stdlib.h" 本来想用全局指针来存储接收的数据 // 结果发现自己用不来........ //#include "string.h" //unsigned char a[60]; int main(void) { WDTCTL = WDTPW | WDTHOLD; //停止看门狗 Clock_Init(); //系统时钟设置 LCD_Port_init(); //LCD IO初始化 delay_ms(100); //延时100ms, LCD_init(); //液晶参数初始化设置 LCD_clear(); //清屏 UART_Init(); //串口设置初始化 _EINT(); //开中断 Print_Str("DM430-L Board UART Test...\n");//发送字符串测试,使用串口助手显示 while(1) { LPM0; //采用低功耗模式接收中断 } } UART.C配置 /* * UART.c * * Created on: 2020年4月20日 * Author: qq_rowosr */ #include "UART.h" #include "stdlib.h" //#include "string.h" //#include "LCD.h" //extern unsigned char a[60]; //串口初始化 void UART_Init() { U0CTL|=SWRST + CHAR; //复位SWRST,8位数据模式 U0TCTL|=SSEL1; //SMCLK为串口时钟 U0BR1=0X1A; //BRCLK=8MHZ,Baud=BRCLK/N U0BR0=0X0A; //N=UBR+(UxMCTL)/8 U0MCTL=0x00; //微调寄存器为0,波特率1200bps ME1|=UTXE0; //UART0发送使能 ME1|=URXE0; //UART0接收使能 U0CTL&=~SWRST; IE1|=URXIE0; //接收中断使能位 P3SEL|= BIT4 + BIT5; //设置IO口为第二功能模式,启用UART功能 P3DIR|= BIT4; //设置TXD0口方向为输出 } void Send_Byte(uchar data) { while(!(IFG1&UTXIFG0)); //发送寄存器空的时候发送数据 U0TXBUF=data; } //************************************************************************* // 串口0发送字符串函数 //************************************************************************* void Print_Str(uchar *s) { while(*s != '\0') { Send_Byte(*s++); } } //************************************** // 中断函数 //************************************** #pragma vector=USART0RX_VECTOR __interrupt void UART0_RX_ISR(void) { LPM0_EXIT; //退出低功耗 uchar data = 0; data = U0RXBUF; //接收到的数据存起来 Send_Byte (data); //将接收到的数据再发送出去 Display_Character_String(data); //在1602显示接收的字符 } UART.h /* * UART.h * * Created on: 2020年4月20日 * Author: QQ_rowosr */ #ifndef UART_H_ #define UART_H_ #include #include "Config.h" void Print_Str(uchar *s); void Send_Byte(uchar data); void UART_Init(); #endif /* UART_H_ */ LCD.h /* * 1602.h * * Created on: 2020年4月20日 * Author: QQ_rowosr */ #ifndef LCD_H_ #define LCD_H_ #include #include "Config.h" void LCD_Port_init(); void LCD_write_com(unsigned char com); void LCD_write_data(unsigned char data); void LCD_clear(void); void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s); void LCD_write_char(unsigned char x,unsigned char y,unsigned char data); void LCD_init(void); void Display_Character_String(unsigned char data); #endif /* 1602_H_ */ LCD.c /* * 1602.c * * Created on: 2020年4月20日 * Author: QQ_rowosr */ #include "LCD.h" //************************************************************************* // 初始化IO口子程序 //************************************************************************* void LCD_Port_init() { P4SEL = 0x00; P4DIR = 0xFF; //数据口输出模式 P5SEL = 0x00; P5DIR |= BIT5 + BIT6 + BIT7; //控制口设置为输出模式 } //*********************************************************************** // 显示屏命令写入函数 //*********************************************************************** void LCD_write_com(unsigned char com) { RS_CLR; RW_CLR; EN_SET; DataPort = com; //命令写入端口 delay_us(100); EN_CLR; } //*********************************************************************** // 显示屏数据写入函数 //*********************************************************************** void LCD_write_data(unsigned char data) { RS_SET; RW_CLR; EN_SET; DataPort = data; //数据写入端口 delay_us(100); EN_CLR; } //*********************************************************************** // 显示屏清空显示 //*********************************************************************** void LCD_clear(void) { LCD_write_com(0x01); //清屏幕显示 delay_ms(5); } //*********************************************************************** // 显示屏字符串写入函数 //*********************************************************************** void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_write_com(0x80 + x); //第一行显示 } else { LCD_write_com(0xC0 + x); //第二行显示 } while (*s) { LCD_write_data( *s); s ++; } } //*********************************************************************** // 显示屏单字符写入函数 //*********************************************************************** void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) { if (y == 0) { LCD_write_com(0x80 + x); //第一行显示 } else { LCD_write_com(0xC0 + x); //第二行显示 } LCD_write_data( data); } //*********************************************************************** // 显示屏初始化函数 //*********************************************************************** void LCD_init(void) { LCD_write_com(0x38); //显示模式设置 delay_ms(5); LCD_write_com(0x08); //显示关闭 delay_ms(5); LCD_write_com(0x01); //显示清屏 delay_ms(5); LCD_write_com(0x06); //显示光标移动设置 delay_ms(5); LCD_write_com(0x0C); //显示开及光标设置 delay_ms(5); } //************************************ // 字符串显示函数 //*********************************** void Display_Character_String(unsigned char data) { static int i = 0; static int y = 0; if (i % 2 == 0) //第一行显示 { LCD_write_com (0x80 + y); LCD_write_data (data); y++; if (y == 16){ i++;y = 0;} } else //第二行显示 { LCD_write_com (0xc0 + y); LCD_write_data (data); y++; if (y == 16) { i++ ; y = 0; delay_ms(1000); //读者可以自行设置延时时间,但是两次发送字符串的间隔时间,大于你设置的延时时间 LCD_clear(); //接收到32个字符,清屏 } } } Config.h /* * Config.h * * Created on: 2020年4月20日 * Author: QQ_rowosr */ #ifndef CONFIG_H_ #define CONFIG_H_ #define CPU_F ((double)8000000) //外部高频晶振8MHZ //#define CPU_F ((double)32768) //外部低频晶振32.768KHZ #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //自定义数据结构,方便使用 #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //8个LED灯,连接在P6口,可通过断开电源停止使用,ADC使用时断开电源 #define LED8DIR P6DIR #define LED8 P6OUT //P6口接LED灯,8个 //4个独立按键连接在P10~P13 #define KeyPort P1IN //独立键盘接在P10~P13 //串口波特率计算,当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数 #define baud 9600 //设置波特率的大小 #define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率计算公式 #define baud_h (uchar)(baud_setting>>8) //提取高位 #define baud_l (uchar)(baud_setting) //低位 //RS485控制管脚,CTR用于控制RS485处于收或者发状态 #define RS485_CTR1 P5OUT |= BIT2; //控制线置高,RS485发送状态 #define RS485_CTR0 P5OUT &= ~BIT2; //控制线置低,RS485接收状态 //2.8寸TFT彩屏显示控制相关硬件配置 #define RS_CLR P5OUT &= ~BIT5 //RS置低 #define RS_SET P5OUT |= BIT5 //RS置高 #define RW_CLR P5OUT &= ~BIT6 //RW置低 #define RW_SET P5OUT |= BIT6 //RW置高 #define RD_CLR P5OUT &= ~BIT7 //E置低 #define RD_SET P5OUT |= BIT7 //E置高 #define CS_CLR P5OUT &= ~BIT0 //CS置低 #define CS_SET P5OUT |= BIT0 //CS置高 #define RST_CLR P5OUT &= ~BIT3 //RST置低 #define RST_SET P5OUT |= BIT3 //RST置高 #define LE_CLR P5OUT &= ~BIT1 //LE置低 #define LE_SET P5OUT |= BIT1 //LE置高 //2.8寸TFT彩屏触摸屏控制相关硬件配置 #define PEN_CLR P2OUT &= ~BIT0 //PEN置低,触碰触摸屏时,Penirq引脚由未触摸时的高电平变为低电平 #define PEN_SET P2OUT |= BIT0 //PEN置高 #define PEN (P2IN & 0x01) //P2.0输入的值 #define TPDO_CLR P2OUT &= ~BIT1 //TPDO置低 #define TPDO_SET P2OUT |= BIT1 //TPDO置高 #define TPDOUT ((P2IN>>1)&0x01) //P2.1输入的值 #define BUSY_CLR P2OUT &= ~BIT3 //BUSY置低 #define BUSY_SET P2OUT |= BIT3 //BUSY置高 #define TPDI_CLR P2OUT &= ~BIT4 //TPDI置低 #define TPDI_SET P2OUT |= BIT4 //TPDI置高 #define TPCS_CLR P2OUT &= ~BIT5 //TPCS置低 #define TPCS_SET P2OUT |= BIT5 //TPCS置高 #define TPCLK_CLR P2OUT &= ~BIT6 //TPCLK置低 #define TPCLK_SET P2OUT |= BIT6 //TPCLK置高 //彩屏/12864液晶/1602液晶的数据口,三液晶共用 #define DataDIR P4DIR //数据口方向 #define DataPort P4OUT //P4口为数据口 //12864/1602液晶控制管脚 #define RS_CLR P5OUT &= ~BIT5 //RS置低 #define RS_SET P5OUT |= BIT5 //RS置高 #define RW_CLR P5OUT &= ~BIT6 //RW置低 #define RW_SET P5OUT |= BIT6 //RW置高 #define EN_CLR P5OUT &= ~BIT7 //E置低 #define EN_SET P5OUT |= BIT7 //E置高 #define PSB_CLR P5OUT &= ~BIT0 //PSB置低,串口方式 #define PSB_SET P5OUT |= BIT0 //PSB置高,并口方式 #define RST_CLR P5OUT &= ~BIT1 //RST置低 #define RST_SET P5OUT |= BIT1 //RST置高 //12864应用指令集 #define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H #define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置 #define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动) #define FUN_MODE 0x30 //工作模式:8位基本指令集 #define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白 #define DISPLAY_OFF 0x08 //显示关 #define CURSE_DIR 0x14 //游标向右移动:AC=AC+1 #define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH #define SET_DD_AC 0x80 //设置DDRAM AC #define FUN_MODEK 0x36 //工作模式:8位扩展指令集 //颜色代码,TFT显示用 #define White 0xFFFF //显示颜色代码 #define Black 0x0000 #define Blue 0x001F #define Blue2 0x051F #define Red 0xF800 #define Magenta 0xF81F #define Green 0x07E0 #define Cyan 0x7FFF #define Yellow 0xFFE0 //NRF2401模块控制线 #define RF24L01_CE_0 P1OUT &=~BIT5 //CE在P15 #define RF24L01_CE_1 P1OUT |= BIT5 #define RF24L01_CSN_0 P2OUT &=~BIT7 //CS在P27 #define RF24L01_CSN_1 P2OUT |= BIT7 #define RF24L01_SCK_0 P3OUT &=~BIT3 //SCK在P33 #define RF24L01_SCK_1 P3OUT |= BIT3 #define RF24L01_MISO_0 P3OUT &=~BIT2 //MISO在P32 #define RF24L01_MISO_1 P3OUT |= BIT2 #define RF24L01_MOSI_0 P3OUT &=~BIT1 //MOSI在P31 #define RF24L01_MOSI_1 P3OUT |= BIT1 #define RF24L01_IRQ_0 P1OUT &=~BIT4 //IRQ在P14 #define RF24L01_IRQ_1 P1OUT |= BIT4 //DS18B20控制脚,单脚控制 #define DQ_IN P1DIR &= ~BIT7 //设置输入,DS18B20接单片机P53口 #define DQ_OUT P1DIR |= BIT7 //设置输出 #define DQ_CLR P1OUT &= ~BIT7 //置低电平 #define DQ_SET P1OUT |= BIT7 //置高电平 #define DQ_R P1IN & BIT7 //读电平 //红外接收头H1838控制脚,单脚控制 #define RED_IN P1DIR &= ~BIT6 //设置输入,红外接收头接单片机PE3口 #define RED_OUT P1DIR |= BIT6 //设置输出 #define RED_L P1OUT &= ~BIT6 //置低电平 #define RED_H P1OUT |= BIT6 //置高电平 #define RED_R (P1IN & BIT6) //读电平 #endif /* CONFIG_H_ */ Init.h /* * Init.h * * Created on: 2020年4月20日 * Author: QQ_rowosr */ #ifndef INIT_H_ #define INIT_H_ #include #include "Config.h" void Clock_Init_Inc() { uchar i; // DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO // BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL DCOCTL = 0x60 + 0x00; //DCO约3MHZ,3030KHZ BCSCTL1 = DIVA_0 + 0x07; BCSCTL2 = SELM_2 + DIVM_0 + SELS + DIVS_0; } //*********************************************************************** // 系统时钟初始化,外部8M晶振 //*********************************************************************** void Clock_Init() { uchar i; BCSCTL1&=~XT2OFF; //打开XT2振荡器 BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{ IFG1&=~OFIFG; //清楚振荡器错误标志 for(i=0;i<100;i++) _NOP(); } while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待 IFG1&=~OFIFG; } #endif /* INIT_H_ */
作者:qqrowosr



f1 uart 数据 单片机

需要 登录 后方可回复, 如果你还没有账号请 注册新账号