微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD1602的移动显示问题

LCD1602的移动显示问题

时间:10-02 整理:3721RD 点击:
在网站上下载了一个LCD1602的移动显示程序,就是循环显示,从右边出来,从左边移出的程序,如下所示:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define  LCDPORT P0
uchar code tab[]="Hello everyone!         ";
uchar code tab1[]="Welcome to Harbin        "; //字符后面加若干个空格,防止滚动显示时出现不该出现的字符
sbit LCDE=P2^7;
sbit LCDRW=P2^6;
sbit LCDRS=P2^5;
void WriteCMD(uchar);    //定义写命令函数
void init();     //定义初始化函数
void WriteData(uchar);    //定义写数据函数
void Delay();     //定义延迟函数
void mydelay(int);
void main()
{         
     uint i;      //定义无符号整形变量
     init();      //液晶模块的初始化
  while(1)     //使之一直进行滚动显示程序,不断循环
  {
          for(i=0;i<32;i++)    //显示第一行字符
          {
             WriteData(tab[i]);    //每显示一个字符后停留一会,越过液晶的"忙"状态
             mydelay(100);
          }
          mydelay(100);
       WriteCMD(0x01);   //清屏,准备进行下一行显示
          WriteCMD(0x80+0x40+15);  //改变DDRAM的地址,更改为第二行末尾,从此处开始进入字符
          for(i=0;i<33;i++)   //开始输入第二行字符
          {
             WriteData(tab1[i]);
             mydelay(100);
          }
       mydelay(100);
       WriteCMD(0x01);
       WriteCMD(0x80+15);  //DDRAM的地址改回第一行,准备进入下一次循环,显示重新开始
    }
}
void Delay()
{
     uint uiCount;
     for(uiCount=0;uiCount<500;uiCount++);
}
void WriteCMD(uchar Command)        //写命令函数,用于修改液晶的状态寄存器
{
     Delay();                                   //先延时,越过液晶"忙"状态
     LCDE=1;                                    //使能端先置1
     LCDRS=0;     //设置RS为0,打开指令寄存器
     LCDRW=0;     //设置为写寄存器状态
     LCDPORT=Command;                           //输出命令
     LCDE=0;                                    //使能端由1变0,出现下降沿有效,执行命令
}
void WriteData(uchar dat)         //写数据函数,用于提供液晶的显示的字符
{
     Delay();                                   
     LCDE=1;                                    //把LCD改为写入数据状态
     LCDRS=1;
     LCDRW=0;
     LCDPORT=dat;                               //再输出数据
     LCDE=0;                                    //使能端有效,显示数据
}
void init()     //初始化程序,模块化使程序更清晰
{
     LCDRW=0;
     LCDE=0;         
     WriteCMD(0x38);                         //设置双行显示、8位数据接口
     WriteCMD(0x0c);                         //设置整体显示开、光标关、字符不闪烁
     WriteCMD(0x07);                         //设置为增量方式,整体显示移动开
     WriteCMD(0x01);                         //清屏
     WriteCMD(0x80+15);                         //设置字符进入屏幕的初始位置
}
void mydelay(int x)
{
     int i,j;
     for(i=x;i>0;i--)
     for(j=255;j>0;j--);
}
显示的程序出现闪动,很不清楚,在一段字符移出后,另一段字符移进时也会出现乱码,求高手指导

芯片资料上写了,有控制移动的命令。自己多看看芯片资料

为什么加空格啊?如果要移动的话需要另外加程序吧

淡淡的惆怅额

显示数据用到的延时函数改一下试试
void delay(int x)
{
    int i,j;
    for(i=x;i>0;i--)
        for(j=1000;j>0;j--);
}

其他地方还用你那个短延时。

表示茫然

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top