标题: 为什么LCD1602不显示? [打印本页]
作者: 孙韬 时间: 2018-4-30 21:01
标题: 为什么LCD1602不显示?
这个程序的目的是显示出welcome Harbin China
我先是使用的查忙程序,但是LCD没有显示
后来用的这个程序没有使用差忙的程序,而是使用的延时函数,但是1602液晶屏还是没有显示,谁知道是怎么回事吗?
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define out P0
sbit RS=P2^0;//将P2口的0,1,2号口作为RS RW E的接口
sbit RW=P2^1;//
sbit E=P2^2;//
void LCD_initialize();//初始化函数
void check_busy();//查忙函数,但是这次没有用到
void write_command(uchar com);//写命令函数
void write_data(uchar dat);//写数据函数
void string(uchar ad,uchar*p,uchar n);//使Lcd显示字符的函数
void delay(uchar i);//延时函数
void main()
{
LCD_initialize();//LCD初始化
while(1)
{
string(0x85,"welcome",7);//写入welcome
string(0xc2,"Harbin China",12);//写入Harbin China
delay(100);
write_command(0x01);//清屏
delay(100);
}
}
void delay(uchar i)//延时函数
{
uchar t;
while(i--)
{
for(t=0;t<120;t++);
}
}
void write_command(uchar com)//写命令函数
{
delay(1);
E=0;
RS=0;
RW=0;
out=com;
delay(1);
E=1;
_nop_();
E=0;
delay(1);
}
void LCD_initialize()//初始化函数
{
write_command(0x38);
_nop_();
write_command(0x0c);
_nop_();
write_command(0x0b);
_nop_();
write_command(0x01);
delay(1);
}
void write_data(uchar dat)//写数据函数
{
delay(1);
E=0;
RS=1;
RW=0;
out=dat;
delay(1);
E=1;
_nop_();
E=0;
delay(1);
}
void string(uchar ad,uchar *p,uchar n)//显示字符函数
{
uchar i;
write_command(ad);
for(i=0;i<n;i++)
{
write_data(*p++);
delay(100);
}
}
-
T@(7QC0)[TGTT$@@%6FEQPO.png
(63.88 KB, 下载次数: 102)
作者: zl2168 时间: 2018-5-2 12:52
实例67 LCD1602显示屏显示
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1。书中电路和程序设计有详细说明,程序语句条条有注解。
作者: wulin 时间: 2018-5-2 16:27
改了一下,实物验证正常。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define out P0
sbit RS=P2^0;//将P2口的0,1,2号口作为RS RW E的接口
sbit RW=P2^1;//
sbit E=P2^2;//
//void LCD_initialize();//初始化函数
//void check_busy();//查忙函数,但是这次没有用到
//void write_command(uchar com);//写命令函数
//void write_data(uchar dat);//写数据函数
//void string(uchar ad,uchar*p,uchar n);//使Lcd显示字符的函数
//void delay(uchar i);//延时函数
void delay(uchar i)//延时函数
{
uchar t;
while(i--)
{
for(t=0;t<120;t++);
}
}
void write_command(uchar com)//写命令函数
{
// delay(1);
E=0;
RS=0;
// RW=0;
out=com;
delay(1);
E=1;
delay(1);
E=0;
// delay(1);
}
void write_data(uchar dat)//写数据函数
{
// delay(1);
// E=0;
RS=1;
// RW=0;
out=dat;
delay(1);
E=1;
delay(1);
E=0;
// delay(1);
}
void LCD_initialize()//初始化函数
{
RW=0;
write_command(0x38);
write_command(0x01);
write_command(0x0c);
write_command(0x06);
// write_command(0x0b);
write_command(0x80);
}
void string(uchar ad,uchar *p,uchar n)//显示字符函数
{
uchar i;
write_command(ad);
for(i=0;i<n;i++)
{
write_data(*p++);
delay(100);
}
}
void main()
{
LCD_initialize();//LCD初始化
while(1)
{
string(0x85,"welcome",7);//写入welcome
string(0xc2,"Harbin China",12);//写入Harbin China
delay(100);
write_command(0x01);//清屏
delay(100);
}
}
作者: 孙韬 时间: 2018-5-4 07:47
行,已经改好了,多谢帮助!
作者: 孙韬 时间: 2018-5-4 07:48
已经改好了,多谢帮助!
作者: SOsong 时间: 2018-5-4 09:41
时序问题或者电位器
作者: 18686906042 时间: 2019-8-3 12:30
void string(uchar ad,uchar *p,uchar n)//显示字符函数
{
uchar i;
write_command(ad);
for(i=0;i<n;i++)
{
write_data(*p++);
delay(100);
}
}
请问这个*号是什么呢?为什么去掉之后就不对了,而显示乱码
作者: aaaaaa。 时间: 2019-8-3 14:13
*是指针
作者: 18686906042 时间: 2019-8-4 10:49
谢谢蟹蟹,还有个问题,这两个*都不可省略嘛????
作者: 18686906042 时间: 2019-8-4 12:50
* 指针运算符 //*p为p所指向的存储单元的内容
p就相当于存储单元地址
作者: sprout 时间: 2019-8-4 13:45
检查一下是a6还是a18
作者: zhuxiaoyao 时间: 2019-8-4 13:56
void LCD_initialize()//初始化函数
{
write_command(0x38);
_nop_();
write_command(0x0c);
_nop_();
write_command(0x0b);
_nop_();
write_command(0x01);
delay(1);
}
这个你把0xb改为0x6就可以显示,但是显示是一次显示的。我用自己的实验板演示了以下。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |