LCD1602驱动编程(一)——LCD1602简介
(一)基本概念
1.液晶显示基本原理:
(1)线段显示
点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=FFH,……(00EH)=FFH,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这就是LCD显示的基本原理。
(2)字符显示
用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。
这样一来就组成某个字符。
但对内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
(3)汉字显示
汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码
(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。
2.LCD1602,顾名思义,能显示16*2=32个字符。
3.驱动:单片机通过GPIO口向LCD1602的引脚给指令和数据,使LCD
按照单片机的要求进行显示。
单片机也可以从LCD1602的引脚读取反馈数据到GPIO。
(二)引脚介绍
LCD1602为标准16脚接口,包括8根数据线,三根控制线(RS,RW,EN),电源VCC,电源地VSS以及液晶驱动电压引脚。
(三)LCD1602寄存器介绍
LCD1602绝大多数基于HD44780液晶芯片的,HD44780内置了DDRAM、CGROM和CGRAM,这三个都是存储器。
1.CGROM——字符产生器
CGROM:CGROM中存储了一些标准的字符的字模编码,一共192个5×7的点矩阵字型,用户不能改变其中的存储内容,只能读取调用,包含有标准的ASCII 码、日文字符和希腊文字符。
比如,大写的英文字母“A”的代码是01000001B (41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
2.CGRAM——自定义字形存储器
CGRAM是控制芯片留给用户,用以存储用户自己设计的字模编码。
3.DDRAM——显示数据,字符显示RAM缓冲区
1602的显示过程应可理解为:
①选择字模编码所在的存储器(CGROM或CGRAM)。
②将所要显示的字符编码在上述存储器中的存储地址传送给DDRAM,以找到此存储单元。
③将存储器内存储的字模编码读取到DDRAM中。
④将DDRAM中的字模编码显示到屏幕上对应位置。
4.LCD1602的RAM地址映射及标准字库表
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。
LCD内部显示地址为下图。
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标
是自动右移的,无需人工干预。
每次输入指令前都要判断液晶模块是否处于忙的状态
(四)LCD1602指令介绍
1.基本指令
RS R/W E操作
00下降沿指令寄存器写入
01高电平读忙和地址寄存器
10下降沿数据寄存器写入
11高电平读数据寄存器
2.控制指令
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:1为高电平、0为低电平)
指令1:清屏,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:输入方式设置
I/D:光标移动方向,高电平右移,低电平左移。
S:屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:显示开关控制
D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示。
C:控制光标的开与关,高电平表示有光标,低电平表示无光标。
B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或字符移位控制
S/C:高电平时移动显示的文字,低电平时移动光标。
R/L:高电平表示右移,低电平表示左移。
指令6:功能设置
DL:高电平时为4位总线,低电平时为8位总线。
N:低电平时为单行显示,高电平时双行显示。
F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址
BF:为忙标志位,高电平表示忙,LCD内部正在处理数据,不能接受MCU 送来的指令或数据,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
3.时序图
(1)写时序
图中的延时是有最小限制的,相当于1602的反应时间,所以单片机引脚高低电平跳变不能太快。
不同的单片机的主时钟频率不同,指令周期也不同。
所以产生的延时不同。
当从51移植到其他单片机时,可能出现电平跳变间隔时间缩短,导致LCD读取时序的速度跟不上单片机,导致时序混乱,不能显示。
写命令和写数据的时序,除了RS,其他完全相同不同。
(2)读时序
(五)LCD1602硬件原理图。