单片机/MCU论坛
直播中

周逸良

7年用户 17经验值
擅长:可编程逻辑 嵌入式技术 光电显示
私信 关注

关于1602液晶,求住大神!!!

  原码如下:  #include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
***it LCDRS=P2^5;   //数据/命令选择端
***it LCDRW=P2^6;   //读/写选择端
***it LCDEN=P2^7;   //使能信号
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void write_com (uchar com)
{
  LCDRS=0;
  LCDRW=0;
  P0=com;
  delay(5);
  LCDEN=1;
  delay(5);
  LCDEN=0;
  delay(5);
  LCDRS=1;
  LCDRW=1;
}
void init()
{
   LCDEN=0;
   write_com(0x38);
   write_com(0x0f);
   write_com(0x06);
   write_com(0x80);
}
void write_data(uchar date)
{
  LCDRS=1;
  P0=date;
  delay(5);
  LCDEN=1;
  delay(5);
  LCDEN=0;
  delay(5);

}
void main ()
{
init();
write_data('1');
delay(5);
write_data('1');
while(1);
}
结果光标向右移动了两个单位,但是没有显示11。
求解

回帖(11)

寒如风

2017-2-5 15:10:17
抢我的群无多抢我的群无多群无多
举报

周逸良

2017-2-5 16:15:18
OK了
举报

王栋春

2017-2-5 21:15:32

这个是如何处理好的  还望分享一下经验
举报

王大头

2017-2-7 21:17:13
液晶操作前必须写命令0x80,将光标置于左上角第一个位置,再对其写入显示数据,关于写数据函数,写命令函数不用这么复杂,延时只要大于700us就可以了,最后也不用将LCDRS  LCDRW置1.个人经验而已,还望指正
举报

谢华明

2017-2-9 07:37:56
是不是("1")改成('1')呀。
举报

周逸良

2017-2-11 14:57:52
引用: hwaming 发表于 2017-2-9 07:37
是不是("1")改成('1')呀。

我没有用"1"啊,用的是'1',应该是没有的吧,前者字符串后者字符
举报

周逸良

2017-2-11 15:01:50
引用: 王栋春 发表于 2017-2-5 21:15
这个是如何处理好的  还望分享一下经验

说出来可能很尴尬,在我的原理图上RD.RW.LCDEN是按顺序的结果接在单片机IO口上却不是,RD,RW位置调换了,所以没有显示数字
举报

周逸良

2017-2-11 15:09:06
引用: 电路小白123 发表于 2017-2-7 21:17
液晶操作前必须写命令0x80,将光标置于左上角第一个位置,再对其写入显示数据,关于写数据函数,写命令函数不用这么复杂,延时只要大于700us就可以了,最后也不用将LCDRS  LCDRW置1.个人经验而已,还望指正

0X80这个我写在初始化函数里面了呀,写命令/指令函数还望兄台赐教,延时的话确实是大于700US就可以的,那个LCDRS,LCDRW也是不用置1也可以的,我刚开始不是很懂所以只能完全照着时序图写,嘿嘿,多谢指点
举报

王栋春

2017-2-11 20:24:09
引用: RookieZY 发表于 2017-2-11 15:01
说出来可能很尴尬,在我的原理图上RD.RW.LCDEN是按顺序的结果接在单片机IO口上却不是,RD,RW位置调换了,所以没有显示数字

学习一下经验教训  搞单片看来要细心加细心了
举报

周逸良

2017-2-18 18:29:37
引用: 王栋春 发表于 2017-2-11 20:24
学习一下经验教训  搞单片看来要细心加细心了

嗯嗯
举报

王大头

2017-3-19 21:36:24
引用: RookieZY 发表于 2017-2-11 15:09
0X80这个我写在初始化函数里面了呀,写命令/指令函数还望兄台赐教,延时的话确实是大于700US就可以的,那个LCDRS,LCDRW也是不用置1也可以的,我刚开始不是很懂所以只能完全照着时序图写,嘿嘿,多谢指点

这是我用来开发1602液晶的写数据/写命令函数:
void wdat(unsigned char data)//写数据
{
     RS=1;
     RW=0;
     EN=0;
     Px=data;//写入数据
     EN=1;
     delay1ms(1);延时1ms,确保液晶稳定工作。
     EN=0;
}
void wcmd(unsigned char cmd)
{
     RS=0;
     RW=0;
     EN=0;
     Px=cmd;
     EN=1;
     delay1ms(1);
     EN=0;
}
在给你传授一个小技巧,每次液晶启动后,都要写一次0x80的命令,然后才可以写类似0x80+0xXX的光标定位命令,例如我要一开机就将1这个字符输出到第二个显示位置,第一个位置不显示字符,就可以先写入0x80;紧接着就写0x80+0x01将光标定位到第二个位置,1这个字符就输出到了第二个位置,如果你没有先写0x80这个命令,而是直接写0x80+0x01就会出错,可以尝试一下。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分