- 6
- 0
- 约4.34千字
- 约 9页
- 2018-03-09 发布于河南
- 举报
关于LCD1602显示的应用
关于LCD1602显示的应用:
LCD1602是51单片机中很重要的模块之一,为了方便新手学习1602,笔者把自己学习1602的一些心得体会拿出来和菜鸟分享,因笔者水平有限,错误在所难免,望大家指正。本文程序基于慧净HJ-1G51开发板。很多程序为本人自己编写,可以直接拿去用。
RS R/W 操作说明 0 0 写入指令 0 1 读取输出的D0~D7状态字 1 0 写入数据D0~D7 1 1 从读取数据 注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.sbit EN=P3^4;
sbit RS=P3^5;
sbit RW=P3^6;
显示初始化,在这一步进行初始化及设置显示模式等操作,包括以下步骤:
设置显示方式
延时
清理显示缓存
设置显示模式
通常推荐的初始化过程如下:
延时15ms写指令38H延时5ms写指令38H延时5ms写指令38H延时5ms(以上都不检测忙信号)(以下都要检测忙信号写指令38H写指令08H 关闭显示写指令01H 显示清屏写指令06H 光标移动设置
写指令0cH 显示开及光标设置#includereg52.h
#include string.h
#define uchar unsigned char
#define uint unsigned int
sbit EN=P3^4;
sbit RS=P3^5;
sbit RW=P3^6;
uchar code table0[]={QQ:545699636
}; //此条语句为显示字符串时定义的字符串数组
LCD1602基本初始化子程序:
void LCD1602()
{
EN=0;
RS=1;
RW=1;
P0=0xff; //这里P0为与LCD D0~D7相连的I/O口
}
读忙子程序:
void read_busy()
{
P0=0xff;
RS=0;
RW=1;
EN=1;
while(P00x80); //P0与,D7位若不为0,停在此处
EN=0; //若为0跳出进入下一步;这条语句的作用就是检测
} //D7位,若忙在此等待,不忙跳出读忙子程序执行读写指令
写指令写数据子程序:
void write(uchar i,bit j)
{
read_busy();
P0=i; //其中i=0,写指令;i=1,写数据;
RS=j;
RW=0;
EN=1;
EN=0;
}
延时子程序:
void delay(uint c) //功能为提供初始化等其他子程序中的延时1xc MS
{
uint a,b;
for(a=0;ac;a++)
for(b=0;b120;b++);
}
LCD1602初始化子程序:
void init() //完全按照要求初始化流程来,中间省略了一步写指令38H
{
delay(15);
write(0x38,0);
delay(5);
write(0x38,0);
write(0x08,0);
write(0x01,0);
write(0x06,0);
write(0x0c,0);
}
显示单个字符子程序:
void display_lcd_byte(uchar y,uchar x,uchar z) //Y=0,1(起始行),
{ // X=0~15(起始列),Z=想写入字符的ASCII码
if(y) //是否显示在第二行(若在第一行Y=0,不进入IF语句,若在第
{ //二行,进入IF语句
x+=0x40; //第二行起始地址加上列数为字符显示地址
}
x+=0x80; //设置数据指针位置
write(x,0);
write(z,1); //写入数据
}
显示字符串子程序:
void display_lcd_text(uchar y,uchar x,uchar table[])
{ //Y(起始行),X(起始列)同字符显示,table[]字符串数组
uchar z=0;
uchar t;
t=strlen(table)+x; // 求得字符串长度加上起始列位置
while(xt) //功能为LCD显示到字符串最后一个字符,防止字符串
{ //没有16个字符,从而不够位产生乱码;
display_lcd_byte(y,x,table[z]); //逐位显示数组内字符
x++;
z++;
}
}
主程序:
主程序里除了放入初始化程序外就是加入自己编写的显示子程序,根据你所要的不用功能可以编写各种类型的显示子程序,这里不做详细介绍,以下举例为显示一个字符和显示字符串的显示子程序。
void main()
{
LCD1602();
init(
原创力文档

文档评论(0)