当前位置:首页 >> 电子/电路 >>

点阵图形液晶模块12864


液晶显示器的原理
?

字符型液晶(1602)
方法:通过向指定显示位置对应的DDRAM中写数据来显示字符。 例如:在第2行第2列显示字符 ‘a’,查表5-9 可知a对应的代码为 01100001即0x31,则可向地址0x41中写入数据0x31即可显示。

图1 1602的显示地址与DDRAM地址

点阵型液晶(12864)

在点阵型LCD上显示一幅图片或是字符,如上图所示,只需黑色的
部分点亮,空白的点置0即可。可以将LCD看成128*64个LED灯来帮助 理解。

正面图

背面图

一、12864分类
因为字符型LCD无法将汉字显示出来,所以要在显示汉字的场合 一般都要用点阵型LCD。 目前常用的点阵型LCD有122×32、128×64、240×320等。本章 重点介绍128×64点阵液晶显示屏的基本应用。 128×64点阵液晶显示屏有三种控制器,分别是KS0107

(KS0108)、T6963C和ST7920,三种控制器主要区别是:KS0107
(KS0108)不带任何字库、T6963C带ASCII码,ST7920带国标二级字 库(8千多个汉字)。 本章以不带字库的KS0107(KS0108)控制器为例进行介绍。

二、128×64点阵型LCD的引脚功能

引脚号 1 2 3 4

引脚名称 VSS VDD V0 D/I(RS)

电平 0V +5V — H/L

功能描述 电源地 正电源 液晶显示器驱动电压 D/I=“H”,表示DB0~DB7为显示数据 D/I=“L”,表示DB0~DB7为显示指令数据

三、128×64点阵型LCD的内部模块结构

内部逻辑电路图 工作原理:MG12864经数据总线接收微处理器发来的指令和数据,并存入内 部的指令和数据寄存器中,在这些控制指令的控制下,行、列驱动器对 128x64点阵的LCD显示屏进行控制,从而实现所需信息的显示。

四、128×64点阵型LCD与AT89S51单片机的接口设计
+5V

AT89S51
P0.0 P0.1 39 38

1K×8 7 8 9 10 11 12 13 14 4 5 15 16 17 6 10K 74LS00 18 3

LCD12864
DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 RS R/W CS1 CS2 RST E VEE V0 2 +5V VDD 19 BL+ BL20 9015 1K 200 GND 1

37 P0.2 36 P0.3 35 P0.4 34 P0.5 33 P0.6 32 P0.7 21 P2.0 22 P2.1 P2.2 23 24 P2.3 1 P1.0 RD 18 17 WR 28 P2.7

P12

总线方式也称直接控制方式, 即将液晶显示模块的接口作 为存储器或I/O设备直接挂 在微处理器总线上,微处理 器以控制存储器或I/O设备 的方式操作液晶显示模块的 工作。
#define LCMCS1W_COM (*((uint8 volatile xdata *) 0x0500)) #define LCMCS1W_DAT (*((uint8 volatile xdata *) 0x0400)) #defineLCMCS2W_COM (*((uint8 volatile xdata *) 0x0900)) #define LCMCS2W_DAT (*((uint8 volatile xdata *) 0x0800))

1. 总线方式

#define LCM_Wr1Command(command) LCMCS1W_COM = command /*功能:写命令子程序,所选屏为左半屏(CS1)。 入口参数:command 要写入LCM的命令字*/ #define LCM_Wr2Command(command) LCMCS2W_COM = command /*功能:写命令子程序,所选屏为右半屏(CS2)。 入口参数:command 要写入LCM的命令字*/
#define LCM_Wr1Data(wrdata) LCMCS1W_DAT = wrdata /*功能:写数据子程序,所选屏为左半屏(CS1)。 入口参数:wrdata 要写入LCM的数据*/ #define LCM_Wr2Data(wrdata) LCMCS2W_DAT = wrdata /*功能:写数据子程序,所选屏为右半屏(CS2)。 入口参数:wrdata 要写入LCM的数据*/ LCM_Wr1Command(LCM_DISPON); LCM_Wr1Command(LCM_STARTROW); LCM_Wr2Command(LCM_DISPON); LCM_Wr2Command(LCM_STARTROW); // 打开显示 // 设置显示起始行为0

+5V

AT89S51
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 39 38 37 36 35 34 33 32 21 22 23 24 25 26

1K×8 7 8 9 10 11 12 13 14 4 5 6 15 16 17 10K 18 3

LCD12864
DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 RS R/W E CS1 CS2 RST VEE V0 2 +5V VDD 19 BL+ BL20 9015 1K 200 GND 1

P26

间接控制就是微处理 器通过自身的或系统 中的并行接口与液晶 显示模块连接,微处 理器通过对这些接口 的操作,以达到液晶 显示模块的控制。

2. 间接方式

写读操作时序

void write_cmd_1(unsigned char command) //向左半屏写入命令 { cs1=1; cs2=0;

Di=0; RW=0; Lcd_Bus=command; delay(10); Enable=1; delay(10); Enable=0;

}

读操作时序

void write_data_2(unsigned char dis_data)

//向右半屏写入数据

{ cs1=0; cs2=1; Di=1; RW=0; Lcd_Bus=dis_data; delay(0); Enable=1; delay(0); Enable=0;

}

五、MG12864液晶显示模块的寄存器
(1) I/O缓冲器:液晶显示模块的愉人、输出缓冲器由片选信号控制。如果 CS1或CS2无效,那么输人输出的数据或指令不会被执行,因此内部状态也不 会改变,但是不管CS1或CS2是否处在有效状态,复位操作都可以执行。 (2)输入寄存器:输入寄存器提供了与外部交换信息的输入接口,它可以方 便地与多种型号的微处理器或计算机接口卡相连接。CS1或CS2有效时,由R/W 和RS选择输入寄存器,从外部处理器送来的数据被写进输入寄存器,并且将 它写进数据显示RAM。在E信号的下降沿将输人数据锁存,并且在内部操作时 序下自动写人显示RAM。 (3)输出寄存器:当CS1或CS2有效而且R/W和RS均为高电平时,控制器将显 示RAM的内容送到输出寄存器,即存储在显示RAM中的数据被锁存到输出寄存 器。当CS1或CS2有效,而R/W=H,RS=L时,状态数据可以被读出。

为了读取显示RAM中的内容,两步读指令是必须的。第一步,首先将显 示RAM里的数据锁存至愉出寄存器,第二步,外部处理器从输出寄存器读出 已锁存的显示RAM内容。也就是说,要读取显示RAM的内容,必须辅助读取, 但是状态读取不需要辅助读取。下表给出了RS和R/W选择输入寄存器或输出 寄奇器以及所执行操作的具体功能的组合控制方式。 RS 0 R/W 0 1 0 功能 写指令 读状态字 写数据(从输入寄存器到数据显示RAM)

1

1

读数据(从数据显示RAM到输出寄存器)

(4)复位状态:当RST为低电平时,液晶显示模块执行以下操作:关闭显示 器,显示器初始行寄存器置0。此时只有状态读取被允许,状态复位标志出现 在DB4信号线上,当DB4处于低电平时,液晶显示模块不接收任何指令。

(5)状态标志:当控制器KS0108B正在执行内部操作或没有工作时,控制器 “忙”状态标志会出现在DB7信号线上。

(6)显示状态的开、关控制:液晶显示模块带有一个控制LCD是否显示的触 发器。当该触发器复位时,各列驱动会不受控制的全部输出,以至于不能显 示所需信息,即LCD处于关状态;当该触发器置位时,各列驱动根据显示RAM 的内容控制驱动输出,从而显示所需信息,即LCD处于开状态。显示状态的 开、关控制可以由外部控制指令改变,当前显示状态会出现在DB5信号线上, 当DB5处于低电平时,即表示LCD处于开状态。
(7)显示数据RAM:液晶显示模块带有1024字节的显示RAM,它储存着液晶 显示器的显示数据。RAM单元的每一位对应于显示屏上的某一个点,如某位 为“1",则与该位对应的LCD液晶屏上的那一点为亮。控制器KS0108B的显示 RAM是按字节寻址的,因此为了使LCD显示屏的定位与KS0108B的寻址相统一, 我们将整个显示屏划分为左右两个半屏,这样每半屏是64 X 64个像素点, 我们再把横向上的64个像素点编为0列~63列,把纵向上的64个像素点分成8 页,每页8行,这样每列的某一页的8行像索就对应了一个显示RAM单元,设 置每个显示RAM单元的数据就可以控制整个显示屏的显示信息。

12864的DDRAM地址 为方便地管理显示RAM,液晶显示模块设置X地址寄存器和Y地址计数器, X地址寄存器的内容指向内部显示RAM的页地址,它没有计数功能,地址的设 定由外部指令控制;Y地址计数器的内容用于确定内部显示RAM的列地址,地 址由指令控制,并且当显示数据被读写操作时地址自动加1。 另外它还设置有显示起始行寄存器。用于确定液晶显示屏的起始显示行 位置。显示起始行外部设置指令中的DB0~DB5确定了显示起始行寄存器的内 容。循环改变显示起始行寄存器的内容可以用来实现液晶显示器的滚屏操作。

