| 
 
新手上路 
 
	积分47金钱47 注册时间2017-4-29在线时间12 小时 | 
 
1金钱 
| 请问各位大佬,我将光盘里的两个例程叠加之后想做一个,通过电脑串口助手发送一个字符串给单片机,单片机处理后显示在12864液晶上上,为什么此程序只显示最后一个字符并且时不时还有乱码?附代码: 
 
 #include <msp430x14x.h>
 #include "Config.h"
 
 //*************************************************************************
 //                        初始化IO口子程序
 //*************************************************************************
 void Port_Init()
 {
 P4SEL = 0x00;
 P4DIR = 0xFF;
 P5SEL = 0x00;
 P5DIR|= BIT0 + BIT1 + BIT5 + BIT6 + BIT7;
 PSB_SET;                  //液晶并口方式
 RST_SET;                  //复位脚RST置高
 
 LED8SEL  = 0x00;                      //设置IO口为普通I/O模式,此句可省
 LED8DIR  = 0xFF;                      //设置IO口方向为输出
 LED8PORT = 0xFF;                      //P2口初始设置为FF
 
 DATASEL  = 0x00;                      //设置IO口为普通I/O模式,此句可省
 DATADIR  = 0xFF;                      //设置IO口方向为输出
 DATAPORT = 0xFF;                      //P4口初始设置为FF
 
 CTRSEL  =  0x00;                      //设置IO口为普通I/O模式,此句可省
 CTRDIR |=  BIT3 + BIT4;               //设置IO口方向为输出,控制口在P63,P64
 CTRPORT =  0xFF;                      //P6口初始设置为FF
 }
 
 //***********************************************************************
 //        显示屏命令写入函数
 //***********************************************************************
 void LCD_write_com(unsigned char com)
 {
 RS_CLR;
 RW_CLR;
 EN_SET;
 DataPort = com;
 delay_ms(5);
 EN_CLR;
 }
 
 //***********************************************************************
 //        显示屏数据写入函数
 //***********************************************************************
 void LCD_write_data(unsigned char data)
 {
 RS_SET;
 RW_CLR;
 EN_SET;
 DataPort = data;
 delay_ms(5);
 EN_CLR;
 }
 
 //***********************************************************************
 //        显示屏清空显示
 //***********************************************************************
 
 void LCD_clear(void)
 {
 LCD_write_com(0x01);
 delay_ms(5);
 }
 
 //***********************************************************************
 //函数名称:DisplayCgrom(uchar hz)显示CGROM里的汉字
 //***********************************************************************
 void DisplayCgrom(uchar addr,uchar *hz)
 {
 LCD_write_com(addr);
 delay_ms(5);
 while(*hz != '\0')
 {
 LCD_write_data(*hz);
 hz++;
 delay_ms(5);
 }
 
 }
 
 //***********************************************************************
 //        显示屏初始化函数
 //***********************************************************************
 void LCD_init(void)
 {
 LCD_write_com(FUN_MODE);                        //显示模式设置
 delay_ms(5);
 LCD_write_com(FUN_MODE);                        //显示模式设置
 delay_ms(5);
 LCD_write_com(DISPLAY_ON);                        //显示开
 delay_ms(5);
 LCD_write_com(CLEAR_SCREEN);                        //清屏
 delay_ms(5);
 }
 
 //*************************************************************************
 //               串口初始化
 //*************************************************************************
 void UART_Init()
 {
 U0CTL|=SWRST + CHAR;                //复位SWRST,8位数据模式
 U0TCTL|=SSEL1;                      //SMCLK为串口时钟
 U0BR1=baud_h;                       //BRCLK=8MHZ,Baud=BRCLK/N
 U0BR0=baud_l;                       //N=UBR+(UxMCTL)/8
 U0MCTL=0x00;                        //微调寄存器为0,波特率9600bps
 ME1|=URXE0;                         //UART0接收使能
 U0CTL&=~SWRST;
 IE1|=URXIE0;                        //接收中断使能位
 
 P3SEL|= BIT4 + BIT5;                //设置IO口为第二功能模式,启用UART功能
 P3DIR|= BIT4;                       //设置TXD0口方向为输出
 }
 /*
 void Display(uchar *s)
 {
 uchar arr[100];
 uint i;
 for(i=0;*(s+i)!='\0';i++)
 *(arr+i)=*(s+i);
 *(arr+i)='\0';
 DisplayCgrom(0x80,arr);
 }
 */
 //*************************************************************************
 //               处理来自串口0的接收中断
 //*************************************************************************
 
 #pragma vector=UART0RX_VECTOR
 __interrupt void UART0_RX_ISR(void)
 {
 
 uchar data=0;
 //uchar add=0x80;
 data=U0RXBUF;                       //接收到的数据存起来
 /*
 while(data!=' ')
 {
 DisplayCgrom(add,&data);
 }
 add++;
 */
 DisplayCgrom(0x80,&data);
 }
 
 //***********************************************************************
 //      主程序
 //***********************************************************************
 void main(void)
 {
 WDT_Init();                                   //看门狗设置
 Clock_Init();                                 //系统时钟设置
 UART_Init();                                  //串口设置初始化
 Port_Init();                                  //系统初始化,设置IO口属性
 Close_LED();                                  //关闭LED数码管,避免显示乱码
 _EINT();                                      //开中断
 delay_ms(100);                                //延时100ms
 LCD_init();                                   //液晶参数初始化设置
 LCD_clear();                                  //清屏
 while(1)
 {
 
 }
 }
 
 
 | 
 |