OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4052|回复: 1

关于430显示的问题

[复制链接]

3

主题

5

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2017-4-29
在线时间
12 小时
发表于 2017-8-11 14:51:35 | 显示全部楼层 |阅读模式
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)
  {

  }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2013-7-12
在线时间
86 小时
发表于 2017-8-11 15:13:31 | 显示全部楼层
仿真看看串口接收数据有没有对,显示函数看一下,等待延时加长一点试一下喽。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 20:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表