LCD亮了,但没有内容,不知什么原因

simba_chen   2010-5-8 19:14 楼主
#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亮了,但没有显示内容,不知什么原因

回复评论 (18)

液晶时序问题,

或者你的字库有问题
点赞  2010-5-9 00:57
如果程序没有问题,

就是你硬件电路接的问题了
点赞  2010-5-9 00:58
吃饭时间没时间看.帮顶
点赞  2010-5-9 11:32
LCD的背光灯有电流通过就会亮的啦,与程序无关的。
你没字符显示的话,如果你确定程序没问题的话那可能是你对比度调得太低了吧,通常直接把第3个引脚V0接地,这样对比度最大。先检查一下这个吧,程序先懒得看喽~
点赞  2010-5-9 16:37
对于LCD而言 关键是它的初始化时序,以及读写的时序;

楼主好好检查下这几个时序;

另外网上找找有没有类似的程序吧
点赞  2010-5-9 17:31
看看它的初始化时序,以及读写的时序,然后再调一调对比度,看看

点赞  2010-5-10 11:19
你说“亮”了。
但是我却要确定是否真的亮了。
请指定几种颜色,看屏幕是否听你控制。如果还只是白茫茫一片,不好意思。你的屏幕不是真的亮了。
如果颜色随你控制,恭喜,you got it。显示不出图片和文字,只是你的显示程序的问题,非硬件和却动之过。
点赞  2010-5-10 12:19
楼主,你所说的亮了是背光而已。通电就会亮。你现在应该初始化没成功,假如你的对比度电压调好的话,初始化成功后,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口作为输入的特性设置。

楼主你先改正这个,看看效果如何。当然了,假如楼主有仿真器的话,一步一步跟踪,很容易找到问题所在的。
点赞  2010-5-10 12:51
是的,这种情况我遇到,以为是lcd坏了,当时比较菜鸟哈,第一次用lcd
引用: 引用 4 楼 can2010 的回复:
LCD的背光灯有电流通过就会亮的啦,与程序无关的。
你没字符显示的话,如果你确定程序没问题的话那可能是你对比度调得太低了吧,通常直接把第3个引脚V0接地,这样对比度最大。先检查一下这个吧,程序先懒得看喽~
点赞  2010-5-10 15:41
这是我最近用的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;         
}
点赞  2010-5-10 15:51
在初始化中加了写1的语句,还是一样
点赞  2010-5-11 17:43
最好有原理图传上来,假如没有,或者你先检查一下硬件连接,假如你能很肯定的说,硬件没错,那么再仔细去推敲这个代码,,先排除问题。
点赞  2010-5-11 18:06
你的lcd是什么型号啊
点赞  2010-5-11 20:52
自己看看那些送数据和指令的时序对不对,再看看一点一点的送看能送的出去吗?
点赞  2010-5-11 22:51
自己看看那些送数据和指令的时序对不对,再看看一点一点的送看能送的出去吗?
点赞  2010-5-12 08:49
时序的错误非常大.
点赞  2010-5-12 09:16
用示波器看看.
点赞  2010-5-12 09:16
如果用的是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);//显示!               
        }
}

点赞  2010-5-23 22:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复