#include
#include
#define keyborad P0
#define LCD_data P1 //数据口
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
#define uchar unsigned char
#define uint unsigned int
sbit wela = P2^7;
sbit dula = P2^6;
sbit LCD_RS=P2^2;
sbit LCD_RW=P2^3;
sbit LCD_EN=P2^4;
sbit LCD_PSB=P2^5;
void lcd_pos(uchar X,uchar Y);
bit lcd_busy();
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar dat);
void lcd_init();
void delay(uint ms);
void delay(uint ms)
{
uint i,j;
for (j=0;j
for (i=0;i<120;i++);
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(LCD_data&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
LCD_data = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
LCD_data = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
void main()
{
uchar key,i;
uchar s[]={"中华民国"};
wela=0;
dula=0;
lcd_init(); //初始化LCD
lcd_pos(0,0); //设置显示位置为第一行的第1个字符
i = 0;
while(s != '\0')
{ //显示字符
lcd_wdat(s);
i++;
delay(10);
}
while(1);
}
运行,LCD亮了,但没有显示内容,不知什么原因
LCD的背光灯有电流通过就会亮的啦,与程序无关的。
你没字符显示的话,如果你确定程序没问题的话那可能是你对比度调得太低了吧,通常直接把第3个引脚V0接地,这样对比度最大。先检查一下这个吧,程序先懒得看喽~
对于LCD而言 关键是它的初始化时序,以及读写的时序;
楼主好好检查下这几个时序;
另外网上找找有没有类似的程序吧
看看它的初始化时序,以及读写的时序,然后再调一调对比度,看看
你说“亮”了。
但是我却要确定是否真的亮了。
请指定几种颜色,看屏幕是否听你控制。如果还只是白茫茫一片,不好意思。你的屏幕不是真的亮了。
如果颜色随你控制,恭喜,you got it。显示不出图片和文字,只是你的显示程序的问题,非硬件和却动之过。
楼主,你所说的亮了是背光而已。通电就会亮。你现在应该初始化没成功,假如你的对比度电压调好的话,初始化成功后,LCD会显示模模糊糊的网格的。颜色深浅看对比度来定。
刚才看了一下代码,现在找到了一处错误,估计是问题所在。就是你的判忙函数。
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(LCD_data&0x80);
LCD_EN = 0;
return(result);
}
你的是51单片机,作为输入检测LCD_data的bit8的时候,应该先置该口为1,然后再去检测输入状态。具体请参考51IO口作为输入的特性设置。
楼主你先改正这个,看看效果如何。当然了,假如楼主有仿真器的话,一步一步跟踪,很容易找到问题所在的。
是的,这种情况我遇到,以为是lcd坏了,当时比较菜鸟哈,第一次用lcd
引用: 引用 4 楼 can2010 的回复:
LCD的背光灯有电流通过就会亮的啦,与程序无关的。
你没字符显示的话,如果你确定程序没问题的话那可能是你对比度调得太低了吧,通常直接把第3个引脚V0接地,这样对比度最大。先检查一下这个吧,程序先懒得看喽~
这是我最近用的1602的,可以参考下
void LCD1602_check_busy(void)
{
EA=0;
LCD1602_DATA = 0xff;//数据口必须先写1
LCD1602_RS = 0 ;
LCD1602_RW = 1 ;
LCD1602_EN = 1 ;
while(LCD1602_DATA & 0x80) ;//按照datasheet上说的,对控液晶进行读写操作前,必须进行读写检测,保证STA7=0;就是LCD1602_DATA的最高位必须为0,否则就在while里等待;
LCD1602_EN = 0 ;
EA=1;
}
最好有原理图传上来,假如没有,或者你先检查一下硬件连接,假如你能很肯定的说,硬件没错,那么再仔细去推敲这个代码,,先排除问题。
自己看看那些送数据和指令的时序对不对,再看看一点一点的送看能送的出去吗?
自己看看那些送数据和指令的时序对不对,再看看一点一点的送看能送的出去吗?
如果用的是1602的话,我这儿有模块化的驱动程序,常用,没有问题,参考一下:
#include
#define line1 0
#define line2 1
#define line1_head 0x80 //第一行首地址
#define line2_head 0xc0 //第二行首地址
#define LCDIO P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
void delay(unsigned char n)//延时
{
unsigned char i,j;
for(i=0;i
for(j=0;j<125;j++)
;
}
void lcd_cmd(unsigned char cmd)//写指令
{
delay(200);
RS=0;
RW=0;
EN=1;
LCDIO=cmd;
EN=0;
}
void lcd_data(unsigned char dat)//写数据
{
delay(200);
RS=1;
RW=0;
EN=1;
LCDIO=dat;
EN=0;
}
void set_ads(unsigned char x,unsigned char y)//设置显示地址
{
unsigned char address;
if(y==line1)
address=line1_head+x;
else
address=line2_head+x;
lcd_cmd(address);
}
lcd_init(void)//初始化
{
lcd_cmd(0x01);//清屏
lcd_cmd(0x38);//设置八位数据传送模式
lcd_cmd(0x0c);//开显示
lcd_cmd(0x80);//设置LCD第一个字符显示的地址
lcd_cmd(0x01);//清屏
}
/****写一个字符******/
void write_char(unsigned char location,unsigned char num,unsigned char zi)
{
set_ads(location,num);//第num行第location个位置显示字符
lcd_data(zi);//显示zi
}
/***写一个字符串*****/
void write_str(unsigned char location,unsigned char num,unsigned char *s)//*s为字符串的地址,也就是指向字符串
{
set_ads(location,num);//第num行第location个位置显示字符
while(*s)//当字符地址不为空时,执行这个循环
{
LCDIO=*s;
lcd_data(*s);
s++;
}
}
void main()
{
lcd_init();
while(1)
{
write_char(5,line1,0xac);//显示0
//write_str(3,line2,"hard work");//显示"hard work"
//write_char(13,line2,0x21);//显示!
}
}