LCD1602的单片机驱动详解Word下载.docx

上传人:b****4 文档编号:7663993 上传时间:2023-05-08 格式:DOCX 页数:21 大小:641.09KB
下载 相关 举报
LCD1602的单片机驱动详解Word下载.docx_第1页
第1页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第2页
第2页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第3页
第3页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第4页
第4页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第5页
第5页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第6页
第6页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第7页
第7页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第8页
第8页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第9页
第9页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第10页
第10页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第11页
第11页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第12页
第12页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第13页
第13页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第14页
第14页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第15页
第15页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第16页
第16页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第17页
第17页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第18页
第18页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第19页
第19页 / 共21页
LCD1602的单片机驱动详解Word下载.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

LCD1602的单片机驱动详解Word下载.docx

《LCD1602的单片机驱动详解Word下载.docx》由会员分享,可在线阅读,更多相关《LCD1602的单片机驱动详解Word下载.docx(21页珍藏版)》请在冰点文库上搜索。

LCD1602的单片机驱动详解Word下载.docx

7

D0

15

A

背光正极

8

D1

16

K

背光负极

对这个表的说明:

1. 

 

VSS接电源地。

2. 

VDD接+5V。

3. 

VO是液晶显示的偏压信号,可接10K的3296精密电位器。

或同样阻值的RM065/RM063蓝白可调电阻。

见图3。

图3

4. 

RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;

当RS为高电平时,选择数据。

5. 

RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;

当RW为高电平时,从LCD1602读取状态或数据。

如果不需要进行读取操作,可以直接将其接VSS。

6. 

E,执行命令的使能引脚,接单片机的一个I/O。

7. 

D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。

如果接P0口,P0口应该接4.7K—10K的上拉电阻。

如果是4线并行驱动,只须接4个I/O口。

8. 

A背光正极,可接一个10—47欧的限流电阻到VDD。

9. 

K背光负极,接VSS。

见图4所示。

图4

二.基本操作

LCD1602的基本操作分为四种:

读状态:

输入RS=0,RW=1,E=高脉冲。

输出:

D0—D7为状态字。

读数据:

输入RS=1,RW=1,E=高脉冲。

D0—D7为数据。

写命令:

输入RS=0,RW=0,E=高脉冲。

无。

写数据:

输入RS=1,RW=0,E=高脉冲。

读操作时序图(如图5):

图5

写操作时序图(如图6):

图6

时序时间参数(如图7):

图7

三.DDRAM、CGROM和CGRAM

DDRAM(DisplayDataRAM)就是显示数据RAM,用来寄存待显示的字符代码。

共80个字节,其地址和屏幕的对应关系如下(如图8):

图8

DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。

同样LCD1602共有80个字节的显存,即DDRAM。

但LCD1602的显示屏幕只有16×

2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不能显示出来。

这样,我们在程序中可以利用下面的“光标或显示移动指令”使字符慢慢移动到可见的显示范围内,看到字符的移动效果。

前面说了,为了在液晶屏幕上显示字符,就把字符代码送入DDRAM。

例如,如果想在屏幕左上角显示字符‘A’,那么就把字符‘A’的字符代码41H写入DDRAM的00H地址处即可。

至于怎么写入,后面会有说明。

那么为什么把字符代码写入DDRAM,就可以在相应位置显示这个代码的字符呢?

我们知道,LCD1602是一种字符点阵显示器,为了显示一种字符的字形,必须要有这个字符的字模数据,什么叫字符的字模数据,看看下面的这个图就明白了(如图9)。

图9

上图的左边就是字符‘A’的字模数据,右边就是将左边数据用“○”代表0,用“■”代表1。

从而显示出‘A’这个字形。

从下面的图可以看出,字符‘A’的高4位是0100,低4位是0001,合在一起就是01000001b,即41H。

它恰好与该字符的ASCII码一致,这样就给了我们很大的方便,我们可以在PC上使用P2=‘A’这样的语法。

