搜索
bottom↓
回复: 60

[总结]1602液晶几种典型显示状态及解决方案--附图

[复制链接]

出0入0汤圆

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



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



状态1

上电之后,1602的第一行全黑,即16个5x7黑块



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



状态2

屏上显示两排灰格



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



状态3



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



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

       

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



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



/*

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

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

2007.01.04

MYBlog--http://avrnewbie.21ic.org/

*/

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

#define LCDDDR DDRB                       

#define LCDPIN PINB

#define En_H PORTA |= _BV(PA2)        //sbi(PORTA,2)                //En接Pa2

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

#define RW_R PORTA |= _BV(PA0)        //sbi(PORTA,0)                //RW接Pa0

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

#define RS_H PORTA |= _BV(PA3)        //sbi(PORTA,3)                //RS接Pa3

#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版本,包含图文,供大家收藏

点击此处打开 1602液晶几种典型显示状态及解决方案.pdf

-----此内容被AVRnewbie于2007-01-06,14:47:41编辑过


-----此内容被AVRnewbie于2007-01-06,15:22:55编辑过

出0入0汤圆

发表于 2007-1-6 15:17:07 | 显示全部楼层
一行灰格与初始化有关,有次把我1602插反了,就这种症状(4线制.)



两行全显,也有可能是对比度调得太大,其实是正常的.

出0入0汤圆

 楼主| 发表于 2007-1-6 15:25:34 | 显示全部楼层
呵呵,我把数据线头拔下来他就是那种反应

插反了其实也就是没初始化吧,数据啥的都送不到位



我补充了你的第2点,谢谢呵呵
头像被屏蔽

出0入0汤圆

发表于 2007-1-6 15:38:48 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2007-1-6 16:13:14 | 显示全部楼层
我的显示有点闪烁是什么原因呢?有人说是刷新太快了,但也不知道是哪里控制刷新的??

出0入148汤圆

发表于 2007-1-6 17:45:52 | 显示全部楼层
To 【4楼】 figoxwm

    我也曾经遇到过闪烁的情况,原因是每次更新显示时都清屏,不知你的情况跟这个有没有关系。

出0入0汤圆

发表于 2007-1-6 18:11:06 | 显示全部楼层
太闪是更新太快.

只要要每次更新的后面加0.5秒延时就好了,但这样MCU光做延时的工作了.



你可以有定时器每0.5秒中断更新一次就行了.

出0入0汤圆

发表于 2007-1-7 02:45:54 | 显示全部楼层
假如需要延时的任务很多,恐怕你没那么多定时器,用RTOS就根本不用去为某个任务延时而单独调用定时器

出0入0汤圆

发表于 2010-1-15 15:44:52 | 显示全部楼层
相见恨晚,这么好的帖子,不得不看

出0入0汤圆

发表于 2010-1-15 15:58:46 | 显示全部楼层
mark!!!!!!!!!!

出0入0汤圆

发表于 2010-1-15 16:08:18 | 显示全部楼层
签名

出0入0汤圆

发表于 2010-1-15 16:53:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-21 22:14:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-21 22:35:51 | 显示全部楼层
图片看不到

出0入0汤圆

发表于 2010-1-21 22:54:57 | 显示全部楼层
jihao

出0入0汤圆

发表于 2010-1-21 23:22:46 | 显示全部楼层
这老帖子都翻出来了,不过正好可以看看

出0入0汤圆

发表于 2010-1-22 14:30:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-3 17:45:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-3 17:49:08 | 显示全部楼层
挺好的!1602是基础,基础搞会了,其它的器件都差不多回事!

出0入0汤圆

发表于 2010-7-4 18:45:56 | 显示全部楼层
谢谢分享~

出0入0汤圆

发表于 2010-7-5 08:58:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-6 15:37:34 | 显示全部楼层
好东西-------------收藏一下-----------------1602 AVR驱动

出0入0汤圆

发表于 2010-7-6 15:48:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-15 11:43:46 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-8-2 08:57:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-12 09:29:34 | 显示全部楼层

出0入0汤圆

发表于 2010-12-14 17:29:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-15 11:15:02 | 显示全部楼层
问题都遇到过都解决完了才看见这个帖子,哎。。。

出0入8汤圆

发表于 2010-12-15 11:20:53 | 显示全部楼层
用C调LCD1602好麻烦,我用bascom从来没有发现过这样的问题,几句代码就搞定了

