LCD1602液晶显示完全

发布 2019-09-20 09:36:40 阅读 6106

一、关于lcd1602:

在编写lcd1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点。

1.管脚:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:rs(数据命令选择端),r/w(读写选择端),e(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

以下具体阐述这三个管脚:

rs为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

r/w为读写选择,高电平进行读操作,低电平进行写操作。

e端为使能端,后面和时序联系在一起。

除此外,d0~d7分别为8位双向数据线。

2.操作时序:

注:关于e=h脉冲——开始时初始化e为0,然后置e为1,再清0.

读取状态字时,注意d7位,d7=1,禁止读写操作;d7=0,允许读写操作;

所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序)

3.指令集:

lcd_1602 初始化指令小结:

0x38 设置16*2显示,5*7点阵,8位数据接口。

0x01 清屏。

0x0f 开显示,显示光标,光标闪烁。

0x08 只开显示。

0x0e 开显示,显示光标,光标不闪烁。

0x0c 开显示,不显示光标。

0x06 地址加1,当写入数据的时候光标右移。

0x02 地址计数器ac=0;(此时地址为0x80) 光标归原点,但是ddram中断内容不变。

0x18 光标和显示一起向左移动。

4.显示地址:

lcd1602内部ram显示缓冲区地址的映射图,00~0f、40~4f分别对应lcd1602的上下两行的每一个字符,只要往对应的ram地址写入要显示字符的ascii**,就可以显示出来。

5.读写时序:

时序图1602手册中有,这里不引用了。时序图很重要,编程就是根据时序图设置寄存器,让lcd工作。

二、lcd1602程序编写流程:

lcd1602在了解完以上信息后便可以编写,这里我们把程序分为以下几步:

1.定义lcd1602管脚,包括rs,r/w,e。这里定义是指这些管脚分别接在单片机哪些i/o口上。

现举例如下:

sbit en=p3^4;

sbit rs=p3^5;

sbit rw=p3^6;

2.显示初始化,在这一步进行初始化及设置显示模式等操作,包括以下步骤:

设置显示方式。

延时。清理显示缓存。

设置显示模式。

通常推荐的初始化过程如下:

延时15ms

写指令38h

延时5ms写指令38h

延时5ms写指令38h

延时5ms注:以上写38h指令可以看情况省略1~2步。

以上都不检测忙信号)

以下都要检测忙信号)

写指令38h

写指令08h 关闭显示。

写指令01h 显示清屏。

写指令06h 光标移动设置。

写指令0ch 显示开及光标设置。

3.设置显示地址(写显示字符的位置)。

4.写显示字符的数据。

三、lcd1602各子程序模块及主程序编写:

现在按照上面编写程序的流程,给出各子程序模块及主程序的例子。

1.头文件,宏定义,定义管脚等:

#include<>

#include <>

#define uchar unsigned char

#define uint unsigned int

sbit en=p3^4;

sbit rs=p3^5;

sbit rw=p3^6;

uchar code table0=此条语句为显示字符串时定义的字符串数组。

2.lcd1602基本初始化子程序:

void lcd1602()

en=0;rs=1;

rw=1;p0=0xff; /这里p0为与lcd d0~d7相连的i/o口。

3.读忙子程序:

voidread_busy()

p0=0xff;

rs=0;rw=1;

en=1;while(p0&0x80); p0和***相与,d7位若不为0,停在此处。

en=0; /若为0跳出进入下一步;这条语句的作用就是检测d7位。

若忙在此等待,不忙跳出读忙子程序执行读写指令。

4.写指令写数据子程序:

void write(uchari,bit j)

read_busy();

p0=i; /其中i=0,写指令;i=1,写数据;

rs=j;rw=0;

en=1;en=0;

5.延时子程序:

void delay(uint c) /功能为提供初始化等其他子程序中的延时1xc ms

uinta,b;

for(a=0;afor(b=0;b<120;b++)

6.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);

7.显示单个字符子程序:

void display_lcd_byte(uchary,ucharx,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); 写入数据。

