第 13章:字符型液晶显示器单片机原理与接口技术作者,于斌、南亦民、宋之涛、林文浩单片机原理与接口技术作者,于斌、南亦民、宋之涛、林文浩第 13章:字符型液晶显示器第 13章 字符型液晶显示器液晶显示器以其 功耗低,体积小,重量轻,超薄型 等诸多其他显示器件所无法比拟的优点,在袖珍式仪表和低功耗系统中,得到越来越广泛的应用 。
第 13章:字符型液晶显示器
13,1.1 字符型 LCD 的结构和引脚第 13章:字符型液晶显示器
13,1.1 字符型 LCD 的结构和引脚
DDRAM,显示数据 RAM 。它用来寄存待显示的代码。
CGROM,字符发生器 ROM。它内部已经存储了 160 个不同的点阵字符图形,
字符图形用于字符的显示。
CGRAM,字符发生器 RAM 。它是 8个允许用户自定义的字符图形 RAM
第 13章:字符型液晶显示器
13,1.1 字符型 LCD 的结构和引脚
CGROM 和 CGRAM 中字符代码与字符图形的对应关系第 13章:字符型液晶显示器
13,1.1 字符型 LCD 的结构和引脚
DDRAM 的地址,LCD 控制器的指令系统规定,在送待显示字符代码的指令前,先要送 DDRAM 的地址,实际上是待显示的字符显示位置。若 LCD 为双行字符显示,则每行 40 个显示位置,第一行地址为 00H ~27H ;第二行地址为 40H ~67H 。
指令寄存器:用来接收 CPU 送来的指令码,也寄存 DDRAM 和
CGRAM 的地址。
数据寄存器:用来寄存 CPU 发来的字符代码数据。
第 13章:字符型液晶显示器
13,1.1 字符型 LCD 的结构和引脚
状态标志位,LCD 控制器有一个忙信号标志位 BF 。当 BF =1
时,LCD 正在进行内部操作,此时不接收外部命令。
AC,地址计数器。 AC 的内容是 DDRAM 或 CGRAM 的单元地址。当对 DDRAM 或 CGRAM 进行读写操作后,AC 自动加 1
或减 1 。
光标/闪烁控制:此控制可产生光标或使光标在显示位置处闪烁,
显示位置为 AC 中的 DDRAM 地址。
第 13章:字符型液晶显示器
13,1.1 字符型 LCD 的结构和引脚字符型 LCD 显示板有 14 条引脚线。这 14 条线的定义是标准的。其定义如下:
Vss ( 1 ),地。
VDD( 2 ),电源电压。
V 0( 3 ),对比调整电压。,
RS ( 4 ),寄存器选择。 RS=0时,读状态寄存器或写命令寄存器;
RS = 1 时,读写数据。
R / W ( 5 ),读写信号线。 R / W =1 时,读操作; R / W =0 时,
写操作。,
E ( 6 ),显示板控制使能端。,
D0~ D7 ( 7 ~ 14 ),8 位双向三态 I / O 线。
第 13章:字符型液晶显示器
13.1.2 显示板控制器的指令系统字符型 LCD 显示板控制器有 11 条指令。它的读写操作,以及屏幕和光标的操作都是通过指令编程来实现的。W/R
指令 RS D7 D6 D5 D4 D3 D2 D1 D0
清显示 0 0 0 0 0 0 0 0 0 0
光标返回 0 0 0 0 0 0 0 0 1?
置输入模式 0 0 0 0 0 0 0 0 I/D S
显示开 /关控制 0 0 0 0 0 0 1 D C B
光标与字符移位 0 0 0 0 0 1 S/C R/
L

