微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于51仿真LCD显示问题 请个位高手赐教

关于51仿真LCD显示问题 请个位高手赐教

时间:10-02 整理:3721RD 点击:
这几天在做LCD显示实验,仿真运行时,只显示左半屏或者只显示右半屏时,仿真没问题,可是屏幕需要同时显示左右半屏时,仿真时显示屏就会出现问题,显示屏最左边和最右边没问题,就是中间那部分出现乱码,而且有些乱码出现在其它页(未出现在预先设定的页上),仿真时LCD选用的是LGM12641BS1R,下面是部分代码:
uchar checkbusy()
{
  lcdport=0xff;
  RW=1;
  DI=0;
  E=1;
  E=0;
  return BUSYSTATUS;
}
void WriteCMD(uchar uCMD)
{
  while(checkbusy());
  lcdport=0xff;
  RW=0;
  DI=0;
  lcdport=uCMD;
  E=1;
  E=0;
  
}
void WriteData(uchar uDAT)
{
  while(checkbusy());
  lcdport=0xff;
  RW=0;
  DI=1;
  lcdport=uDAT;
  E=1;
  E=0;

}
void DspOn()
{
  CS1=1;
  CS2=1;
  WriteCMD(0x3f);
  }
void ClearLCD()
{
  WriteCMD(0x01);
}
void SetStartLine(uchar urow)   //设置显示起始行
{
  WriteCMD(LCDSTARTROW+urow);
}
void SetPage(uchar upage)
{
  WriteCMD(LCDPAGE+upage);
}
void SetColumn(uchar ucusor)
{
  WriteCMD(LCDLINE+ucusor);
}
void Dsp(uchar p[16],uchar q)
{
  uchar count,b[16];
  if(q==1)
  {
   CS1=1;
CS2=0;
  for(count=0;count<16;count++)
    {
      b[count]=*(p+count);
      WriteData(b[count]);
    }
  }
  else
   {
     CS1=0;
  CS2=1;
   for(count=0;count<16;count++)
    {
       b[count]=*(p+count);
    WriteData(b[count]);
  }
   }   
}
void main()
{
  E=1;
  DspOn();
  ClearLCD();
while(1)
  {
   uchar i;
SetStartLine(0);  //设置从第0行开始显示
re_input:
   for(i=0;i<4;i++)
    {
       SetPage(0);   //设置从第0页显示
    SetColumn(i<<4); //显示一次,显示列位置向右移动16个单元
        Dsp(QING_SHU_1[i],1); //输入“你好! 请”上半部分
         Dsp(QING_SHU_1[i+4],2); //输入“输入密码”上半部分       delay(200);
                     SetPage(1);
      SetColumn(i<<4);
      Dsp(QING_SHU_2[i],1); //输入“你好! 请”下半部分 通过CS1,CS2控制
            Dsp(QING_SHU_2[i+4],2);  //输入“输入密码”下半部分 通过CS1,CS2控制
   delay(200);
    }  
                  for(i=0;i<4;i++)
    {
      SetPage(6);
   SetColumn(i<<4);
   Dsp(QING_CHU_1[i],1);       //显示“‘C’清除“的上半部分
   Dsp(QING_CHU_1[i+4],2);   //显示”‘=’确认“的上半部分
   delay(200);
    SetPage(7);
   SetColumn(i<<4);
   Dsp(QING_CHU_2[i],1);    //显示“‘C’清除“的下半部分
   Dsp(QING_CHU_2[i+4],2); //显示”‘=’确认“的上半部分
   delay(200);
    }

请问这是什么原因,与所选LCD器件有关还是程序有问题?
谢谢光临!

和所选的LCD器件无关,还是程序有问题,看一下字库和控制方式是否匹配

可以参考下面的程序,摘自http://read.pudn.com/downloads112/sourcecode/embed/467206/LGM12641BS1R.c__.htm
/******************************************************************************/   
/**  
/** 模 块 名: -------------------LCD_Graph.C---------------------------------  
/**            -----------------图形液晶显示模块----------------------------*/   
/** 功能描述:   
/**  
/** 创 建 人: huangtiexiong    日期:2006-11-28   */   
/** 修 改 人:                  日期:2006-11-28   */   
/** 其他说明: 驱动芯片KS0108或兼容芯;  
/******************************************************************************/   
   
//#include "Includes.h"   //文件包含   
   
/*************************************************  
    模块级变量申明                  
*************************************************/   
static void  LCD_SetX(int8u pageX);   
static void  LCD_SetY(int8u colY);   
//static int8u  LCD_ReadStatus(void);   
static void  LCD_WriteCmd(int8u cmd);   
static void  LCD_WriteDat(int8u dat);   
   
static void  LCD_SetStartRow(int8u startRow);   
   
   
/*************************************************  
    子函数定义                    
*************************************************/   
   
/*******************************************************************************  
*** 函 数 名: static void LCD_SetX(int8u pageX)  
*** 功能描述: 设置页面地址;  
*** 全局变量: NO !  
*** 输  入: pageX;  
*** 输  出: NO !****/   
static void LCD_SetX(int8u pageX)   
{ pageX %= 8; LCD_WriteCmd(pageX | 0xb8); }   
   
static void LCD_SetY(int8u colY)   
{ colY %= 64; LCD_WriteCmd(colY | 0x40); }   
   
//static int8u LCD_ReadStatus(void)   
//{   
// int8u tmp;   
// LCD_EN = 0;// LCD_DATA = 0xff;// NOP();   
// LCD_EN = 1;// LCD_RS = 0;// LCD_RW = 1;   
// tmp = LCD_DATA;// LCD_EN = 0;// return tmp;   
// }   
static void LCD_WriteCmd(int8u cmd)   
{   
// while(1)   
// {   
//  if(!(LCD_ReadStatus() & 0x80)) break;   
//  }   
LCD_EN = 1; LCD_RS = 0; LCD_RW = 0; LCD_DATA = cmd; NOP();   
LCD_EN = 0; }   
static void LCD_WriteDat(int8u dat)   
{   
// while(1)   
// {   
//  if(!(LCD_ReadStatus() & 0x80)) break;   
//  }   
LCD_EN = 1; LCD_RS = 1; LCD_RW = 0; LCD_DATA = dat; NOP(); LCD_EN = 0; }   
   
static void LCD_SetStartRow(int8u startRow)   
{ LCD_WriteCmd(startRow | 0xc0); }   
   
extern void  LCD_Init(void)   
{   
LCD_RST = 0; Delay_Xus(100); LCD_RST = 1; Delay_Xms(100);   
// while(1)        //是否上电复位完毕;   
// {   
//  if(!(LCD_ReadStatus() & 0x10)) break;   
//  }   
LCD_EN = 0; LCD_CS1 = 1; LCD_CS2 = 1;   
LCD_WriteCmd(0x3f);   //开显示,指令码:0x3f;   
LCD_Clear();      //清屏;   
  LCD_SetStartRow(0x00); }   
   
extern void LCD_Clear(void)   
{   
int8u i,j;   
for(i=0;i<8;i++){ LCD_SetX(i);     //设置页地址;   
  for(j=0;j<64;j++){LCD_WriteDat(0x00);} //显示RAM清零;   
  }}   
   
extern void   LCD_Display(int8u x,int8u y,int8u *disp_dat)   
{   
int8u i;int8u  j;   
LCD_SetX(x);LCD_SetY(y);   
for(j=0;j<8;j++)   
{for(i=0;i<128;i++){   
        if(i>=64){LCD_CS1 = 1; LCD_CS2 = 0;}   
       else         {LCD_CS1 = 0; LCD_CS2 = 1;}     
       LCD_SetX(j); LCD_SetY(i%64);   
       LCD_WriteDat(disp_dat[j*128+i]); }}}   
   
/*******************************************************************************  
****                              End Of File  
*******************************************************************************/   
   

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

网站地图

Top