关于51仿真LCD显示问题 请个位高手赐教
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
*******************************************************************************/