编译后,正好是这个字符的字符代码。

在LCD1602模块上固化了字模存储器,就是CGROM和CGRAM,HD44780内置了192个常用字符的字模,存于字符产生器CGROM(CharacterGeneratorROM)中,另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(CharacterGeneratorRAM)。

下图(如图12)说明了CGROM和CGRAM与字符的对应关系。

从ROM和RAM的名字我们也可以知道,ROM是早已固化在LCD1602模块中的,只能读取;

而RAM是可读写的。

也就是说,如果只需要在屏幕上显示已存在于CGROM中的字符,那么只须在DDRAM中写入它的字符代码就可以了;

但如果要显示CGROM中没有的字符,比如摄氏温标的符号,那么就只有先在CGRAM中定义,然后再在DDRAM中写入这个自定义字符的字符代码即可。

和CGROM中固化的字符不同,CGRAM中本身没有字符,所以要在DDRAM中写入某个CGROM不存在的字符,必须在CGRAM中先定义后使用。

程序退出后CGRAM中定义的字符也不复存在,下次使用时,必须重新定义。

图10

上面这个图(如图10)说明的是5×

8点阵和5×

10点阵字符的字形和光标的位置。

先来说5×

8点阵,它有8行5列。

那么定义这样一个字符需要8个字节,每个字节的前3个位没有被使用。

例如,定义摄氏温标的符号{0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}。

图11

上面这个图(如图11)说明的是设置CGRAM地址指令。

从这个指令的格式中我们可以看出,它共有aaaaaa这6位,一共可以表示64个地址,即64个字节。

一个5×

8点阵字符共占用8个字节,那么这64个字节一共可以自定义8个字符。

也就是说,上面这个图的6位地址中的DB5DB4DB3用来表示8个自定义的字符,DB2DB1DB0用来表示每个字符的8个字节。

这DB5DB4DB3所表示的8个自定义字符(0--7)就是要写入DDRAM中的字符代码。

我们知道,在CGRAM中只能定义8个自定义字符,也就是只有0—7这8个字符代码,但在下面的这个表(如图12)中一共有16个字符代码(×

×

0000b--×

1111b)。

实际上,如图所示,它只能表示8个自定义字符(×

0000b=×

1000b,×

0001b=×

1001b……依次类推)。

也就是说,写入DDRAM中的字符代码0和字符代码8是同一个自定义字符。

10点阵每个字符共占用16个字节的空间,所以CGRAM中只能定义4个这样的自定义字符。

那么如何在CGRAM中自定义字符呢?

在上面的介绍中,我们知道有一个设置CGRAM地址指令,同写DDRAM指令相似,只须设置好某个自定义字符的字模数据,然后按照上面介绍的方法,设置好CGRAM地址,依次写入这个字模数据即可。

我们在后面的例子中再进行说明。

图12

四.LCD1602指令

1.工作方式设置指令(如图13)

图13

不关心,也就是说这个位是0或1都可以,一般取0。

DL:

设置数据接口位数。

DL=1:

8位数据接口(D7—D0)。

DL=0:

4位数据接口(D7—D4)。

N=0:

一行显示。

N=1:

两行显示。

F=0:

8点阵字符。

F=1:

10点阵字符。

说明:

因为是写指令字,所以RS和RW都是0。

LCD1602只能用并行方式驱动,不能用串行方式驱动。

而并行方式又可以选择8位数据接口或4位数据接口。

这里我们选择8位数据接口(D7—D0)。

我们的设置是8位数据接口,两行显示,5×

8点阵,即0b00111000也就是0x38。

(注意:

NF是10或11的效果是一样的,都是两行5×

8点阵。

因为它不能以两行5×

10点阵方式进行显示,换句话说,这里用0x38或0x3c是一样的)。

2.显示开关控制指令(如图14)

图14

D=1:

显示开,D=0:

显示关。

C=1:

光标显示,C=0:

光标不显示。

