求大神帮忙,关于LCD1602里E(使能端)的问题
时间:10-02
整理:3721RD
点击:
在关于E的问题,/*?*/处发现如果E=1在RS,RW之前的话会出现数据丢失,而如果E在两者之后就没问题了。可是我查了很多资料都没看到E的先后问题,求解
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit E=P2^2;
- sbit BF=P0^7;
- uchar code string[]={"HELLO.WORLD"};
- /*****************************************************
- 函数功能:延时若干毫秒
- 入口参数:n
- ***************************************************/
- void delay1ms(uchar i)
- {
- uchar j;
- while(i--)
- {
- for(j=0;j<115;j++);
- }
- }
- /*****************************************************
- 函数功能:判断液晶模块的忙碌状态
- 返回值:result。result=1,忙碌;result=0,不忙
- ***************************************************/
- bit busy_lcd()
- {
- bit result;
- E=1; /*大大问题*/
- RS=0;
- RW=1;
- /*E=1;大大问题*/
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result=BF;
- E=0;
- return result;
- }
- /*****************************************************
- 函数功能:将模式设置指令或显示地址写入液晶模块
- 入口参数:dictate
- ***************************************************/
- void com_lcd(uchar com)
- {
- while(busy_lcd()==1);
-
- RS=0;
- RW=0;
- E=0;
- _nop_();
- _nop_();
- _nop_();
- P0=com;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- E=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- E=0;
- }
- /*****************************************************
- 函数功能:指定字符显示的实际地址
- 入口参数:x
- ***************************************************/
- void addrrom_lcd(uchar add)
- {
- com_lcd(0x80|add);
- delay1ms(10);
- }
- /*****************************************************
- 函数功能:将数据(字符的标准ASCII码)写入液晶模块
- 入口参数:y(为字符常量)
- ***************************************************/
- void writer_lcd(uchar dat)
- {
- while(busy_lcd()==1);
-
- RS=1;
- RW=0;
- E=0;
- P0=dat;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- E=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- E=0;
- }
- /*****************************************************
- 函数功能:对LCD的显示模式进行初始化设置
- ***************************************************/
- void init_lcd()
- {
- delay1ms(15);
- com_lcd(0x38);
- delay1ms(5);
- com_lcd(0x38);
- delay1ms(5);
- com_lcd(0x38);
- delay1ms(5);
- com_lcd(0x01);
- delay1ms(5);
- com_lcd(0x06);
- delay1ms(5);
- com_lcd(0x0f);
- delay1ms(5);
- }
- void main()
- {
- uchar i;
- init_lcd();
- delay1ms(10);
- while(1)
- {
- i=0;
- com_lcd(0x01);
- delay1ms(2);
- addrrom_lcd(0x00);
- delay1ms(2);
- while(string[i]!='\0')
- {
- writer_lcd(string[i]);
- delay1ms(100);
- i++;
- }
- while(1);
- }
- }
