发个帖 LCD1602四线驱动 亲测成功~
本帖最后由 lycreturn 于 2012-10-29 15:39 编辑小弟新手,第一次发帖,还有很多地方不懂,希望前辈 大侠们多多指点~
板子是学校电子CAD时候发的,平时没怎么用,前几天拿出来 看到上面有块1602液晶 四线制驱动的(DB7--P1^3 DB6--P1^2 DB5--P1^1 DB4--P1^0 )
片机 STC89c52RS--P2^6 EN--P2^7RW接地(只写模式)以前没玩过1602 4线驱动就去网上找了不少资料把程序烧写进去 但是都失败了最多也就显示
乱码后来又琢磨了一两天 终于调试成功既然写成功我就把我的心得分享给大家~
程序是 网上资料+我的理解 写的在这里感谢那些提供资料的人现在把我的程序分享给大家
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit en=P2^7;// 液晶使能端下降沿有效
sbit rs=P2^6;// 命令--数据选择端 rs=0 写命令rs=1 写数据
uchar code table1[]=" 4_LINE DRIVER";
uchar code table2[]="FOR LCD1602OK!";
void delay(uint x) //延时 x 毫秒
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void write_1602(uchar cd,dat) //cd=0 写命令cd=1 写数据
{
uchar i;
rs=cd;
for(i=0;i<2;i++)//循环两次 写完一个数据/命令
{
en=1;
P1=(P1&0xf0)|((dat>>4)&0x0f); //P1高四位数据不改动
delay(3); //先送高四位数据 再送低四位数据
en=0;
dat<<=4; //低四位左移到高四位
}
}
void init()
{
write_1602(0,2); //设置4位数据接口
write_1602(0,0x28); //显示方式设置
write_1602(0,0x0e); //设置开显示,不显示光标
write_1602(0,0x06); //默认(0x06)写入新数据后光标右移 屏幕不移动
write_1602(0,0x01); //显示清0,数据指针清0
}
void main()
{
init();
while(1)
{
uchar num;
write_1602(0,0x80); //第一行
for(num=0;num<16;num++)
{
write_1602(1,table1);
delay(3);
}
write_1602(0,0x80+0x40); //第二行
for(num=0;num<16;num++)
{
write_1602(1,table2);
delay(3);
}
while(1);
}
}
接下来说说我的程序为什么要那么写~
我第一次写成功时液晶4线设置 初始化程序是这样的
write_1602(0,0x28);
delay(3);
write_1602(0,0x28);
delay(3);
write_1602(0,0x28);
delay(3);
en=1;
en=0;
write_1602(0,0x28);
这样初始化 觉得很奇怪于是改变了一下
write_1602(0,0x28);
delay(3);
en=1;
en=0;
write_1602(0,0x28);
这样也可以初始化成功 但是如果没有 en=1; en=0; 液晶显示乱码 为什么呢?
分析一下en=1; en=0;的意思就会知道 这是一个en下降沿 会把P1低四位数据送入液晶当我们执行完第一个命令write_1602(0,0x28);时
P1低四位为1000 也就是说en=1; en=0; 把半个数据写入了液晶(因为一个完整数据或命令需要写两次)那意思是说四线初始化成功需要
写一个半数据(写三次)? 但是写完一个数据只需要两次哒 难道是因为高4位数据写入之后 四线模式设置成功了然后后面的低4位数据
被作为了一个新的数据 也就是说 0x28的低4位1000作为了一个新数据的高4位~ 而en=1; en=0;写入了刚才数据的低4位(也是1000) 这样
的话 后面的数据才会被正常写入为了验证我的猜想于是我把初始化程序改为这样
write_1602(0,0x22);
rs=0;
en=1;
P1=(P1&0xf0)|0x00; //P1低位送入0000
en=0;
//write_1602(0,0x28);
结果我很满意液晶确实只显示了一行5x7点阵 因为液晶显示一行 5x7点阵的命令为write_1602(0,0x20);(N=0,F=0,具体看1602数据手册)
这样的话0x22的低4位和P1=(P1&0xf0)|0x00;的四位组合成了一个新数据 看来我的猜想是正确的于是我的总结是--LCD1602四线设置需要单独设置
这样我们也可以理解 液晶乱码的问题了 乱码说明你已经4线初始化成功只是数据没有正确写入而已 因为如果没有en=1; en=0; 第一次写
write_1602(0,0x28);时低4位被作为一个新数据的高4位写下一个数据时数据的高4位被作为了上一个数据的低4位 这样你的数据完全被打乱了 但四线初始化
是成功了的但显示的就是乱码咯~霍霍~~~~~~~
然后呢 我又把初始化这样改了一下
rs=0;
en=1;
P1=(P1&0xf0)|0x02;
en=0;
write_1602(0,0x28);
结果很明显液晶正常工作而这里对液晶四线设置只用了半个数据(0010)就已经成功了之后便可以正常写入数据 所以我认为液晶4线制需要
单独设置所以在最后我用write_1602(0,2);设置四线模式大家也应该明白为什么了吧~~~~~
以上是小弟的见解有什么不对的还希望高手指点~ 我见过这里有人用两根线就能驱动LCD1602了 恭喜楼主 yklstudent 发表于 2012-10-29 18:02 static/image/common/back.gif
我见过这里有人用两根线就能驱动LCD1602了
这里我只是说说1602四线驱动的问题 不用其他芯片 2线的我也不会能用2线当然很好可否说说哪儿有2线驱动的我也比较感兴趣
ps你的头像很牛哦~~~ 52robot 发表于 2012-10-29 18:34 static/image/common/back.gif
恭喜楼主
thank you~ 不过我还有很多不懂的希望大虾们多多指点啊~ lycreturn 发表于 2012-10-29 18:52 static/image/common/back.gif
这里我只是说说1602四线驱动的问题 不用其他芯片 2线的我也不会能用2线当然很好可否说说哪儿有2线驱 ...
给你看个三线驱动LCD1602的proteus仿真图
其实两线的也是差不多的
我这个是参考那位前辈做的proteus仿真
两线的这里面就有 自己可以搜索下
yklstudent 发表于 2012-10-29 19:24 static/image/common/back.gif
给你看个三线驱动LCD1602的proteus仿真图
其实两线的也是差不多的
我这个是参考那位前辈做的proteus仿真
看不大懂请问一下 你有没有亲自做实验成功过 还有这个可不可以用51单片机做目前还没用过其他的单片机 lycreturn 发表于 2012-10-29 19:50 static/image/common/back.gif
看不大懂请问一下 你有没有亲自做实验成功过 还有这个可不可以用51单片机做目前还没用过其他的单片 ...
玩玩差不多 做产品用就要慎重了 lycreturn 发表于 2012-10-29 18:59 static/image/common/back.gif
thank you~ 不过我还有很多不懂的希望大虾们多多指点啊~
小虾在09年的时候做的一些驱动,共享给大家
【M16 ICCAVR PROTEUS每天一练】之液晶专辑(8位数据线驱动1602),2009-09-15
http://www.amobbs.com/thread-3584268-1-1.html
【M16 ICCAVR PROTEUS每天一练】之液晶专辑(4位数据线驱动1602),2009-09-16
http://www.amobbs.com/thread-3586540-1-1.html
【M16 ICCAVR PROTEUS每天一练】之液晶专辑(3根线通过74HC595驱动1602),2009-09-17
http://www.amobbs.com/thread-3588428-1-1.html
【M16 ICCAVR PROTEUS每天一练】之液晶专辑(2根线通过74HC164驱动1602),2009-09-18
http://www.amobbs.com/thread-3590758-1-1.html
8根,4根,3根,2根都有了 52robot 发表于 2012-10-29 20:45 static/image/common/back.gif
小虾在09年的时候做的一些驱动,共享给大家
【M16 ICCAVR PROTEUS每天一练】之液晶专辑(8位数据线驱动16 ...
恩非常不错用74hc595 3线74hcl64 2线驱动 可以理解 但直接用单片机IO口2线(3线 )驱动 我还真不懂 lycreturn 发表于 2012-10-29 20:49 static/image/common/back.gif
恩非常不错用74hc595 3线74hcl64 2线驱动 可以理解 但直接用单片机IO口2线(3线 )驱动 我 ...
直接的我还真没试过,如果你搞出来的话记得通知一声 52robot 发表于 2012-10-29 20:55 static/image/common/back.gif
直接的我还真没试过,如果你搞出来的话记得通知一声
你这样的高手都还没弄出来 像我这种小虾不行啊~ 不过有空可以试一下 哎~~怎么没影响了呢?大家都不玩4线液晶的么~ 多少谈谈自己的见解撒~ 论坛里有人两线驱动过了哦! Randy1022 发表于 2012-10-30 23:32 static/image/common/back.gif
论坛里有人两线驱动过了哦!
是不是直接用单片机2个IO口驱动而不用其他的驱动芯片51可以做么? {:sweat:}论坛还有一个手驱的呢 maxims 发表于 2012-10-31 13:25 static/image/common/back.gif
论坛还有一个手驱的呢
小弟不懂~可否说清楚点 关于四线驱动的问题 看了很多帖子 有个疑问是不是设置4线驱动 在初始化时必须先设置为8线模式(0x38) 但是设置4线模式在初始化时用0x02 0x12 0x32
0x42~0xf2都是可以初始化成功 lycreturn 发表于 2012-11-1 20:59 static/image/common/back.gif
小弟不懂~可否说清楚点
论坛里有一个神人,1602通电 之后,用手操作相应的电线,在1602上边写字。没有用到任何的器件 maxims 发表于 2012-11-2 09:20 static/image/common/back.gif
论坛里有一个神人,1602通电 之后,用手操作相应的电线,在1602上边写字。没有用到任何的器件 ...
都说是神人了~ 哪是我这种小虾能及的~小弟只是想谈谈关于1602四线驱动的问题高手们就不要往 2线 3线 手驱 上说了嘛 两线、三线驱动,第一次听说。六楼的三线 没看懂什么意思? 论坛里面COWBOY好你有二线驱动的,不用扩展芯片,只用记忆元件。 renwocai 发表于 2012-11-2 12:14 static/image/common/back.gif
论坛里面COWBOY好你有二线驱动的,不用扩展芯片,只用记忆元件。
怎样搜索大神些 写的关于2线驱动1602的帖子小弟新手 很多地方不懂望高手指点哈 高手呀 牛牛 {:smile:}{:smile:} 高手,牛人呀! 真是高手!!!! 学习了{:handshake:} 看看啊!不知能不能看懂哦! 恭喜楼主。 两线的貌似通过阻容元件的搭配来延时数据传输来实现的,
感觉稳定性欠佳,调试也麻烦 谢谢大家的回复,这论坛是个好地方,可以学到很多在其他地方学不到的东西,小弟我这也是第一次发帖,只是分享我的一点心得罢了,也许还有很多不对的地方,还望大家多多指点,如果这个帖子对大家有所帮助,那我花费几天功夫总结的这点心得也就更加值得了~ 好资料,收藏之,备用之,学习之!!! 测试过了,完美。 兄弟,谢谢
一周没弄出来,今天看了你的程式终于搞定,感谢 不谢弄出来了就好 四线驱动、两线驱动、都需要具体型号液晶屏芯片的支持,需要看相关芯片的文档,不是都可行的。为避免兼容性问题、我现在采用AT89C2051或者AT89C4051来进行液晶屏的驱动、内部包含I2C主机端代码。从而在开发机上只用两根线以I2C从机的方式通过AT89C2051间接驱动1602(字符型)和LCM122325(图形点阵型)等液晶屏,已经达到商业化的稳定性和可靠性,非常成熟。
在AT89C2051上实现I2C主机端的编码费了不少时间和脑筋,现在已经能够完美的以软件的形式实现I2C主机端,这样一来,所有液晶屏都可采用一片低价MCU加软件I2C主机端代码的方式隔离液晶驱动的复杂性、从而转为两线驱动,最终投入代价是一片价格便宜的MCU和一段软件I2C主机端代码即可。 高人 学习了 mark
页:
[1]