打印

熟悉1602液晶操作的朋友进

[复制链接]
1082|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
帮分析下代码,

说明下,lcdrs=RS,lcden=E,P0数据口,lcdrw接地。
按照时序图构造写命令函数write_com(),和写数据函数write_data()
在“write_com()”函数最后加入的lcdrs=1;液晶上什么数据都不显示是什么原因?
void write_com(uchar com)
{
       lcdrs=0;
       P0=com;
       delay(5);
       lcden=1;
       delay(5);
       lcden=0;
      //lcdrs=1;//别的都没问题,这句一添加液晶点亮但光标字符都不显示
}
void write_data(uchar date)
{   
      lcdrs=1;
      P0=date;
      delay(5);
      lcden=1;
      delay(5);
      lcden=0;
}
void init()
{
     lcden=0;
     write_com(0x38);
     write_com(0x0c);
     write_com(0x06);
     write_com(0x01);
}
void main()
{
      init();
      write_com(0x80);
      write_data(0);
     while(1);
}

相关帖子

沙发
ayb_ice| | 2015-7-20 07:59 | 只看该作者
需要延时一下吧,或者程序其它地方还有问题

使用特权

评论回复
板凳
ningling_21| | 2015-7-20 08:16 | 只看该作者
RS=1用于写入指令,先写数据后把RS=1,可能是LCD把写入的指令识别为数据导致显示不了

使用特权

评论回复
地板
bryanlee512|  楼主 | 2015-7-20 09:34 | 只看该作者
ningling_21 发表于 2015-7-20 08:16
RS=1用于写入指令,先写数据后把RS=1,可能是LCD把写入的指令识别为数据导致显示不了 ...

但是按照时序图来说,写地址时rs要最后收尾要置1啊。还有在看一下蓝色代码部分,是写数据时rs=0;却是正常这又怎么解释呢?感觉这个部分很乱。
void write_com(uchar com)
{
       lcdrs=0;
       P0=com;
       delay(5);
       lcden=1;
       delay(5);
       lcden=0;
      //lcdrs=1;//别的都没问题,这句一添加液晶点亮但光标字符都不显示
}
void write_data(uchar date)
{   
      lcdrs=1;
      P0=date;
      delay(5);
      lcden=1;
      delay(5);
      lcden=0;
      lcdrs=0;//添加这条却不影响写数据,但之前write_com()里最后的//lcdrs=1;不能添加,这是为什么??
}

使用特权

评论回复
5
ayb_ice| | 2015-7-20 10:05 | 只看该作者
RW都没有看你有控制的

使用特权

评论回复
6
ningling_21| | 2015-7-20 10:19 | 只看该作者
bryanlee512 发表于 2015-7-20 09:34
但是按照时序图来说,写地址时rs要最后收尾要置1啊。还有在看一下蓝色代码部分,是写数据时rs=0;却是正 ...

时序图并没有说明:写地址最后收尾RS要置为1

使用特权

评论回复
7
bryanlee512|  楼主 | 2015-7-20 10:27 | 只看该作者
ningling_21 发表于 2015-7-20 10:19
时序图并没有说明:写地址最后收尾RS要置为1

这个怎么看出来的?rs不是先高后低,再置高?

使用特权

评论回复
8
dirtwillfly| | 2015-7-20 10:55 | 只看该作者
ayb_ice 发表于 2015-7-20 10:05
RW都没有看你有控制的

正解,楼主思路有点乱

使用特权

评论回复
9
lgq1542380129| | 2015-7-20 10:56 | 只看该作者
时序图应该从上到下,从左到右看吧。

使用特权

评论回复
10
dirtwillfly| | 2015-7-20 11:06 | 只看该作者
1602操作的时候关键是E的脉冲。
写操作结束的时候不用管lcdrs的

使用特权

评论回复
11
bryanlee512|  楼主 | 2015-7-20 11:24 | 只看该作者
dirtwillfly 发表于 2015-7-20 10:55
正解,楼主思路有点乱

rw直接物理接地了。也就是只写

使用特权

评论回复
12
bryanlee512|  楼主 | 2015-7-20 11:28 | 只看该作者
dirtwillfly 发表于 2015-7-20 11:06
1602操作的时候关键是E的脉冲。
写操作结束的时候不用管lcdrs的


这里rs不是先高然后低,在置高?

使用特权

评论回复
13
ningling_21| | 2015-7-20 12:04 | 只看该作者
bryanlee512 发表于 2015-7-20 11:28
这里rs不是先高然后低,在置高?

其实RS的状态,开始确定了就不需改变

使用特权

评论回复
14
天奕| | 2015-7-20 12:34 | 只看该作者
void write_com(uchar com)
{
       lcdrs=0;       P0=com;
       delay(5);
       lcden=1;
       delay(5);
       lcden=0;
  delay(5);
      //lcdrs=1;//别的都没问题,这句一添加液晶点亮但光标字符都不显示
}
void write_data(uchar date)
{   
      lcdrs=1;

      P0=date;
      delay(5);
      lcden=1;
      delay(5);
      lcden=0;
   delay(5);
}
void init()
{
     lcden=0;
     write_com(0x38);
   delay(20);
     write_com(0x0c);
   delay(20);
     write_com(0x06);
   delay(20);
     write_com(0x01);
   delay(50);
}

没用读忙检测

使用特权

评论回复
15
dirtwillfly| | 2015-7-20 14:04 | 只看该作者
bryanlee512 发表于 2015-7-20 11:28
这里rs不是先高然后低,在置高?

这里并不要求有下降沿或者上升沿,只要是在低电平状态就可以

使用特权

评论回复
16
bryanlee512|  楼主 | 2015-7-20 20:22 | 只看该作者
dirtwillfly 发表于 2015-7-20 14:04
这里并不要求有下降沿或者上升沿,只要是在低电平状态就可以

这点是怎么看出来的?

使用特权

评论回复
17
desertsailor| | 2015-7-20 20:51 | 只看该作者
RW可以直接接地处理,以节省一根口线,但程序里原来查询忙的地方必须要加足够的延时。

使用特权

评论回复
18
bryanlee512|  楼主 | 2015-7-20 21:32 | 只看该作者
天奕 发表于 2015-7-20 12:34
void write_com(uchar com)
{
       lcdrs=0;       P0=com;[/backc ...

你添加的几条延时可以不添加,lcd在响应的语句的时间是要比单片机一个机器时钟快。

使用特权

评论回复
19
ljune| | 2015-7-21 14:11 | 只看该作者
时序有问题,再看看吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

72

帖子

0

粉丝