出0入0汤圆

发表于 2010-12-23 14:15:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-24 03:00:57 | 显示全部楼层
谢谢分享!!

出0入0汤圆

发表于 2011-1-18 20:48:40 | 显示全部楼层
十分感谢! 我也是在1602这卡了好久,一直查不到是什么原因,今天看到楼主的帖子后,才知道PC口默认是JTAG功能 买糕的

出0入0汤圆

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

啊!!!气死我了!调了一天,换成PB口,终于显示了!!!感谢楼主啊!!

出0入0汤圆

发表于 2011-3-25 22:27:46 | 显示全部楼层
不错!

出0入0汤圆

发表于 2011-3-25 23:34:29 | 显示全部楼层
mark!!!!

出0入0汤圆

发表于 2011-3-26 09:11:23 | 显示全部楼层
我觉得对1602显示屏用不着定时更新,显示内容改变了就操作一次

出0入0汤圆

发表于 2011-3-26 10:05:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-26 10:34:52 | 显示全部楼层
哈哈,同感,被误弄了,好些天。

出0入0汤圆

发表于 2011-3-26 12:58:05 | 显示全部楼层
我刚开始调时,对比度把我害惨了!

出0入0汤圆

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

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
从这句话中长见识了。谢谢。

出0入0汤圆

发表于 2011-3-28 21:33:58 | 显示全部楼层
谢谢,刚好可以看一看的

出0入0汤圆

发表于 2011-3-31 17:01:14 | 显示全部楼层
好东西,收藏!谢谢!

出0入0汤圆

发表于 2011-4-13 21:33:18 | 显示全部楼层
好东东 ! 仿真下 看看效果.

出0入0汤圆

发表于 2011-5-6 22:58:18 | 显示全部楼层
PC口有4个线默认是给JTAG用的,默认状态不做IO口

soga

我也快崩溃了
在开发板上的的显示正常

换到我自己 焊 的死活不显示

出0入0汤圆

发表于 2011-5-9 20:31:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-10 02:18:10 | 显示全部楼层
楼主我真是爱死你了!
我终于找到问题所在了

出0入0汤圆

发表于 2011-5-11 11:13:59 | 显示全部楼层
新手强帖

出0入0汤圆

发表于 2011-12-17 23:38:58 | 显示全部楼层
我的就是第一种情况 很郁闷啊

出0入0汤圆

发表于 2011-12-17 23:39:56 | 显示全部楼层
这个和晶振还有关系吗?

出0入0汤圆

发表于 2011-12-17 23:53:01 | 显示全部楼层
回复【1楼】fsclub 绿林好汉
-----------------------------------------------------------------------

回复【1楼】fsclub 绿林好汉
一行灰格与初始化有关,有次把我1602插反了,就这种症状(4线制.)
两行全显,也有可能是对比度调得太大,其实是正常的.
-----------------------------------------------------------------------

插反了的话 应该连第一行的小黑块也没有吧?
供不上电 怎么能显示呢

出0入0汤圆

发表于 2012-4-22 13:23:01 | 显示全部楼层
静下心,还是挺容易的

出0入0汤圆

发表于 2012-5-5 15:44:40 | 显示全部楼层
DING.MARK!

出0入0汤圆

发表于 2012-5-26 17:17:27 | 显示全部楼层
哈哈      吸取经验啦

出0入0汤圆

发表于 2012-5-29 22:18:03 来自手机 | 显示全部楼层
路过,学习一下

出0入0汤圆

发表于 2012-7-28 10:34:45 | 显示全部楼层
谢啦、、、

出0入0汤圆

发表于 2012-7-28 12:15:22 | 显示全部楼层
遇到过就有经验了

出0入0汤圆

发表于 2013-12-15 01:09:55 | 显示全部楼层
我的情况、硬件环境给你的一模一样啊!! 走了弯路。

出0入0汤圆

发表于 2013-12-15 21:00:52 | 显示全部楼层
走弯路才能长知识。

出0入0汤圆

发表于 2013-12-15 21:39:54 | 显示全部楼层
我第一次在开发板上调1602时,也用了好几天啊,感觉新手慢点很正常啊,慢点掌握得比较扎实啊

出0入0汤圆

发表于 2013-12-15 22:07:12 | 显示全部楼层
看到了我调试1602时的影子,呵呵
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 09:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表