六、MG12864液晶显示模块的显示控制指令
1、显示开/关设置 CODE:R/W D/I L L L DB7 DB6 DB5 L H DB4 H DB3 H DB2 H H DB1 DB0 H/L

功能:设置屏幕显示开/关。 DB0=H,开显示;DB0=L,关显示。 不影响显示RAM(DD RAM)中的内容。 2、设置显示起始行 CODE:R/W D/I DB7 L L H

DB6 H

DB5

DB4

DB3

DB2

DB1

DB0

行地址(0~63)

功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行 是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器, 起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能, 用于显示行扫描同步,当扫描完一行后自动加一。

3、设置页地址
CODE:R/W D/I L L DB7 H DB6 L H DB5 H B4 H DB3 DB2 DB1 DB0

页地址(0~7)

功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。 页地址就是DDRAM 的行地址,页地址存储在X地址计数器中,A2-A0可表 示8页,读写数据对页地址没有影响,除本指令可改变页地址外,复位信 号(RST)可把页地址计数器内容清零。 4、设置列地址 CODE:R/W D/I L L DB7 L H DB6 DB5 DB4 DB3 DB2 DB1 DB0 列地址(0~63)

功能: DDRAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响, 在对DDRAM进行读写操作后,Y地址自动加一。

5、状态检测 CODE:R/W D/I H L DB7 BF DB6 L DB5 ON/OF DB4 RST DB3 DB2 L L DB1 L DB0 L

功能:读忙信号标志位(BF)、复位标志位(RST)以及显示状态(ON/OFF)。 BF=H:内部正在执行操作; BF=L:空闲状态。 RST=H:正处于复位初始化状态; RST=L:正常状态。

ON/OFF=H:表示显示关闭;
6、写显示数据 CODE: R/W L D/I H DB7 D7 DB6 D6 DB5 D5

ON/OFF=L:表示显示开。

DB4 D4

DB3 D3

DB2 D2

DB1 D1

DB0 D0

功能:写数据到DDRAM,DDRAM是存储图形显示数据的,写指令执行后Y地 址计数器自动加1。D7-D0位数据为1表示显示,数据为0表示不显示。写数 据到DDRAM前,要先执行“设置页地址”及“设置列地址”命令。

7、读显示数据
CODE:R/W D/I H H DB7 D7 DB6 D6 DB5 D5 DB4 D4 DB3 D3 DB2 D2 DB1 D1 DB0 D0

功能:从DDRAM读数据,读指令执行后Y地址计数器自动加1。从DDRAM读 数据前要先执行“设置页地址” 及“设置列地址”命令。

七、图片在12864上的显示
? ? ?

简单来说,主要分为两步: 1)将一幅图片转化为一系列二进制数据 2)将数据按字节(8位)写入液晶对应的DDRAM

由12864的DDRAM地址可知,12864的DDRAM有128*8=1024 个地址,只需将图片转化的数据按字节写入这其对应的 DDRAM地址即可。

八、字符在12864上的显示

上图中,汉字为16*16点阵,ASCII码为8*16点阵,同图片 一样,一个汉字(ASCII)由16*2(8*2)个字节数据组成, 字符显示原理与图片一致,只需将字符代码写入相应 DDRAM地址。字体大小可以根据需要改变。

小结
?

简而言之,无论是字符型还是点阵型LCD,其基本原理都 是通过将数据写入所对应的DDRAM地址中来显示所需要的 图形或是字符。 12864点阵型液晶对应的DDRAM有1024个地址,当需显示的 字符或图片已转为二进制数据时,确定将数据写入对应的 DDRAM地址就是你所要做的工作!

?

12864的应用
一、单片机与液晶显示器的硬件连接
液晶显示器(12864)主要包含了以下接口:
?
? ?

1)使能E(51的RD和WR经或非门接LCD的使能E)
2)片选CS1(左半屏)、CS2(右半屏 3)命令/数据选择RS(0——命令,1——数据)

?
? ?

4)读/写选择R/W(0——写,1——读)
5)数据总线DB0~DB7 6)负压产生和负压输入(对比度)调整

?
?

7)复位RST
8)电源与地和背景光电源

AT89C51与12864的硬件连接

二、软件编程
注意:程序的编写与硬件是分不开的。以上图为例,A11~A8对应CS2、 CS1、R/W、RS,未用的地址线为高。则当向12864的左半屏 (CS1=1,CS2=0)写(R/W=0)数据(RS=1)时,总线地址为 0x1111010111111111。即0xF5FF。 C文件中定义如下:#define WD1 XBYTE[0xF5FF] 定义了总线地址后,对外部地址的操作变得非常简单。

