打印

12864串行显示的程序乱码和花屏问题

[复制链接]
2345|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Richardd|  楼主 | 2018-10-28 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个是msp430g2553luanchpad的12864串行显示的程序,我弄出来的结果会乱码,有时还会花屏,搞了两天也不懂是怎么回事,请各位看看帮帮忙,谢谢.

这是12864的驱动程序,其他配置截图了
#include <msp430g2553.h>
#include "LCD12864.h"
#include "config.h"

/********************************************************************
* 名称 : LCD_sendbyte
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/  
void LCD_SendByte(uchar zdata)
{
  uint i;
  for(i=0; i<8; i++)
  {
    RESET_SCLK;
    delay_us(100);
    if((zdata << i) & 0x80)//监测传送位,是否传送完
    {
        SET_SID; //SDI为串行数据口;传送完关闭
        delay_us(10);
    }
    else
    {
        RESET_SID;//未传送完继续
        delay_us(10);
    }
    //给一个时钟信号
    SET_SCLK;           //SCLK = 1;
  }
}
/********************************************************************
* 名称 : LCD_write_com()
* 功能 : 写串口指令,分三字节写完
* 输入 : com
* 输出 : 无
***********************************************************************/  
void LCD_WriteCom(uchar com)  
{  
      delay_us(100);
      OPEN_CS;//打开片选,高电平有效  

      LCD_SendByte(0xf8); //第一字节1111 1AB0   1111 1000,A--MCU到LCD,B--数据是控制命令,
      LCD_SendByte(com & 0xf0);     //第二字节DDDD 0000(并行)八位数据的高四位   
      LCD_SendByte((com << 4) & 0xf0);//第三字节0000 DDDD (并行)八位数据的低四位  
      delay_ms(100);
}   
/********************************************************************
* 名称 : LCD12864_write_date()
* 功能 : 写串口指令
* 输入 : date
* 输出 : 无
***********************************************************************/  
void LCD_WriteDate(uchar date)  
{  
    delay_us(100);
    OPEN_CS;            //打开片选

    LCD_SendByte(0xfa);//第一字节1111 1AB0   1111 1010,A--MCU到LCD,B--数据是显示数据,  
    LCD_SendByte(date & 0xf0);  //第二字节   
    LCD_SendByte((date << 4) & 0xf0);//第三字节   
    delay_ms(100);
}  
/********************************************************************
* 名称 : LCD12864_init()
* 功能 : 12864初始化函数
* 输入 : com
* 输出 : 无
***********************************************************************/  
void LCD_Init()  
{  
    //RESET_RST;   
    // LCD_Delay(100);  
     //SET_RST;
     //LCD_Delay(100);  
    LCD_WriteCom(0x34);//扩充指令集动作 ,绘图不显示
    LCD_WriteCom(0x01);//清屏
    LCD_WriteCom(0x30);//基本指令集动作, 绘图不显示
    LCD_WriteCom(0x0c);//开显示,不显示游标和游标位置
    LCD_WriteCom(0x02);//DDRAM地址归位
    LCD_WriteCom(0x80); //设定DDRAM 7位地址000,0000到 地址计数器AC
    LCD_WriteCom(0x01);//清屏
    delay_ms(10);
}  
/********************************************************************
* 名称 :LCD_CleanScans()
* 功能 : 清屏
* 输入 : 无
* 输出 : 无
***********************************************************************/  
void LCD_CleanScans()  
{  
     LCD_WriteCom(0x01);//清屏   0000 0001,清除显示
     delay_ms(10);
}  
/********************************************************************
* 名称 :  LCD12864_pos()
* 功能 : 设定显示位置
* 输入 :  x,y
* 输出 : 无
***********************************************************************/  
void LCD_SetPos(uchar x,uchar y)  
{  
    uchar addr;
    switch(x)
    {
    case 1: addr=0X7F+y;break;          //第一行
    case 2: addr=0X8F+y;break;          //第二行
    case 3: addr=0X87+y;break;          //第三行           
    case 4: addr=0X97+y;break;          //第四行
    default: break;
    }  
    LCD_WriteCom(addr);//显示地址         
}  
/********************************************************************
* 名称 : LCD_DisplayString()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
***********************************************************************/  
void LCD_DisplayString(int x,int y,char *s)  
{   
    uchar  i = 0;
    LCD_SetPos(x,y);
    while(*s > 0)
    {   
        LCD_WriteDate(s);  
        i++;  
    }   
}

//写整数函数
uint LCD_DisplayInt(int x,int y,int data)
{
    uint i;
    uint intLen=3;
    char cdat[4]={0};
    cdat [0] = (char)((data % 1000) /100);
    cdat [1] = (char)((data % 100) /10);
    cdat [2] = (char)((data % 10) /1);
    for (i=0;i<3;i++)
    {
        cdat = cdat + 48;
    }
        
    if (cdat[0] == '0')
    {
        intLen = 3;
        if (cdat[1] == '0')
        {
            intLen = 2;
            if (cdat[2] == '0')
                intLen = 1;                        
        }
    }
    LCD_DisplayString(x,y,cdat + (3-intLen));               
    return 0;
}

相关帖子

沙发
Mattheww| | 2018-10-28 09:38 | 只看该作者
感觉你的乱码和花屏都是因为显示位置的问题造成的

使用特权

评论回复
板凳
Erichk| | 2018-10-28 14:23 | 只看该作者
之前也有这样的情况,第一行显示正确,第二行显示错误。屏蔽掉第二行,第一行正常显示,加上第一行,两行显示都不对,就像你说的乱码。

使用特权

评论回复
地板
Thorald| | 2018-10-28 14:31 | 只看该作者
LCD_SetPos,这个LZ应该是抄袭网上的吧,LZ还是去看看显示屏的规格书,自己配置。
通过设置PAGE和COL来设置位置。

使用特权

评论回复
5
Bjorn| | 2018-10-28 14:50 | 只看该作者
不知道你们有没有用QC12864B的,我查到的资料好像说不能用串行,必须把R9的电阻改到R10,有没有高手给个确定答复,我试的串行就不行。

使用特权

评论回复
6
Rollo| | 2018-10-28 15:11 | 只看该作者
显示屏会花屏我知道有一个原因是电源不稳定造成的,不过这个程序应该还有别的错误

使用特权

评论回复
7
kkzz| | 2018-11-1 21:30 | 只看该作者
一般是驱动程序方面有点问题

使用特权

评论回复
8
hudi008| | 2018-11-1 21:30 | 只看该作者
有可能是复位不成功

使用特权

评论回复
9
lzmm| | 2018-11-1 21:30 | 只看该作者
串口方式最好接5根线

使用特权

评论回复
10
minzisc| | 2018-11-1 21:31 | 只看该作者
LCD12864初始化有问题呢。

使用特权

评论回复
11
selongli| | 2018-11-1 21:31 | 只看该作者
出现这种现象首先查下引脚有没有虚焊

使用特权

评论回复
12
fentianyou| | 2018-11-1 21:31 | 只看该作者
你用的是什么开关电源?

使用特权

评论回复
13
xiaoyaodz| | 2018-11-1 21:31 | 只看该作者
先检查一下连接排线

使用特权

评论回复
14
febgxu| | 2018-11-1 21:32 | 只看该作者
如果方式不对,显示就是乱码。

使用特权

评论回复
15
sdlls| | 2018-11-1 21:32 | 只看该作者
还是错误代码

使用特权

评论回复
16
pixhw| | 2018-11-1 21:32 | 只看该作者
乱码是怎么显示的呢?

使用特权

评论回复
17
fentianyou| | 2018-11-1 21:33 | 只看该作者
使用前测量过电流、电压吗?

使用特权

评论回复
18
kkzz| | 2018-11-1 21:33 | 只看该作者
最好对代码进行检查

使用特权

评论回复
19
selongli| | 2018-11-1 21:33 | 只看该作者
可能是接触不好

使用特权

评论回复
20
hudi008| | 2018-11-1 21:33 | 只看该作者
用硬件复位电路

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

380

帖子

0

粉丝