AVRnewbie 发表于 2007-1-6 14:46:04

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

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



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



状态1

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

http://cache.amobbs.com/bbs_upload782111/files_6/armok01140558.jpg

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



状态2

屏上显示两排灰格

http://cache.amobbs.com/bbs_upload782111/files_6/armok01140559.jpg

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



状态3

http://cache.amobbs.com/bbs_upload782111/files_6/armok01140560.jpg

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



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编辑过

fsclub 发表于 2007-1-6 15:17:07

一行灰格与初始化有关,有次把我1602插反了,就这种症状(4线制.)



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

AVRnewbie 发表于 2007-1-6 15:25:34

呵呵,我把数据线头拔下来他就是那种反应

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



我补充了你的第2点,谢谢呵呵

armok 发表于 2007-1-6 15:38:48

谢谢!

figoxwm 发表于 2007-1-6 16:13:14

我的显示有点闪烁是什么原因呢?有人说是刷新太快了,但也不知道是哪里控制刷新的??

yplin27 发表于 2007-1-6 17:45:52

To 【4楼】 figoxwm

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

fsclub 发表于 2007-1-6 18:11:06

太闪是更新太快.

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



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

zhudlmax 发表于 2007-1-7 02:45:54

假如需要延时的任务很多,恐怕你没那么多定时器,用RTOS就根本不用去为某个任务延时而单独调用定时器

Ryan 发表于 2010-1-15 15:44:52

相见恨晚,这么好的帖子,不得不看

wllf123 发表于 2010-1-15 15:58:46

mark!!!!!!!!!!

sw821025 发表于 2010-1-15 16:08:18

签名

21006091 发表于 2010-1-15 16:53:55

mark

chinamanzhong 发表于 2010-1-21 22:14:06

mark

astudent 发表于 2010-1-21 22:35:51

图片看不到

hclcwx 发表于 2010-1-21 22:54:57

jihao

davidleels 发表于 2010-1-21 23:22:46

这老帖子都翻出来了,不过正好可以看看

zsfang0104 发表于 2010-1-22 14:30:40

mark

fshunj 发表于 2010-7-3 17:45:14

mark

tsw1987 发表于 2010-7-3 17:49:08

挺好的!1602是基础,基础搞会了,其它的器件都差不多回事!

poet_lee 发表于 2010-7-4 18:45:56

谢谢分享~

allenjwb 发表于 2010-7-5 08:58:07

mark

wanxuncpx 发表于 2010-7-6 15:37:34

好东西-------------收藏一下-----------------1602 AVR驱动

jackielau 发表于 2010-7-6 15:48:24

mark

zhangchengxx 发表于 2010-7-15 11:43:46

学习了

chaled 发表于 2010-8-2 08:57:25

mark

mkzlovedamy 发表于 2010-9-12 09:29:34

wpnx 发表于 2010-12-14 17:29:33

mark

chanmao 发表于 2010-12-15 11:15:02

问题都遇到过都解决完了才看见这个帖子,哎。。。

jianjun42 发表于 2010-12-15 11:20:53

用C调LCD1602好麻烦,我用bascom从来没有发现过这样的问题,几句代码就搞定了

yuyu5693 发表于 2010-12-23 14:15:46

mark

BINGSHUIHUO 发表于 2010-12-24 03:00:57

谢谢分享!!

chenhuifox 发表于 2011-1-18 20:48:40

十分感谢! 我也是在1602这卡了好久,一直查不到是什么原因,今天看到楼主的帖子后,才知道PC口默认是JTAG功能 买糕的

zhenghe 发表于 2011-3-25 18:44:47

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

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

caiyue3577 发表于 2011-3-25 22:27:46

不错!

lixupeng 发表于 2011-3-25 23:34:29

mark!!!!

hzn1948 发表于 2011-3-26 09:11:23

我觉得对1602显示屏用不着定时更新,显示内容改变了就操作一次

madridlin 发表于 2011-3-26 10:05:27

mark

kerrwang 发表于 2011-3-26 10:34:52

哈哈,同感,被误弄了,好些天。

wukaka 发表于 2011-3-26 12:58:05

我刚开始调时,对比度把我害惨了!

csq463276932 发表于 2011-3-28 17:24:35

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

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

ShuangQuanLi 发表于 2011-3-28 21:33:58

谢谢,刚好可以看一看的

QQ09 发表于 2011-3-31 17:01:14

好东西,收藏!谢谢!

shenma 发表于 2011-4-13 21:33:18

好东东 ! 仿真下 看看效果.

wenfeiexe 发表于 2011-5-6 22:58:18

PC口有4个线默认是给JTAG用的,默认状态不做IO口

soga

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

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

flame0510 发表于 2011-5-9 20:31:12

mark

weimutouren 发表于 2011-5-10 02:18:10

楼主我真是爱死你了!
我终于找到问题所在了

myqq286477745 发表于 2011-5-11 11:13:59

新手强帖

xiaoyedeng 发表于 2011-12-17 23:38:58

我的就是第一种情况 很郁闷啊

xiaoyedeng 发表于 2011-12-17 23:39:56

这个和晶振还有关系吗?

xiaoyedeng 发表于 2011-12-17 23:53:01

回复【1楼】fsclub 绿林好汉
-----------------------------------------------------------------------

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

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

yyj679 发表于 2012-4-22 13:23:01

静下心,还是挺容易的

pangzi0801 发表于 2012-5-5 15:44:40

DING.MARK!

eryueniao 发表于 2012-5-26 17:17:27

哈哈      吸取经验啦

jz701209李 发表于 2012-5-29 22:18:03

路过,学习一下

江舟亭 发表于 2012-7-28 10:34:45

谢啦、、、

holyfire 发表于 2012-7-28 12:15:22

遇到过就有经验了

perfect@ 发表于 2013-12-15 01:09:55

我的情况、硬件环境给你的一模一样啊!! 走了弯路。

beggard 发表于 2013-12-15 21:00:52

走弯路才能长知识。

ouravrwoai 发表于 2013-12-15 21:39:54

我第一次在开发板上调1602时,也用了好几天啊,感觉新手慢点很正常啊,慢点掌握得比较扎实啊

zl_123 发表于 2013-12-15 22:07:12

看到了我调试1602时的影子,呵呵
页: [1]
查看完整版本: [总结]1602液晶几种典型显示状态及解决方案--附图