B=1:

光标闪烁,B=0:

光标不闪烁。

这里的设置是显示开,不显示光标,光标不闪烁,设置字为0x0c。

3.进入模式设置指令(如图15、16)

图15

I/D=1:

写入新数据后光标右移。

I/D=0:

写入新数据后光标左移。

S=1:

显示移动。

S=0:

显示不移动。

图16

这里的设置是0x06。

4.光标或显示移动指令(如图17、18)

图17

图18

在需要进行整屏移动时,这个指令非常有用,可以实现屏幕的滚动显示效果。

初始化时不使用这个指令。

5.清屏指令(如图19)

图19

清除屏幕显示内容。

光标返回屏幕左上角。

执行这个指令时需要一定时间。

6.光标归位指令(如图20)

图20

光标返回屏幕左上角,它不改变屏幕显示内容。

7.设置CGRAM地址指令(如图21)

图21

这个指令在上面已经介绍过。

用法在后面例子中说明。

8.设置DDRAM地址指令(如图22)

图22

这个指令用于设置DDRAM地址。

在对DDRAM进行读写之前,首先要设置DDRAM地址,然后才能进行读写。

前面我们说过,DDRAM就是LCD1602的显示存储器。

我们要在它上面进行显示,就要把要显示的字符写入DDRAM。

同样,我们想知道DDRAM某个地址上有什么字符,也要先设置DDRAM地址,然后将它读出到单片机。

9.读忙信号和地址计数器AC(如图23)

图23

这个指令用来读取LCD1602状态。

对于单片机来说,LCD1602属于慢速设备。

当单片机向其发送一个指令后,它将去执行这个指令。

这时如果单片机再次发送下一条指令,由于LCD1602速度较慢,前一条指令还未执行完毕,它将不接受这新的指令,导致新的指令丢失。

因此这条读忙指令可以用来判断LCD1602是否忙,能否接收单片机发来的指令。

当BF=1,表示LCD1602正忙,不能接受单片机的指令;

当BF=0,表示LCD1602空闲,可以接收单片机的指令。

RS=0,表示是指令;

RW=1,表示是读取。

这条指令还有一个副产品:

即可以得到地址记数器AC的值(addresscounter)。

LCD1602维护了一个地址计数器AC,用来记录下一次读写CGRAM或DDRAM的位置。

需要强调的是:

这条指令我一次也没有执行成功。

很多网友似乎也是这样。

好在我们有另外的办法,也就是延时。

通过查看每条指令的执行时间,再经过一些试验,可以确定指令的延时。

这样就可以在上一条指令执行完毕后再执行下一条指令了。

10.写数据到CGRAM或DDRAM指令(如图24)

图24

RS=1,数据;

RW=0,写。

指令执行时,要在DB7—DB0上先设置好要写入的数据,然后执行写命令。

11.从CGRAM或DDRAM读数据指令(如图25)

图25

RW=1,读。

先设置好CGRAM或DDRAM的地址,然后执行读取命令。

数据就被读入后DB7—DB0。

五.实例

下面我们就以一个实例来结束这篇文章。

先介绍一下背景:

单片机最小系统(扩充了外部RAM62256)。

采用STC89C52RC,晶振22.1184MHZ。

以5×

8点阵,16×

2行,8位数据端口。

首先在第一行显示“IloveMCU!

”,第二行显示“LCD1602Test!

”。

延时一段时间,清屏。

然后在第一行显示自定义字符:

摄氏温标标志。

第二行显示圆周率(pai)标志。

再延时一段时间,清屏。

最后在第一行显示“Welcometomyblog!

”,显示方式是从屏幕右面移入,左面移出。

周而复始(如图26)。

图26

//File1

#ifndef__ZHANGTYPE_H__

#define__ZHANGTYPE_H__

#defineuint8 

unsignedchar

#defineuint16 

unsignedshortint

#defineuint32 

unsignedlongint

#defineint8 

