单片机 1602液晶不能显示

原理图是用LCD1602制作秒表,我遇到了问题,液晶什么也不显示,下面的程序暂时不制作秒表,是想显示“L LOVE MCU”字符的,可是字符也不显示,郁闷,请帮我看看我的程序哪里出错了,顺便给个1602液晶秒表的C程序
采纳为答案追加50
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar num;

sbit S1=P1^0; //计时/暂停
sbit S2=P1^1; //清零
sbit FMQ=P3^7; //蜂鸣器
sbit lcden=P3^6;
sbit lcdrw=P3^5;
sbit lcdrs=P3^4;

uchar code table[]="I LOVE MCU";

void delay(uint k)//延时函数
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}

void write_com(uchar com)
{
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_data(uchar date)
{
lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

//-----------------------------------液晶初始化函数
void init()
{
lcden=0;
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x0c); //开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加一
write_com(0x01); //清屏
}

void main()
{
init();
FMQ=0;
write_com(0x80);
for(num=0;num<13;num++)
{
write_data(table[num]);
delay(5);
}
while(1);
}

这个我做过,不过程序没怎么看,都是网上找的,凑一块就OK了-_-///
我当时做的时候,错误的话1602上还会显示乱码的,你的是一点显示都没有吗?看是不是显示的亮度没有调整?
下边的是我找的代码:
/**************
程序效果:单片机控制液晶显示器1602显示字母数字,用户自行更改io
程序版权
************** /
#include<reg51.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar code table[]="51HEI XING XING " ; //显示的字母
uchar code table1[]="51HEI MCU XUE YUAU" ;
sbit lcdrs=P1^0; //寄存器选择引脚
sbit lcdwr=P1^1; //读写引脚
sbit lcde=P1^2; //片选引脚
void delay(uchar x) //延时子函数
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com) //写指令子函数
{ //根据1602液晶显示器协议编写
P2=com;
lcdrs=0;
lcdwr=0;
delay(5);
lcde=0;
delay(5);
lcde=1;
}
void write_dat(uchar dat) //写数据子函数
{
P2=dat;
lcdrs=1;
lcdwr=0;
delay(5);
lcde=0;
delay(5);
lcde=1;
}
void init() //初始化子函数
{
write_com(0x01); //清屏
write_com(0x3f); //功能设置
write_com(0x0d); //显示控制
write_com(0x06); //输入方式设置
}
void main()
{
uchar i; //定义局部变量
init();
write_com(0x80+0x02+0x10); //指针的位置
for(i=0;i<15;i++) //显示
{
write_dat(table[i]);
delay(50); //延时,用于调节速度不匹配
}
write_com(0x80+0x40+0x10);
for(i=0;i<16;i++)
{
write_dat(table1[i]);
delay(50);
}
for(i=0;i<16;i++)
{
write_com(0x18);
delay(50);
}
while(1);
}
引脚的定义不太一样,然后你再改下,试试看,外围电路的连接也最好检测一下是不是连接正常。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-03
1602的驱动,自己按照硬件电路改一下程序里的端口就可以运行了。
/******************************************************************************
LCD1602显示程序,调用函数为:lcd_display(uchar *lp,uchar address);仅第一次调用时
初始化lcd。
******************************************************************************/
#include <STRING.H>
#include <reg52.h>
#define lcd_data P2 //数据端口
#define busy 0x80 //用于检测LCD状态字中的Busy标识

#define uchar unsigned char
#define uint unsigned int

sbit lcd_RS=P1^0; //数据/命令端
sbit lcd_RW=P1^1; //读/写端
sbit lcd_EN=P1^2; //全使能端

uchar flag=1;

void delay_ms(uint ms);
uchar lcd_testbusy();
void lcd_write_data(uchar dat,uchar Busy);
void lcd_write_com(uchar com,uchar Busy);
void lcd_init();
void lcd_display(uchar *lp,uchar address);

void lcd_display(uchar *lp,uchar address)
{
uchar i,j;
j=strlen(lp);
if(flag)
lcd_init(); //初始化lcd

lcd_write_com(0x80+address,1); //初始化写数据指针

for(i=0;i<j;i++)
{
lcd_write_data(lp[i],1); //写数据
}
flag=0;
}

uchar lcd_testbusy()
{
lcd_data=0xff; //读入前先写1
lcd_RS=0;
lcd_RW=1;
lcd_EN=0;
delay_ms(1);
lcd_EN=1;
delay_ms(1);
while(lcd_data & busy); //等待lcd空闲
return(1);
}

void lcd_write_data(uchar dat,uchar Busy)
{
if(Busy) //判断是否需要检测忙
lcd_testbusy();
lcd_RW=0;
lcd_RS=1;
lcd_data=dat;
delay_ms(2);
lcd_EN=1;
delay_ms(5);
lcd_EN=0;
}

void lcd_write_com(uchar com,uchar Busy)
{
if(Busy) //判断是否需要检测忙
lcd_testbusy();
lcd_RW=0;
lcd_RS=0;
lcd_data=com;
delay_ms(2);
lcd_EN=1;
delay_ms(5);
lcd_EN=0;
}

void lcd_init()
{
delay_ms(20); //等待启动
lcd_write_com(0x38,0); //显示模式设置,不检测忙
delay_ms(5);
lcd_write_com(0x38,0); //显示模式设置,不检测忙
delay_ms(5);
lcd_write_com(0x38,0); //显示模式设置,不检测忙
lcd_write_com(0x38,1); //显示模式设置,检测忙
lcd_write_com(0x08,1); //关显示
lcd_write_com(0x01,1); //清屏
lcd_write_com(0x06,1); //显示光标移动设置
lcd_write_com(0x0c,1); //显示光标设置
}

void delay_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
第2个回答  2010-12-03
我感觉是 最后的while(1);
你把程序放在循环中试试
第3个回答  2010-12-03
你的write_com跟write_data并没有做到write的动作,因为你的lcdrw都没动作,底下给你参考一下
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
P2=com;
delay(5);
lcden=1;
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
lcdrw=0;
P2=date;
delay(5);
lcden=1;
lcden=0;
}本回答被提问者采纳