8.显示字符串子程序:

void display_lcd_text(uchary,ucharx,uchar table)y,x同上字符显示,table字符串数组。

uchar z=0;

uchar t;

t=strlen(table)+x; /求得字符串长度加上起始列位置。

while(x{ /没有16个字符,从而不够位产生乱码;

display_lcd_byte(y,x,table[z]);逐位显示数组内字符。

x++;z++;

9.主程序:

主程序里除了放入初始化程序外就是加入自己编写的显示子程序,根据你所要的不用功能可以编写各种类型的显示子程序,这里不做详细介绍,以下举例为显示一个字符和显示字符串的显示子程序。

void main()

lcd1602();

init();

display_lcd_byte(0,0,'a');显示一个字符。

display_lcd_text(1,3,table); 显示字符串。

while(1);

到此,让lcd1602显示的操作流程和编程思想基本可以告一段落了,这里有一个完整的显示程序可显示2行英文:大家可依样画瓢,自己修改运行,但是1602的功能实现远不止这些。利用1602你可以做出动态效果的显示,并且除了显示一般字符外,1602还支持自定义字符等等其他一些功能,下面在最后简单介绍下显示动态效果和自定义字符。

一、显示动态效果:

显示动态效果包括让一个字符或字符串原位置闪烁,或者前后移动等等。其实动态效果原理很简单,就是简单的利用延时。

例如让字符原位置闪烁,可以认为是先让1602显示字符,延时一段时间后,可以显示空格或者直接清屏操作都可以达到让字符消失不见的效果,再延时一段时间后再让1602显示这个字符。

同理,让字符前后移动也是这样,例如让字符在第一个位置显示,延时一段时间后让其在后面第二个位置显示,只要显示地址加1,然后显示即可。字符串也是同样的道理。

在这里补充一点就是如何让字符串从1602第16个地址外进入,动态向前移动。其实可以通过显示地址表我们知道起始位置开始后1602一行只能显示16个字符,但是一行的地址却远远不止16个。大家可以看到第一行显示地址是从00~27,然而能显示在1602可见范围的只有00~0f,后面的位置其实就是起到一个缓冲的作用,你完全可以让字符数据存在在10地址后的ram中,只不过,我们无法看到就是了,如果存在10前的地址我们就能看到显示。

因此,我们可以先把显示起始地址设在10地址后的某一个位置,然后让字符显示地址每次加1,当加到0f时,我们就可以看到字符串第一个字符出现在1602的最末一位,然后继续向前移动。

下面给出一段字符串移动显示的例子:

voiddisplay_lcd_byte(uchary,ucharx,uchar z)

if(y)x+=0x40;

x+=0x80;

write(x,0);

write(z,1);

voiddisplay_lcd_text(uchary,ucharx,uchar table)

uchar z=0;

uchar t;

t=strlen(table)+x;

while(x{

display_lcd_byte(y,x,table[z]);

x++;z++;

display_lcd_byte(y,x,'

/前两个子程序是显示子程序。

160句英语入门短句

1.hi 你好!2.nice to meet you.很高興見到你。3.how are things going?近來如何?4.keeping busy?近來忙嗎?5.how are you doing?你好嗎?i m doing great.我過得很好。6.how s everything?一切都...

疯狂英语160句实用会话

1.hi.你好。2.nice to meet you.见到你很高兴。3.how are things going?近况如何?4.keeping busy?近来忙吗?5.how are you doing?你好吗?6.how s everything?一切都好吗?7.how h e you been?...

读书名言大全160句

1 不怕读得少,只怕记不牢。徐特立。2 莫等闲,白了少年头,空悲切!岳飞。3 书籍是培育我们的良师,无需鞭答和根打,不用言语和训斥,不收学费,也不拘形式,对图书倾注的爱,就是对才智的爱。德伯里。4 熟读唐诗三百首,不会作诗也会吟。孙洙 唐诗三百首序 5 书到精绝潜心读 文穷情理放声吟。对联集锦 6 ...