载入中...

| 载入中...'s blog

2007-1-6 14:24:00
1602液晶几种典型显示状态及解决方案

[原创]1602液晶几种典型显示状态及解决方案

 

1602应该说是很简单的一种器件,但是许多人初次使用的时候可能总是出问题,当然可能也有一次就试验成功的,但是像我这样的在AVR ATMega16上调1602居然花了近3天的时间,最后调到快崩溃的地步,对自己的智商和水平都产生了怀疑,最后解决问题却是充满了戏剧性。解决问题期间在OURAVR上查找了许多帖子,最后才在马超老师的一句话里发现了答案呵呵,所以我把我调1602液晶时遇到的情况描述一遍供大家参考,算是给AVRFans积攒一点资料。

 

硬件资料:AVR ATMega16,工作在外部晶振11.0592MHzMS1602C字符液晶

 

状态1

上电之后,1602的第一行全黑,即165x7黑块

产生原因:液晶根本就没有进行初始化操作,需要检查连线或者程序

 

状态2

屏上显示两排灰格

产生原因:程序中对液晶初始化不正常,应是部分初始化指令没有正常接收,建议按照标准初始化步骤调整程序,或者调整指令之间的延时(加大一些试试)

 

状态3

此种不用解释了呵呵,调通了已经

 

1602液晶大概就这三种状态了,我调的时候很费劲,8位数据线方式接在PC口怎么都不出字符,怎么调延时都没用,总是显示两行灰格,最后看见马老师的提示,PC口有4个线默认是给JTAG用的,默认状态不做IO,于是重新将数据线接在PB口修改程序重新烧写后就好使~

      

       另外,我还发现,1602数据线接在PB口时,有时候上电之后显示工作正常,但有些时候根本就不工作,怀疑是ISP下载线有影响,拔去下载线,恢复正常。

 

下面附上我的初始化程序,参考了OURAVR上的一个帖子,具体是哪个我忘了不好意思,有所调整,按照太阳人那个数据手册里面推荐步骤进行的:

/*

本程序实现功能:在1602液晶屏上显示预期字符

硬件平台:AVR ATMega16,外部晶振11.0592MHz

2007.01.04 avrnewbie#163.com

*/

#define LCDPORT PORTB                  //数据总线在PB

#define LCDDDR DDRB              

#define LCDPIN PINB

#define En_H PORTA |= _BV(PA2)      //sbi(PORTA,2)             //EnPa2

#define En_L PORTA &= ~_BV(PA2)   //cbi(PORTA,2)

#define RW_R PORTA |= _BV(PA0)     //sbi(PORTA,0)             //RWPa0

#define RW_W PORTA &= ~_BV(PA0)       //cbi(PORTA,0)

#define RS_H PORTA |= _BV(PA3)      //sbi(PORTA,3)             //RSPa3

#define RS_L PORTA &= ~_BV(PA3)   //cbi(PORTA,3)

#define DelaytE _delay_us(2)

//#define Clear_Screen Write_Command(0x01)

 

//延时程序

void Delay(uint16_t time)

{

       while(time>0)

       {

              time--;

       }

}

 

//产生一个使能脉冲

void En_Toggle(void)

{

       En_H;            //拉高使能位

       DelaytE;         //保持高电平一定时间

       En_L;             //拉低使能位,产生一个下降沿

       DelaytE;         //保持低电平一定时间

}

 

//不断检测LCD忙标志BF,直到其为0,表示可以执行下一条指令

void Wait_Until_Ready(void)

{

       LCDDDR = 0x00;          //单片机设为输入,用以读取LCD忙标志

 

       RS_L;                          //所读为状态位

       RW_R;                         //设为读状态

 

       DelaytE;

       En_H;

       DelaytE;

       loop_until_bit_is_clear(LCDPIN,7);       //不断循环,直至BF=0

       En_L;

}

 

void Write_Command(uint8_t Command,uint8_t busyFlag)

{

       uint8_t busy;

       busy = busyFlag;

 

       if (busy == 1)                       //busy=1表示系统希望检测忙信号      

              Wait_Until_Ready();      //等待指令执行完毕

 

       LCDDDR = 0xff;

       RS_L;                                 //写入的是命令字

       RW_W;                               //置为写状态

       LCDPORT = Command;

       _delay_us(25);

       En_Toggle();                        //产生使能脉冲,使之在下降沿开始执行指令

      

}

 

void Write_Data(uint8_t data)