如向左半屏写数据0xFF: WD1=0xFF
注:ABSACC.H 提供了下列方便的宏(Macro)定义。

#define XBYTE ((unsigned char volatile xdata *) 0)
定义 XBYTE 为 指向 xdata 地址空间unsigned char 数据类型的指针, 指针值为0,这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部 RAM了。

程序编写的流程
1)定义所有总线地址
#define LCMCS1W_COM XBYTE[0xF4FF] //向左半屏写命令 #define LCMCS1W_DAT XBYTE[0xF5FF] //向左半屏写数据 #define LCMCS2W_COM XBYTE[0xF8FF] //向右半屏写命令 #define LCMCS2W_DAT XBYTE[0xF9FF] //向右半屏写数据

程序编写的流程
2)编写底层程序(写命令、写数据)
#define LCM_Wr1Command(command) LCMCS1W_COM = command /*功能:写命令子程序,所选屏为左半屏(CS1)。 入口参数:command 要写入LCM的命令字*/

#define LCM_Wr2Command(command) LCMCS2W_COM = command /*功能:写命令子程序,所选屏为右半屏(CS2)。 入口参数:command 要写入LCM的命令字*/ #define LCM_Wr1Data(wrdata) LCMCS1W_DAT = wrdata /*功能:写数据子程序,所选屏为左半屏(CS1)。 入口参数:wrdata 要写入LCM的数据*/
#define LCM_Wr2Data(wrdata) LCMCS2W_DAT = wrdata /*功能:写数据子程序,所选屏为右半屏(CS2)。 入口参数:wrdata 要写入LCM的数据*/

3)LCD初始化
包含开显示(0x3F),起始行(0xC0),设置起始页地址(0xB8)和Y 地址(0x40),即分别向LCD的左右半屏写命令。

初始化程序
void LCM_DispIni(void)
{ uint16 i; LCM_RST = 0; // 复位驱动芯片

for(i=0; i<500; i++);
LCM_RST = 1; LCM_Wr1Command(LCM_DISPON); LCM_Wr1Command(LCM_STARTROW); LCM_Wr2Command(LCM_DISPON); LCM_Wr2Command(LCM_STARTROW); LCM_DispClr(); // 清屏 // 设置页(行)地址 // 设置列地址,即列 LCM_Wr1Command(LCM_ADDRSTRY+0); LCM_Wr1Command(LCM_ADDRSTRX+0); LCM_Wr2Command(LCM_ADDRSTRY+0); // 打开显示 // 设置显示起始行为0

LCM_Wr2Command(LCM_ADDRSTRX+0);

}

4)清屏(向DDRAM所有地址写0)
显示一幅新图片前必须清屏,否则之前显示的数据仍存在于液晶上。
void LCM_DispFill(uint8 filldata) { uint8 x, y; LCM_Wr1Command(LCM_STARTROW); // 设置显示起始行为0 LCM_Wr2Command(LCM_STARTROW); for(y=0; y<8; y++) { LCM_Wr1Command(LCM_ADDRSTRY+y); // 设置页(行)地址 LCM_Wr1Command(LCM_ADDRSTRX); // 设置列地址 LCM_Wr2Command(LCM_ADDRSTRY+y); LCM_Wr2Command(LCM_ADDRSTRX); for(x=0; x<64; x++) { LCM_Wr1Data(filldata); LCM_Wr2Data(filldata); } } }

5)指定位置显示一个ASCII码


16

首先将起始页地址和起始Y地址 设置好,写入ASCII码的上半部 分(8个字节数据) 重新设置起始页地址和起始Y地 址,写入ASCII码的下半部分 (另8个字节数据)

1 16

2

3

4

5

6

7

8



9 10 11 12 13 14 15 16

注意:在对DDRAM进行读写操作后,Y地址指针自动加1, 指向下一个DDRAM 单元。

6)指定位置显示汉字
同显示ASCII码基本相似,只是上下部分分别有16个字 节数据需要写入DDRAM。

7)显示一张图片
对于图片,必然从第0页第0列开始,可以一页一页(不 分左右屏)显示,也可以先写左半屏后写右半屏。所谓的两 种方法差别正在设置的起始页地址和Y地址的不同。

小结
?

12864点阵型液晶对应的DDRAM有1024个地址,无论是显示 字符还是图片,灵活设置起始页地址和Y地址,可以达到 想要的结果。 C语言中用到总线操作必须添加头文件“absacc.h”,另如 使用仿真器,需在debug中的setting里选择使用xbus(数 据总线)。 可使用取字模软件将字符或图片转为一系列二进制数据。

