在关于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);
}
}
|