signedchar

#defineint16 

signedshortint

#defineint32 

signedlongint

#defineuint64 

unsignedlonglongint

#defineint64 

signedlonglongint

#endif 

//File2

#ifndef__FUN_H__

#define__FUN_H__ 

#include"

ZhangType.h"

#include 

voidDelay(uint16time);

//File3

fun.h"

voidDelay(uint16time)

{

while(time--);

//File4

#ifndef__1602_H__

#define__1602_H__

#include

//变量类型

//常用函数 

#define 

SETMODE 

0x38 

//16*2显示,5*7点阵,8位数据接口

#defineDISOPEN 

0x0C 

//显示开,不显示光标,光标不闪烁

#defineDISMODE 

0x06 

//读写字符后地址加1,屏显不移动

SETADDR 

0x80 

//设置数据地址指针初始值

#defineCLEAR0x01 

//清屏,数据指针清零

#defineRET 

0x02 

//回车,数据指针清零 

#definePORT 

P2 

//I/O口 

sbitRS=P1^0;

sbitRW=P1^1;

sbitE=P1^2;

voidInit1602(void);

//初始化1602

voidWrite1602_Com(uint8com);

//写命令

voidWrite1602_Dat(uint8dat);

//写数据

voidCheckBusy(void);

//检查忙

voidWrite1602_One_Dat(uint8X,uint8Y,uint8dat);

//写一个数据

voidWrite1602_Str(uint8addr,uint8length,uint8*pbuf);

//写一个数据串 

#endif//

//File5

1602.h"

voidWrite1602_Com(uint8com)

E=0;

RS=0;

//命令

Delay(50);

//延时

RW=0;

//写 

PORT=com;

//端口赋值

E=1;

//高脉冲

}

voidWrite1602_Dat(uint8dat)

RS=1;

//数据

//写

PORT=dat;

voidCheckBusy(void)

uint8temp;

RW=1;

//读

while

(1)

{

PORT=0xFF;

 

//端口为输入

temp=PORT;

if((temp&

0x80)==0) 

//检查BF位是否为0

break;

}

voidInit1602(void)

Write1602_Com(SETMODE);

//模式设置

Delay(500);

Write1602_Com(DISOPEN);

//显示设置

Write1602_Com(DISMODE);

//显示模式

Write1602_Com(CLEAR);

//清屏

voidWrite1602_One_Dat(uint8x,uint8y,uint8dat)

x&

=0x0f;

y&

=0x01;

if(y)

x|=0x40;

x|=0x80;

Write1602_Com(x);

Write1602_Dat(dat);

voidWrite1602_Str(uint8addr,uint8length,uint8*pbuf)

uint8i;

Write1602_Com(addr);

for(i=0;

i

Write1602_Dat(pbuf[i]);

//File6

*******************************************************

*名称:

主文件(_main.c)

*功能:

测试

*日期:

2014/09/09

*******************************************************/

uint8codehot[8]={ 

//摄氏温度字模

0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00

};

uint8codepi[8]={ 

0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00,0x00 

//pai

uint8codestrMCU[]="

IloveMCU!

"

;

uint8codestrTest[]="

LCD1602Test!

uint8codeblog[]="

Welcometomyblog!

uint8i;

voidmain()

Init1602();

//初始化1602 

//自定义CGRAM

Write1602_Str(0x40,8,hot);

//摄氏温标

Write1602_Str(0x48,8,pi);

Write1602_Str(0x80,strlen(strMCU),strMCU);

//"

Write1602_Str(0x80+0x40,strlen(strTest),strTest);

i<

50;

i++) 

//延时一段时间

Delay(10000);

//指令执行时间较长

//多加一些延时

16;

i++)

Write1602_Dat(0);

Write1602_Com(0xc0);

//设置DDRAM地址

Write1602_Dat

(1);

Write1602_Str(0x80+0x10,strlen(blog),blog);

//写在显示之外

Write1602_Com(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2