当BF=1,表示LCD1602正忙,不能接受单片机的指令;当BF=0,表示LCD1602空闲,可以接收单片机的指令。RS=0,表示是指令;RW=1,表示是读取。

这条指令还有一个副产品:即可以得到地址记数器AC的值(address counter)。LCD1602维护了一个地址计数器AC,用来记录下一次读写CGRAM或DDRAM的位置。

需要强调的是:这条指令我一次也没有执行成功。很多网友似乎也是这样。好在我们有另外的办法,也就是延时。通过查看每条指令的执行时间,再经过一些试验,可以确定指令的延时。这样就可以在上一条指令执行完毕后再执行下一条指令了。

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

LCD1602驱动为什么把字符代码写入DDRAM?

图24

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

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

LCD1602驱动为什么把字符代码写入DDRAM?

图25

RS=1,数据;RW=1,读。先设置好CGRAM或DDRAM的地址,然后执行读取命令。数据就被读入后DB7—DB0。

实 例

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

先介绍一下背景:

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

采用STC89C52RC,晶振22.1184MHZ。

以5×8点阵,16×2行,8位数据端口。

首先在第一行显示“I love MCU!”,第二行显示“LCD1602 Test!”。延时一段时间,清屏。

然后在第一行显示自定义字符:摄氏温标标志。第二行显示圆周率(pai)标志。再延时一段时间,清屏。

最后在第一行显示“Welcome to my blog!”,显示方式是从屏幕右面移入,左面移出。

周而复始(如图26)。

LCD1602驱动为什么把字符代码写入DDRAM?

图26

代码如下:

←左右滑动,查看代码→

//File1

#ifndef __ZHANGTYPE_H__

#define __ZHANGTYPE_H__

#define uint8 unsigned char

#define uint16 unsigned short int

#define uint32 unsigned long int

#define int8 signed char

#define int16 signed short int

#define int32 signed long int

#define uint64 unsigned long long int

#define int64 signed long long int

#endif

//File2

#ifndef __FUN_H__

#define __FUN_H__