置功能 0 0 0 0 1 DL N F
置字符发生存储器地址 0 0 0 1 字符发生存储器地址 AGG
置数据存储器地址 0 0 1 显示数据存储器地址 ADD
读忙标志或地址 0 1 BF 计数器地址 AC
写数到 CGRAM或 DDRAM 1 0 要写的数从 CGRAM或 DDRAM读数 1 1 读出的数据
W/R
第 13章:字符型液晶显示器
13.1.2 显示板控制器的指令系统指令功能如下,
● 指令 l,清显示,光标复位到地址 00H 位置。
●指令 2,光标复位,光标返回到地址 00H 。
●指令 3,读/写方式下的光标和显示模式设置命令。
I / D,表示地址计数器的变化方向,即光标移动的方向。
I / D =1,AC 自动加 1,光标右移一字符位;
I / D = 0,AC 自动减 1,光标左移一字符位。
S,显示屏上画面向左或向右全部平移一个字符位。
S =O,无效; S = 1,有效。
S = 1,I / D = 1,显示画面左移;
S = l,I / D =0,显示画面右移。
第 13章:字符型液晶显示器
13.1.2 显示板控制器的指令系统指令功能如下,
● 指令 4,显示开关控制,控制显示、光标和光标闪烁的开关。
D,当 D =0时显示关闭,DDRAM 中数据保持不变。
C,当 C = 1 时显示光标。
B,当 B = 1 时光标闪烁。
●指令 5,光标或显示移位。 DDRAM 中内容不改变。
S / C =1 时,移动显示; S / C =0时,移动光标。
R / L =1 时,为右移; R / L =0 时,为左移。
第 13章:字符型液晶显示器
13.1.2 显示板控制器的指令系统指令功能如下,
● 指令 6,功能设置命令。
DL =01 时,内部总线为 4 位宽度 DB7 = DB4 ; DL
=0时,内部总线为 8 位宽度。
N = 0 时,单行显示; N =1 时,双行显示。
F =0 时,为显示字形 5× 7 点阵; F = 1 时,为显示字形 5× 10 点阵。
●指令 7,CGRAM 地址设置。
第 13章:字符型液晶显示器
13.1.2 显示板控制器的指令系统指令功能如下,
● 指令 8,DDRAM 地址设置。
●指令 9,读状态标志和 AC 中地址。
●指令 10,写数据。
●指令 11,读数据。
第 13章:字符型液晶显示器
13.1.3 LCD 显示板与单片机的接口和编程第 13章:字符型液晶显示器
13.1.3 LCD 显示板与单片机的接口和编程
74LS 245 作为总线驱动器。 A0 接寄存器选择 RS 。 A0,Al,A2 经 3 -8 译码器
74LS138 产生设备选择信号 E。 P2.7用做
74LS138的选通信号。该译码产生的显示板命令/状态寄存器地址为 7FF0H,数据寄存器地址为 7FFIH 。
第 13章:字符型液晶显示器
13.1.3 LCD 显示板与单片机的接口的应用程序
.#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define LCDCOM XBYTE[0x7ff0]
#define LCDDATA XBYTE[0x7ff1]
sbit bflag=ACC^7;
uchar idata s_GOOD[5]={0x47,0x4f,0x4f,0x44,0x00};
void wait(void)
{ do{ACC=LCDCOM;}while(bflag = =1); /*查询 BF标志 */
}
void init_lcd(void)
{LCDCOM=ox38; /*置功能; 2行,5× 7字符 */
wait();
LCDCMO=0x06; /*置输入模式:地址增量,显示屏不移动 */
wait();
LCDCMO=0x0f; /*显示开,显示光标,显示闪烁 */
wait();
LCDCMO=0x01; /*清显示 */
wait();
}
第 13章:字符型液晶显示器
13.1.3 LCD 显示板与单片机的接口的应用程序
void d_char(uchar a)
{LCDDATA=a;
wait();
}
void display(uchar x,uchar idata *s) /*显示字符串函数 */
{uchar i=0; /*参数显示位置和显示的字符串 */
LCDCOM=x;
While(s[i]!=0x00) /*置显示位置地址 */
{ d_char(s[i]);
i ++;
}
}
void main(void)
init_lcd();
display()2,s_GOOD;
}
第 13章:字符型液晶显示器
13.2 点阵型 LCD 显示模块本节以内藏 HD6183O 控制器的液晶模块 MGLS - 240128 为例,来说明点阵型
LCD 显示模块的应用。
第 13章:字符型液晶显示器
13.2.1 HD61830 的特点和引脚
1,HD61830 的特点
● HD61830 是点阵式液晶图像显示控制器,可与 M6800 系列相适配的 MPU 直接接口。
●具有专用指令集,可完成文本显示或图形显示的功能设置,
以及实现画面卷动、光标、闪烁和位操作等功能。
● HD6183o 可管理 64KB 显示 RAM 。其中,图形方式为
64KB ;字符方式为 4KB。
●内部字符发生器 CGROM 共有 192 种字符。其中,5 X7
字体有 160 种,5 xn 字体有 32 种。 HD61830 还可以外接字符发生器,使字符量达到 256 种。
● HD61830 可以静态方式显示,亦可以最大为 1 / 128 占空比的动态方式显示。
第 13章:字符型液晶显示器
13.2.1 HD61830 的特点和引脚
2,HD61830 的受控引脚
● D7~D0,三态数据总线。
● CS,输人片选信号,低电平有效。
● E,输人使能信号,高电平有效。
● R/W,输入读、写选择信号。
R/W = l 表示 MPU 读取 HD6183o 的信息;
R/W = 0 表示 MPU 向 HD61830 写人数据。
● RS,输人寄存器选择信号。
RS = 1 表示指令寄存器及忙标志位;
RS =0表示数据寄存器。
● RES,输人复位信号,低电平有效。
第 13章:字符型液晶显示器
13.2.1 HD61830 的特点和引脚
HD61830 的工作时序图第 13章:字符型液晶显示器
13.2.1 HD61830 的特点和引脚使能信号 E的作用第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
HD61830 的指令结构是一致的,一条指令由 1 字节的指令代码与 1 字节的指令参数组成。
第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
1.方式控制指令代码为 00H 。
向指令寄存器写人 00 后,紧接着向数据存储器写人参数,即可定义显示方式。方式控制参数格式如表 13.5所示。
表 13.5方式控制参数格式第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
DO,字符发生器选择。 0时为 CGROM ; 1 时为 EXCGROM 。
Dl,显示方式选择。 0时为文本方式; 1 时为图形方式。
D2,D3 组合实现功能
D4,工作方式选择。 0时为从方式; 1 时为主方式
D5,显示状态选择。 0时为禁止显示; 1 时为启用显示。
第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
2、字体设置指令代码为 0lH 。
该指令设置文本方式下字符的点阵大小。指令参数格式如表 13.7所示。
表 13.7字体设置指令参数格式
VP,字符点阵行数,取值范围为 1~16 。
HP:字符点阵列数,图形方式表示 1字节显示数据的有效位数,HP的取值为 6,7,8
第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
3.显示域设置指令代码为 02H。
该指令参数如表 13.8所示。
表 13.8指令参数
HN 为一行显示所占的字节数。其取值范围为 2 ~ 128 内的偶数值。
由 HN 和 HP 可得显示屏有效显示列数 N =HN× HP 。
第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
4.帧设置指令代码为 03H 。
表 13.9帧设置其中,NX 为显示时的帧扫描行数,其倒数即为占空比。
第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
5、光标位置设置指令代码为 04H 。
文本方式下光标为一行点阵显示。该指令用来指明该行点阵在字符体中的第几行,指令参数格式如表 13.10所示。
表 13.10光标位置设置指令参数格式其中,CP 表示光标在字符体中的行位置,取值范围在 1 ~ VP 之间。
6,SADL 设置指令代码为 08H 。
第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
7,SADH 设置指令代码为 09H 。
上面两条指令设置显示缓冲区起始地址。它们的指令参数分别是该地址的低位和高位字节。该地址对应着显示屏上左上角显示的位,
因而显示缓冲区单元(即 RAM 单元)与显示屏上的显示位的一一对应关系如图表所示第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
8,CACL 设置指令代码为 0AH 。
9,CACH 设置指令代码为 0BH 。
上面两条指令设置光标地址指针。它们的指令参数即是该光标地址指针的低位和高位字节。其作用一是用来指示当前要读、写显示缓冲区单元的地址;二是用在文本方式下,指出光标或闪烁字符在显示屏上的位置。
10,数据写指令代码为 0CH 。
该指令代码写人指令寄存器后,以下向数据寄存器写人的数据都将送人光标地址指针所指向单元的显示缓冲区单元。该指令功能的终止将由下一条指令的输人完成。
第 13章:字符型液晶显示器
13.2.2 HD61830 指令集
11,数据读指令代码为 0DH 。
该指令代码写人后,紧跟着一次“空读”操作后,则可以连续读出当前光标地址指针所指向单元的内容。
12,位清零指令代码为 0EH 。
13,位置 1
指令代码为 0FH 。
以上两条指令的功能是将光标地址指针所指向的显示缓冲区单元中的字节某位清零或置 1 。指令执行一次,光标地址指针自动增 1 。指令参数格式如下:
其中,NB 为清零或置 1,取值 1~8,对应该字节的 LSB ~ MSB
第 13章:字符型液晶显示器
13,2,3 与 HD61830 的液晶模块的接口和编程整个模块有 18 个外引出线可供接口使用。其引脚顺序如下表所示。
其中,GND,V0为地和十 5V 电源,V0 为负向液晶驱动电源,
对 MGLS -240128 来说,V0 的取值为一 15V 左右; 4 ~10 引脚含义见 HD61830 的引脚说明; LED +和 LED -为接背景光时的电源。
第 13章:字符型液晶显示器
13,2,3 与 HD61830 的液晶模块的接口和编程本例子采用间接方式用 8255 控制 MGLS 一 240128 模块的接口电路。 8255 的地址为 8000H 一 8003H 。
第 13章:字符型液晶显示器
13,2,3 与 HD61830 的液晶模块的接口和编程下面是显示字符串 WELCOME !的程序 welc,c 。该程序包括显示字符串函数 disstr,写指令函数 wcode 和写数据函数 wdata 。
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define PA XBYTE[0x8000]
#define PB XBYTE[0x8001]
#define PC XBYTE[0x8002]
#define COM XBYTE[0x8003]
#define DELAY 3
uchar idata welc[11]=
{0x20,0x57,0x45,0x4c,0x43,0x4f,0x4d,0x45,0x21,0x20,0x00};
/*WELCOME1*/
uchar idata sadl,sadh;
uchar idata addl,addh;
void wcode(uchar c);
void wdata(uchar d);
void disstr(uchar idata *str) ;
第 13章:字符型液晶显示器
13,2,3 与 HD61830 的液晶模块的接口和编程
void main(void)
{COM=0x81;
PB=ox00;
PB=0xf0; /* MGLS-24128模块复位 */
disstr(welc); /* 显示字符串 */
while(1);
}
void wcode(uchar c) /* 写指令代码 */
{uchar i=DELAY;
while(i)
i - - ;
PC=0x9f;
PA=c;
PC=0xdf;
PC=0x5f;
PC=0x1f;
PC=0x9f;
}
void comd(x,y) /*写指令参数 */
uchar x,y;
{ wcode(x);
wdata(y);
}
第 13章:字符型液晶显示器
13,2,3 与 HD61830 的液晶模块的接口和编程
void disstr (uchar idata *str)
{ uchar i,j;
comd(0x00,0x3c); /*方式设置,主方式显示,光标闪烁,文本方式,选用 CGROM*/
comd(0x01,0x77); /*字体设置,VP=8,HP=8,8× 8字体 */
comd(0x02,0x1d); /*显示域设置,HN=30,一行显示 30个字符 */
comd(0x03,0x7f); /*帧设置,NX=128,占空比为 1:128*/
comd(0x04,0x07); /*光标设置,CP=8,光标位于字符的最下端 */
sadl=0x00;
sadh=0x00;
comd(0x08,sadl);
comd(0x09,sadh); /*设置缓冲区起始地址 */
comd(0x08,0x00);
comd(0x0b,0x00);
wcode(0x0c);
for(j=0;j<10;j++)
wdata(0x20); /*清屏 */
addl=0x00;
addh=0x00;
comd(0x0a,addl);
comd(0x0b,addh); /*设置光标地址指针 */
i=0;
wcode(0x0c);
while(str[i]!=0x00;)
{wdata(str[i]); /*输出字符 */
i++;
}
}
第 13章:字符型液晶显示器
13,2,3 与 HD61830 的液晶模块的接口和编程例 2 用点阵型 LCD 显示模块显示中文字符串。
显示汉字( 16× 16 点阵)必须使用图形方式。在使用 HD61830
图形方式时,显示缓冲区单元与显示屏的对应关系如图第 13章:字符型液晶显示器
13,2,3 与 HD61830 的液晶模块的接口和编程上面的显示格式与人们的习惯正好相反,如想在显示屏上显示
10010110,则须向 RAM 中写人 01101001 。为适应人们的习惯,
编制的函数 inva 具有将一个字节的各位倒转的功能。 16× 16 汉字共有 32 字节。这 32 字节存放方式如下所列:
第 13章:字符型液晶显示器下面的程序 Icdhz,c 。显示从 2000H 地址开始存储的 5 个汉字
“北京欢迎您”。
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define PA XBYTE[0x8000]
#define PB XBYTE[0x8001]
#define PC XBYTE[0x8002]
#define COM XBYTE[0x8003]
#define DELAY 3
uchar code * hzp;
void comd (uchar x,uchar y);
void wcode (uchar c);
void wdata (uchar d);
uchar inva (uchar b);
第 13章:字符型液晶显示器
void main(void)
{int i;
unit sad;
for(i=0;i<1000;i++)
{}
COM=0x81;
PB=0x00;
PB=0xf0; /*MGLS-240128模块复位 */
Comd( 0x00,0x32); /*方式设置,方式显示,光标禁止,图形方式,选用 CGROM*/
Comd( 0x01,0x07); /*字体设置 1× 8字体 */
Comd( 0x02,0x1d); /*显示域设置,一行 30个字符 */
Comd( 0x08,0x00); /*显示域设置,一行 30个字符 */
Comd( 0x09,0x00); /*设置缓冲区起始地址 */
Comd( 0x0a,0x00);
Comd( 0x0b,0x00); /*设置光标地址指针 */
wcode(0x0c);
for(i=0;i<3840;i++)
wdata(0x00);/*清屏 */
sad=0;
hzp=&ZK;
while(sad<10)
{ dishz(sad);
sad+=2;
while(1);
}
第 13章:字符型液晶显示器
void wcode(uchar c)
{uchar i=DELAY;
while(i)
i--;
PC=0x9f;
PA=c;
PC=0xcf;
PC=0x4f;
PC=0x0f;
PC=0x8f;
}
第 13章:字符型液晶显示器
void (uchar x,uchar y) /*写一条指令 */
{ wcode(x);
wdata(y);
}
uchar inva(uchar b)
uchar v1=0;
uchar v2=0;
char i;
uchar j1=0x00;
uchar j2=0x01;
for (i=7;i>=1;i=i-2)
{v1=((b<<i)&j1):v1;
v2=((b<<i)&j2):v2;
j1=j1>>1;
j2=j2<<1;
}
return(v1:v2)
}
第 13章:字符型液晶显示器
void dishz(uint ghn)
{ uchar i,j,k;
uchar add1,addh;
for (i=0;i<2;i++)
{add1=chn*256;
addh=chn/256;
for (j=0;j<16;j++)
{ wcode(0x0a);
wdata(add1)
wcode(0x0b);
wdata(addh);
k=inva(*hzp);
wcode(0x0c);
wdata(k);
hzp++;
add1+=30;
if(add1<30)addh++;
}
chn++;
} }
第 13章:字符型液晶显示器
13,2,3 与 HD61830 的液晶模块的接口和编程
2000H 地址开始放置的汉字由 Intel 十六进制文件 ZK2000,HEX
得到。从微机的汉字库中提取字模数据,是当前液晶显示器应用的设计人员建立系统专用汉字库的比较简洁的方法。
第 13章:字符型液晶显示器第 13章结束