?

?

总结
? ? ? ?

理解12864是如何显示字符和图形的
知晓单片机与12864的硬件连接 根据硬件接线,确定所有的总线地址 明白如何通过总线操作对12864进行数据与命令的 交换

? ?

参考12864的命令字进行软件编程
学会如何使用取字模软件

带字库12864
带字库的12864的基本特性: (1)显示分辨率:128×64点 (就是64行,每行128个点) (2)内置汉字字库,提供8192个16×16点阵汉字(12864内部 有一个CGROM,内容掉电可以存储,所以汉字字库会 存放在里面。满屏最多显示4*8=32个汉字)。 (3)内置 128个16×8点阵ASCII字符(12864一次最多可以显 示4*16=64个ASCII字符)。 (4)通讯方式:串行、并口可选 (数据写入和读出可以是 以串行的方式,也可以是以并行的方式。)
?

LCD初始化:

所以只要我们写入指令0x01,整个屏幕就被清空了。

一般用指令0x0c,开显示,关闭光标

既可以控制扩展功能,又可以控制绘图显示的指令!用0X30,基本指令集

指令0X06光标右移

1.汉字显示坐标

显示汉字一屏可以显示 4*8=32个16*16的汉字。实 物图对照下,把地址也表 到实物图上去了。

操作的具体流程: A进入基本指令模式(指令16,指令为0x30) B写入xy地址(地址需要查上表,用指令8,也就是写入DDRAM)

C写入欲写入的汉字的编码(一般定义一个数组,直接把汉字存放在里面即可, 存储的时候它就是以编码的形式。例如:uchar code dis1[]=“南京师范大学";) 例程代码: uchar code dis3[] = {“南京师范大学"}; void display_hz() { Uchar I; Write_comd(0x30);//基本指令 Write_comd(0x80);//写在第一个位置上 For(i=0;i<8;i++) { Write_da(dis3[i]);//把数据送到端口 Delay_ms(5);//延时一会 } }

2.ASCII显示坐标: 它的坐标和汉字的坐标是一样的,只不过一个汉字的位置可以放两个 ASCII码字符。因为前者为16*16后者为16*8,这样一行可以显示16 个ASCII码了。在显示一串字符穿的时候,给一个起始地址,屏幕就 会依次显示出来(自动加一功能)。 操作的具体流程: A进入基本指令模式(指令16,指令为0x30) B写入xy地址(地址需要查上表,用指令8,也就是写入DDRAM) C写入欲写入的汉字的编码(一般定义一个数组,直接把ASACII码存放 在里面即可,存储的时候它就是以编码的形式。例如:uchar code dis1[]="SH";)

例程代码: uchar code dis2[] = {"SH"}; void display_ascii() { Uchar I; Write_comd(0x30);//基本指令 Write_comd(0x80);//写在第一个位置上 For(i=0;i<2;i++) { Write_da(dis2[i]);//把数据送到端口 Delay_ms(5);//延时一会 } }

时序图:
并行写资料到模块:

写指令: void write_cmd(uchar cmd) { lcdrs = 0;//低电平表命令 lcdrw = 0;// 低电平表写 P0 = cmd;//把命令送给P0
lcden = 0;//产生一个高脉冲 delay_ms(5); lcden = 1; delay_ms(5);//不用的时候把en拉低,12864不使能 lcden = 0; } (2)写数据: void write_dat(uchar dat) { lcdrs = 1;//高电平表示数据 lcdrw = 0;//低电平表示写 P0 = dat;//把数据送到端口 lcden = 0;//产生一个高脉冲 delay_ms(5); lcden = 1; delay_ms(5); lcden = 0; //不用时不使能 }

根据这个时序图可以从12864液晶模块内部RAM中读出相应的数据,忙检测函数就是根据这 个时序图写出来的。

带中文字库的128X64显示模块时应注意以下几点: ①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先 设定显示地址,再写入中文字符编码。 ②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字 符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字 符位置,否则,显示的字符中将会有一个空ASCII字符位置。 ③当字符编码为2字节时,应先写入高位字节,再写入低位字节。 ④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态, 即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个 指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一 段较长的时间,即等待前一个指令确定执行完成。指令执行的时间 请参考指令表中的指令执行时间说明。 ⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE” 后,以后的指令集将维持在最后的状态,除非再次变更“RE”位, 否则使用相同指令集时,无需每次均重设“RE”位。


赞助商链接
相关文章:
更多相关标签: