proteus 仿真51单片机,1602A不显示,如图,怎么回事哦

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
void delay_ms(uchar t)
{
uchar i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);

}
void write_cmd(uchar cmd)
{
rs=0;
rw=0;
P0=cmd;
en=0;
delay_ms(5);
en=1;
}
void write_data(uchar dat)
{
rs=1;
rw=0;
P0=dat;
en=0;
delay_ms(5);
en=1;
}
void init_1602()
{
write_cmd(0x38);
delay_ms(5);
write_cmd(0x0c);
delay_ms(5);
write_cmd(0x06);
delay_ms(5);
write_cmd(0x01);

}
void write_str(uint x,uint y,uchar *s)
{
if(x==0) write_cmd(0x80+y);
else if(x==1) write_cmd(0x80+0x40+y);
while(*s)
{
write_data(*s);
s++;

}

}
void main()
{
init_1602();
while(1)
{
write_str(0,0,"welcome");

}

}

兄弟,你好,我就用你的程序,你的图测试过了,可以显示。

不可能啊,你的程序肯定没问题啊,我直接粘过去编译的,是

可以正常显示的。

上图为证:

追问

你的可以,你没有改程序?我的找到问题了,en使能改成下降沿才行的
void write_cmd(uchar cmd)
{
rs=0;
rw=0;
P0=cmd;
en=0;
delay_ms(5);
en=1;
}

追答

一个字都没动过,图也没动过。
不过你找到问题了,就不要再
纠结了。实在想研究的话可以
再仔细研究一下1602的操作
时序。

追问

问题有点奇怪了。。。我是把en改成上升沿en=1;delay_ms(5);en=0;这样才会显示,
你的竟然直接就可以了,你proteus 里的1602液晶使用LM06L的

追答

是的。我查了一下我之前写的程序,
确实都是用上降沿,不过我就是把
你这个直接粘过去的,没改动,
LCD也是LM06L没错。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-17
不要用指针试试,
while(*s)
{
write_data(*s);
s++;

}
这个最好用for循环,
while(1)
{
write_str(0,0,"welcome");

}
这里把while(1)放在write_str函数的后面,写一次就行了,希望对你有帮助追问

void write_str(uint x,uint y,uchar s[])
{
uint i=16;
if(x==0) write_cmd(0x80+y);
else if(x==1) write_cmd(0x80+0x40+y);
for(i=0;i<16 && s[i]!='\0';i++)
{
write_data(s[i]);

}
void main()
{
init_1602();
write_str(0,0,"welcome");
while(1);

}
结果一样的,还是不显示

追答

这是我以前写的,你参考一下试试
#include
#define uchar unsigned char
#define uint unsigned int
uint h1,h2;
uchar code table[]="Hello classmate";
uchar code table1[]="HAPPY EVERYDAY";
sbit lcden=P3^4;
sbit lcdrw=P3^6;
sbit lcdrs=P3^5;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
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(0x0f);
write_com(0x06);
write_com(0x80);
}
void main()
{
lcdrw=0;
init();
for(h1=0;h1<15;h1++)
{
write_data(table[h1]);
delay(20);
}
write_com(0x80+0x41);
for(h2=0;h2<14;h2++)
{
write_data(table1[h2]);
delay(20);
}
while(1);
}

本回答被提问者采纳
相似回答