{

       Wait_Until_Ready();             //等待指令执行完毕

       RS_H;                                 //写入的是数据

       RW_W;                               //置为写状态

       LCDDDR = 0xff;                  

       LCDPORT = data;

       En_Toggle();                        //产生使能脉冲,使之在下降沿开始执行指令

 

}

void Initialize_LCD(void)

{                                                //主程序中在进入初始化程序前已经延时400ms

       LCDDDR = 0xff;                   //LCD控制线在PD口,故将其设为输出

                                                 //此处可以根据实际情况调整,或者在主程序中设置

       DDRA = 0xff;                       //E\RS\RW等接在PA

       _delay_ms(15);

       Write_Command(0x38,0);     //设为8位接口模式,显示2行字符,busy=0不检测忙信号

       _delay_ms(5);

       Write_Command(0x38,0);

       _delay_ms(5);

       Write_Command(0x38,0);

       Write_Command(0x38,1);

       Write_Command(0x08,1);     //显示关闭

       Write_Command(0x01,1);     //显示清屏

       Write_Command(0x06,1);     //写入新数据后光标右移

       Write_Command(0x0f,1);      //显示功能开,显示光标

}
 
完整图文PDF格式收藏版下载:
uploadfile-/2007-1/16192652.rar
  • 标签:1602 液晶 状态 解决方案 AVR 
  • 圈子:《匠人的百宝箱》笔记团队 
  • 2008-10-24 16:02:00
    Re:1602液晶几种典型显示状态及解决方案
    yt1330535(游客)我得更惨,只显示光标,不能显示数据
    By yt1330535(游客) | 个人主页 | 引用 | 返回 | 删除 | 回复
    2008-9-25 16:17:00
    Re:1602液晶几种典型显示状态及解决方案
    shxj(游客)你们的运气真好,我的为什么就没有任何显示呢?就好像没有送电一样。
    By shxj(游客) | 个人主页 | 引用 | 返回 | 删除 | 回复
    2008-9-3 21:51:00
    Re:1602液晶几种典型显示状态及解决方案
    SSSS(游客)我是因为有测忙程序,所以他一直停止这个程序上。就出现了全亮的状况,没有字符显示,也没有两行灰格。但不知道为什么用JTEG的时候怎么一直都是忙状态。
    By SSSS(游客) | 个人主页 | 引用 | 返回 | 删除 | 回复
    2008-8-15 14:27:00
    1602液晶问题!!急!!!
    小试牛刀(游客)我也出现了你说的问题:第一行显示灰色的格子,第二行没有显示。我做的是用单片机控制的简易电容表。后来我又做了一个测试程序,用proteus仿真没有问题。可把程序烧进片子后又出现了上面的现象。我用的是C程序。根据你的说法,好像是1602没有初始化。能否具体说说怎么初始化。我都调了好几天了 郁闷!! 先谢谢了
    By 小试牛刀(游客) | 个人主页 | 引用 | 返回 | 删除 | 回复
    2008-4-21 22:15:00
    Re:1602液晶几种典型显示状态及解决方案
    访客t85Bs2(游客)我也遇到这个问题了,
    想问问版主当时的具体电路是如何连接的。

    有没有用限流电阻呢?还是全部都按照文中所说的就直接连接到AVR上呢?
    By 访客t85Bs2(游客) | 个人主页 | 引用 | 返回 | 删除 | 回复
    2007-4-2 13:09:00
    Re:1602液晶几种典型显示状态及解决方案
    lili(游客)我的问题也是一样,在上电后出现全亮,没有任何其他的显示,没有字符显示,没有两行灰格,不知道驱动有问题还是电路问题
    By lili(游客) | 个人主页 | 引用 | 返回 | 删除 | 回复
    2007-1-22 19:00:00
    Re:1602液晶几种典型显示状态及解决方案
    1602(游客)我在使用1602的时候还会出现全亮的状况,没有字符显示,也没有两行灰格.似乎是驱动已经没问题了,不知道这是'写'的程序有问题还是电路板接触不好呢?
    以下为blog主人的回复:
    我猜应该是初始化已经正常进行了,但是显示字符的程序可能有点问题
    By 1602(游客) | 个人主页 | 引用 | 返回 | 删除 | 回复
    发表评论:
    载入中...

    日历

    载入中...

    公告

    Google
    Web AVRnewbie.21ic.org

    最新文章

    载入中...

    文章分类

    载入中...

    MY Favorite Blogs


    最近评论

    载入中...

    最近留言

    载入中...

    信息

    载入中...

    登陆

    载入中...