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);
}

本回答被提问者采纳

proteus仿真1602无显示
原因就是把RS,RW,EN全接到P0就不行的,因P0口每个引脚都要加上拉电阻,而你没有加,所以,P0口就不能输出高电平,只有低电平,那个RS应该是高电平,为红点,可接到P0口是灰点,表示引脚处于悬空状态,因内部输出高电平,但实际上是悬空状态了。你的排电阻接到数据口P2上了,不用的,把排电阻...

proteus仿真80c51测无极性电容时1602显示的数值一直为0。程序太长了...
看你的仿真图,被测电容和电感组成谐振电路,再用运放处理后送P3.5去计数,是这样吗。那你首先必须要保证运放有方波信号输出,才能用计数器计数。在运放的输出端接示波器,看看有方波信号吗。示波器如下图所示。

如何在proteus中找到1602显示屏
1、使用proteus打开一个工程,点击DEVICES的P,准备放置元件。2、在Pick Devices对话框中的“Category”列表找到“Optoelectronics”。在“Sub-category”列表中选择“Alphanumeric LCDs”。3、可以在右侧的Results中看到可以使用的LCD元件,其中Description列名了分辨率,16x2即为1602,确认后点击“OK”键,如下...

proteus仿真是1602液晶不显示字符 求高人指点
绝b是程序的问题吧,程序发过来我看看,后者你先认真参考一下时序,单片机难就难在这个时序上面。电路图没错啊,我照你的画了,刚好我这里有以前做实验的程序,试了一下没问题,不过我的程序里面有关于中断的东东,电路有点不一样,但我是试了你的电路的,说明电路没问题。程序如下,你拷贝过去试试...

新手!1602液晶在proteus上仿真的问题。我是参考郭天祥的教程写的程序...
程序定义的引脚 sbit lcden=P2^0;sbit lcdrs=P2^2;与仿真图不一致呀。把仿真图按程序改一下就好了,或者按仿真图改一下程序。

求助,为什么这个闹钟程序在Proteus液晶屏幕不显示东西
如果是1602的话,实物能显示,仿真可能显示不了,因为时序不太一样 如果是12864的话,12864型号比较多种,但proteus当中是不带中文的,如果需要显示中文需要绘图,类似于点阵

51单片机1602A液晶和数码管的问题 C语言编程
单片机刚启动时,所有的I\/O口默认输出的都是高电平,需复位完成后,才能根据程序进行输出,可能这时候就点亮了数码管,如果不想让它闪,这个只有改动硬件了,通过程序解决不了,不过闪一下也没有关系的,现在很多设备上刚开机的时候也有这个现象,希望对你有帮助 ...

proteus 中SMC1602A用什么代替?
用LM016L代替,如果是51单片机的话驱动数据端口时要加上拉电阻.

用51单片机编写数字钟出问题了,求高手解答
\/* 因为用的仿真电路不一样,所以rs和en引脚改P2口了 *\/\/* 1602有个rw读写使能端,加了个引脚控制 *\/\/* 我不知道这dula和wela两个引脚的作用,所以临时换到P3口了 *\/\/* 在write_cmd和write_date的时序中加了rw读写使能 *\/\/* data是数据的意思 date是日期的意思 *\/\/* 把时分秒的显示...

为什么1602只显示一排黑块???
你的P0口没加上拉电阻,根本就驱动不了!那些个偏压什么的不用连也可以用,只要程序对!驱动电路没什么问题,废话就不说了,直接看图 我空间里面有LCD1602详细的使用方法,可以去看一下!

相似回答