熟悉1602液晶操作的朋友进

[复制链接]
1517|18
 楼主| bryanlee512 发表于 2015-7-20 07:44 | 显示全部楼层 |阅读模式
帮分析下代码,

说明下,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;不能添加,这是为什么??
}
ayb_ice 发表于 2015-7-20 10:05 | 显示全部楼层
RW都没有看你有控制的
ningling_21 发表于 2015-7-20 10:19 | 显示全部楼层
bryanlee512 发表于 2015-7-20 09:34
但是按照时序图来说,写地址时rs要最后收尾要置1啊。还有在看一下蓝色代码部分,是写数据时rs=0;却是正 ...

时序图并没有说明:写地址最后收尾RS要置为1
 楼主| bryanlee512 发表于 2015-7-20 10:27 | 显示全部楼层
ningling_21 发表于 2015-7-20 10:19
时序图并没有说明:写地址最后收尾RS要置为1

这个怎么看出来的?rs不是先高后低,再置高?
dirtwillfly 发表于 2015-7-20 10:55 | 显示全部楼层
ayb_ice 发表于 2015-7-20 10:05
RW都没有看你有控制的

正解,楼主思路有点乱
lgq1542380129 发表于 2015-7-20 10:56 | 显示全部楼层
时序图应该从上到下,从左到右看吧。
dirtwillfly 发表于 2015-7-20 11:06 | 显示全部楼层
1602操作的时候关键是E的脉冲。
写操作结束的时候不用管lcdrs的
 楼主| bryanlee512 发表于 2015-7-20 11:24 | 显示全部楼层
dirtwillfly 发表于 2015-7-20 10:55
正解,楼主思路有点乱

rw直接物理接地了。也就是只写
 楼主| bryanlee512 发表于 2015-7-20 11:28 | 显示全部楼层
dirtwillfly 发表于 2015-7-20 11:06
1602操作的时候关键是E的脉冲。
写操作结束的时候不用管lcdrs的


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ningling_21 发表于 2015-7-20 12:04 | 显示全部楼层
bryanlee512 发表于 2015-7-20 11:28
这里rs不是先高然后低,在置高?

其实RS的状态,开始确定了就不需改变
天奕 发表于 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);
}

没用读忙检测
dirtwillfly 发表于 2015-7-20 14:04 | 显示全部楼层
bryanlee512 发表于 2015-7-20 11:28
这里rs不是先高然后低,在置高?

这里并不要求有下降沿或者上升沿,只要是在低电平状态就可以
 楼主| bryanlee512 发表于 2015-7-20 20:22 | 显示全部楼层
dirtwillfly 发表于 2015-7-20 14:04
这里并不要求有下降沿或者上升沿,只要是在低电平状态就可以

这点是怎么看出来的?
desertsailor 发表于 2015-7-20 20:51 | 显示全部楼层
RW可以直接接地处理,以节省一根口线,但程序里原来查询忙的地方必须要加足够的延时。
 楼主| bryanlee512 发表于 2015-7-20 21:32 | 显示全部楼层
天奕 发表于 2015-7-20 12:34
void write_com(uchar com)
{
       lcdrs=0;       P0=com;[/backc ...

你添加的几条延时可以不添加,lcd在响应的语句的时间是要比单片机一个机器时钟快。
ljune 发表于 2015-7-21 14:11 | 显示全部楼层
时序有问题,再看看吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

72

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部