单片机处理后显示在12864液晶上但此程序只显示最后一个字符

2019-07-15 15:13发布

请问各位大佬,我将光盘里的两个例程叠加之后想做一个,通过电脑串口助手发送一个字符串给单片机,单片机处理后显示在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 != '')  
  {
    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)!='';i++)
      *(arr+i)=*(s+i);
    *(arr+i)='';
    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)
  {
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
q10086333
1楼-- · 2019-07-15 17:28
仿真看看串口接收数据有没有对,显示函数看一下,等待延时加长一点试一下喽。
人中狼
2楼-- · 2019-07-15 20:05
DisplayCgrom(0x80,&data);这里你都显示在同一个地址,所以只会显示最后一个字符,显示程序最后不要放在中断里,应该放在主程序里,中断里设置一个标志,当接收到字符时,标志有效,主程序里判断该标志,有效时就进行显示。
至于显示乱码要看对12864是如何设置的
阿信509
3楼-- · 2019-07-15 23:54
串口数据和显示两部分单独调试,看看问题出在哪了

一周热门 更多>