自己制作的单片机最小系统1602液晶没有任何显示,只有背光灯亮?怎么回事...
在没有任何程序写入的情况下,液晶不会有显示。一般情况下, 需要调整外接的滑动变阻器获得最佳对比度,对比度太低,会显示很浅。

为什么单片机的1602显示器有亮光,却没有显
有亮光,说明1602的背光灯打开了,没有显示内容,说明没有向1602送显示内容,或者发送了错误信号。

单片机中 LCD1602不能显示字符
有光标闪烁表明显示正常阿,你想想,光标要闪烁,显示器初始化没问题,传输的数据也就没问题,显示也就没有问题了。因为其闪烁是由命令控制的。现在你可以根据闪烁光标查下看是不是对比度或亮度问题。先从硬件上查,不行就量下两块板的接口电压,对比找 ...

51单片机 LCD1602只亮不显示东西
对于LCD1602不显示字符,一是先检查仿真电路对不对,再检查程序中定义的控制引脚与仿真图是否相符。因很多人都是从网上找的程序,与自己的仿真图并不相符,需要改程序的引脚定义,但没有改。二就是检查程序是不是写错了,虽然引脚定义对,但显示字符的程序不对。你没有发仿真图,所以,看程序是找不到...

刚刚买了一块1602的液晶屏,只有背光灯亮,液晶屏没有显示,并且调节对比...
没有显示很可能是AD驱动板没有工作;从对比度不能调节这一点来看,有可能是AD驱动板的MCU工作异常,或它的电源部分不正常,使得AD板不能输出高电平去控制高压板的开关极(此时有背光,但不能显示);因此,楼主可从AD驱动板的输出(控制)端的电平变化来作出判断,兴许能够找到真正的答案。

自己焊的单片机 1602液晶显示 为什么显示 乱码
可能产生的问题如下:1、I\/O口与LCD的数据口方向焊反2、LCD的RS、RW、E的控制I\/O口在程序编辑时定义错误3、程序错误只要这三点做对了是绝对没问题的

52单片机烧入程序,1602只亮,不显示
1602只亮不显示字符有可能的问题是:1、对比度调整不合适,调整一下电路参数就可以解决。2、软件问题,这个需要看到源程序才知道问题所在。

自己根据51单片机和液晶屏1602的原理和相关电路图焊接了一个简单的...
不能正常显示有多种情况,问题没有描述清楚。以下简列几种可能情况:情况一:数字图形显示正常,但数字显示的位置不对;可以检查下引脚的焊接电路,是引脚焊错导致的。情况二:数字图形显示不正常,则是现实模块阴阳极焊接顺序焊接反了。情况三:数字图形和位置显示都正常,但是位置、顺序错乱,该显示的没...

51单片机 控制1602 液晶 遇到问题 求高手指教
这可能是程序的延时问题,你要把显示的时间加大一点。如果是C语言则在主程序delay()中的数改大点。

在单片机与1602连接后出现部分字符显示不出来
呵呵、、、看了这程序你是应该是看郭天祥单片机学习资料的,看是没有显示清0,才出现的情况不过你的程序是有屏幕清0的指令(write_com(0x01))。如果程序是对的,你试试调一下实验板上边的精调电阻看看,这应该是你液晶显示的对比度问题。

相似回答