微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求大神帮忙,关于LCD1602里E(使能端)的问题

求大神帮忙,关于LCD1602里E(使能端)的问题

时间:10-02 整理:3721RD 点击:
在关于E的问题,/*?*/处发现如果E=1在RS,RW之前的话会出现数据丢失,而如果E在两者之后就没问题了。可是我查了很多资料都没看到E的先后问题,求解

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS=P2^0;
  6. sbit RW=P2^1;
  7. sbit E=P2^2;
  8. sbit BF=P0^7;
  9. uchar code string[]={"HELLO.WORLD"};
  10. /*****************************************************
  11. 函数功能:延时若干毫秒
  12. 入口参数:n
  13. ***************************************************/
  14. void delay1ms(uchar i)
  15. {
  16.         uchar j;
  17.         while(i--)
  18.         {
  19.                 for(j=0;j<115;j++);
  20.         }
  21. }
  22. /*****************************************************
  23. 函数功能:判断液晶模块的忙碌状态
  24. 返回值:result。result=1,忙碌;result=0,不忙
  25. ***************************************************/
  26. bit busy_lcd()
  27. {
  28.         bit result;
  29.         E=1;           /*大大问题*/
  30.         RS=0;
  31.         RW=1;
  32.         /*E=1;大大问题*/
  33.         _nop_();
  34.         _nop_();
  35.         _nop_();
  36.         _nop_();
  37.         result=BF;
  38.         E=0;
  39.         return result;
  40. }
  41. /*****************************************************
  42. 函数功能:将模式设置指令或显示地址写入液晶模块
  43. 入口参数:dictate
  44. ***************************************************/
  45. void com_lcd(uchar com)
  46. {
  47.         while(busy_lcd()==1);
  48.        
  49.         RS=0;
  50.         RW=0;
  51.         E=0;
  52.         _nop_();
  53.         _nop_();
  54.         _nop_();
  55.         P0=com;
  56.         _nop_();
  57.         _nop_();
  58.         _nop_();
  59.         _nop_();
  60.         E=1;
  61.         _nop_();
  62.         _nop_();
  63.         _nop_();
  64.         _nop_();
  65.         E=0;

  66. }

  67. /*****************************************************
  68. 函数功能:指定字符显示的实际地址
  69. 入口参数:x
  70. ***************************************************/
  71. void addrrom_lcd(uchar add)
  72. {
  73.         com_lcd(0x80|add);
  74.         delay1ms(10);
  75. }
  76. /*****************************************************
  77. 函数功能:将数据(字符的标准ASCII码)写入液晶模块
  78. 入口参数:y(为字符常量)
  79. ***************************************************/
  80. void writer_lcd(uchar dat)
  81. {
  82.         while(busy_lcd()==1);
  83.        
  84.         RS=1;
  85.         RW=0;
  86.         E=0;
  87.         P0=dat;
  88.         _nop_();
  89.         _nop_();
  90.         _nop_();
  91.         _nop_();
  92.         E=1;
  93.         _nop_();
  94.         _nop_();
  95.         _nop_();
  96.         _nop_();
  97.         E=0;
  98. }
  99. /*****************************************************
  100. 函数功能:对LCD的显示模式进行初始化设置
  101. ***************************************************/
  102. void init_lcd()
  103. {
  104.         delay1ms(15);
  105.         com_lcd(0x38);
  106.         delay1ms(5);
  107.         com_lcd(0x38);
  108.         delay1ms(5);
  109.         com_lcd(0x38);
  110.         delay1ms(5);
  111.         com_lcd(0x01);
  112.         delay1ms(5);
  113.         com_lcd(0x06);
  114.         delay1ms(5);
  115.         com_lcd(0x0f);
  116.         delay1ms(5);

  117. }
  118. void main()
  119. {
  120.         uchar i;
  121.         init_lcd();
  122.         delay1ms(10);
  123.         while(1)
  124.         {
  125.                  i=0;
  126.                  com_lcd(0x01);
  127.                 delay1ms(2);
  128.                  addrrom_lcd(0x00);
  129.                  delay1ms(2);
  130.                  while(string[i]!='\0')
  131.                  {
  132.                          writer_lcd(string[i]);
  133.                         delay1ms(100);
  134.                         i++;
  135.                  }
  136.                  while(1);
  137.         }       
  138. }

复制代码

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top