第8章LCD显示器原理应用副本#Word下载.docx
- 文档编号:19912437
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:20
- 大小:339.91KB
第8章LCD显示器原理应用副本#Word下载.docx
《第8章LCD显示器原理应用副本#Word下载.docx》由会员分享,可在线阅读,更多相关《第8章LCD显示器原理应用副本#Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
液晶显示模块RT-C1602C的内部结构可以分成三部分:
一为LCD控制器,二为LCD驱动器,三为LCD显示装置,如图所示:
图8-2
控制器采用HD44780,驱动器采用HD44100。
HD44780是字符型液晶显示控制器的代表电路。
HD44780控制器的特点:
(1>
可选择5×
7或5×
10点字符。
【X方向为5个点,Y方向为7或10点】
(2>
HD44780的显示缓冲区DDRAM、字符发生存储器<
ROM)
【具体的内容如图8-4】及用户自定义的字符发生器CGRAM全部集成在芯片内。
【如果用户不定义字符,则字符发生器CGRAM可以不管】
HD44780有80个字节的显示缓冲区,分两行,地址为:
第一行为00H~27H;
<
0~39→40个)
第二行为40H~67H。
64~103→40个)
显示位置的排列顺序跟LCD的型号有关,RT-1602C液晶显示模块的显示地址与实际显示位置的关系如下图所示。
【注意:
理解“00”和“40”】
图8-3
【27H=2×
16+7=39
40H=4×
16=64
67H=6×
16+7=96+7=103
103-64=39】
(4>
HD44780具有8位数据和4位数据传输两种方式,可与4/8位CPU相连。
【采用8位CPU时,应该采用8位数据传输方式,在51系列中,用8位方式】
(5>
HD44780具有简单而功能较强的指令集,可实现字符移动、闪烁等显示功能。
HD44780内部的字符发生存储器<
ROM)已经存储了160个不同的点阵字符图形,如图8-4所示:
【从这些点阵字符数据可以看出,显示时,需要用ASCII码】
这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符都有一个固定的代码。
比如数字“1”的代码是00110001B<
31H),又如大写的英文字母“A”的代码是01000001B<
41H),【上面的数字在前,左边的数字在后】可以看出英文字母的代码与ASCII编码相同。
要显示“1”时,只需将ASCII码31H存入DDRAM指定位置,显示模块将在相应的位置把数字“1”的点阵字符图形显示出来,就可以看到数字“1”。
图8-4
3.指令格式与指令功能
LCD控制器HD44780内有多个寄存器,通过RS和
引脚上的电平决定对<
命令和数据)寄存器的选择和读/写,DB7~DB0决定命令功能。
选择情况如表:
E端,当E出现负跳变的时候,LCD执行命令或执行数据。
总共有11条指令,它们的格式和功能如下:
【表格中红色“1”代表每一个指令的特征】
(1>
清屏命令格式【指令寄存器写入,RS=0,R/W=0,指令码0X01】
D7
D6
D5
D4
D3
D2
D1
D0
功能:
清除屏幕显示,将显示缓冲区DDRAM的内容全部写入空格<
ASCII20H),也就是LCD上无显示。
光标复位,回到显示器的左上角<
光标复位到地址00H位置,相当于地址计数器AC清零)。
【AC和单片机中的PC类似】
(2>
光标复位命令格式【指令寄存器写入,指令码0X10】
×
光标返回到地址00H位置。
【数据指针清零】
(3>
输入方式设置命令格式:
【指令寄存器写入】
I/D
S
设定光标的移动方向,并指定整体显示是否移动。
其中:
I/D光标移动方向:
当I/D=1,光标从左向右移动;
当读或写一个字符后,地址指针加1,且光标加1向右移动一个字符位置。
【一般采用从左到右】
当I/D=0,光标从右向左移动;
当读或写一个字符后,地址指针减1,且光标减1向左移动一个字符位置。
【外国习惯】
S屏幕上所有文字是否左移或者右移:
当S=1时,写入一个字符,整屏显示左移<
I/D=1)或右移<
I/D=0),以得到光标不移动而屏幕移动的效果;
当S=0时,写入一个字符,整屏显示不移动。
(4>
显示开关控制命令格式:
D
C
B
显示控制开关。
D位控制整体显示的开与关,D=1,开显示;
D=0,关显示。
C位控制光标的开与关,C=1,有光标;
C=0,无光标。
B位控制光标字符闪烁,B=1,字符闪烁;
B=0,字符不闪烁。
例如:
RS=0,RW=0,显示开关控制字OCH=00001100
表示:
D=1开显示,C=0无光标,B=0字符不闪
RS=0,RW=0,显示开关控制字OEH=00001110
D=1开显示,C=1有光标,B=0字符不闪
(5>
光标或显示移位置命令格式:
S/C
R/L
移动光标或整体显示,DDRAM中内容不变。
S/C=1时,移位显示的文字;
S/C=0时,移动光标。
R/L=1时,向右移位;
R/L=0时,向左移位。
(6>
功能设置命令格式:
DL
N
F
DL位设置接口数据位数,DL=1为8位数据接口;
DL=0为4位数据接口。
【MCS-51为8位,所以应该用8位方式“1”】
【和教材上的不一样】
N位设置显示行数,N=0,单行显示;
N=1双行显示。
F位设置字型大小,F=1时为5×
10点阵字符,F=0时为5×
7点阵字符。
功能设置命令38H=00111000
设置8位数据接口,16×
2<
2行显示,N=1),F=0,5×
7点阵字符
(7>
设置字库CGRAM地址命令格式:
A
功能:
设置CGRAM的地址,地址范围0~63。
【字符发生器RAM地址设置。
】【用户自定义的字符,如果没有自定义的字符,此命令可以不用】
(8>
显示缓冲区DDRAM地址设置命令格式:
DDRAM地址设置,地址范围为0~127。
【不能任意取值】
【控制器内设有一个数据地址指针,用户可通过它们来访问内部的全部80字节RAM,80H+地址码<
D7=1,->
80H,地址码为0-27H,40H-67H)】
【这个命令在编程时肯定要使用,主要用来设置在第一或第二行显示内容】
(9>
读忙标志BF及光标地址AC命令格式:
【指令寄存器,忙标志读出】
BF
AC
BF<
BusyFlag)位为忙标志。
BF=1,表示忙,LCM不能接收命令和数据;
BF=0,表示LCM不忙,可以接收命令和数据。
AC位为地址计数器的值,范围为0~127。
【00~7FH】
(Busy_Check(>
&
0x80>
==0x80>
。
//取出最高位,判断是否忙。
【通常就是用来判断最高位是否为“1”,表示LCD忙,“0”表示不忙】
(10>
写DDRAM或CGRAM命令格式:
【数据寄存器写入】
DATA
将数据写入CGRAM或DDRAM中,应与CGRAM或DDRAM地址设置命令结合使用。
【命令9和命令10,肯定使用】
(11>
读DDRAM或CGRAM命令格式:
【数据寄存器读出】
从CGRAM或DDRAM中读出数据,应与CGRAM或DDRAM地址设置命令结合使用。
【一般不用】
液晶显示模块是一个慢显示器件,如果在执行每条指令之前,一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
所以在写入命令或数据时,要先查询液晶显示模块是否忙。
显示字符时首先要输入显示字符地址,也就是告诉模块在什么位置显示字符,表8-2是TC1602EL液晶模块的内部显示位与DDRAM地址的对应关系。
表8-2显示位与DDRAM地址的对应关系
4.LCD显示器的初始化
LCD使用之前须对它进行初始化,初始化可通过复位完成,也可在复位后完成,初始化过程如下:
清屏;
功能设置;
【一般有多条语句进行设置】
(3>
开/关显示设置;
输入方式设置。
8.2LCD显示器与单片机的接口与应用
下图是LCD显示器与8051单片机的接口连接图,图中RT-1602C的数据线与P0口相连,RS与P2.0相连,
与P2.1相连,E端与P2.2相连。
编程在LCD显示器的第一行、第一列开始显示“GOOD”,第二行、第6列开始显示“BYE”。
【第1脚:
VEE为液晶显示对比度调整端,可通过电位器调整对比度。
RS为数据/命令选择端
当E端由高电平跳变成低电平时<
负跳变),液晶模块执行命令】
【例1】在LCD上显示GOODBYE245【已通过CAP8-EX1】
#include<
reg51.h>
sbitRS=P2^0。
sbitRW=P2^1。
sbitE=P2^2。
unsignedcharLCD_Status。
unsignedcharnum[]="
0123456789"
voiddelay(unsignedintcount>
{unsignedchari。
while(count-->
for(i=0。
i<
120。
i++>
}
unsignedcharBusy_Check(>
//检查忙函数
{RS=0。
RW=1。
//RS=0,控制寄存器,RW=1,读
E=1。
delay(2>
LCD_Status=P0。
//读出LCD的状态
E=0。
//E端出现负跳变
returnLCD_Status。
voidwcmd(unsignedcharcmd>
//写命令函数,RS=0;
RW=0
{//&
0x80取出最高位D7,见命令9<
读忙标志BF及光标地址AC命令格式)
while((Busy_Check(>
//写命令前,先检查设备是否忙?
RS=0;
RW=0;
//指令寄存器写入
E=1;
//E设置为高电平
P0=cmd;
//命令由P1口送入LCD
delay(2>
E=0;
//E由高电平到低电平跳变,液晶模块执行命令
voidwdat(unsignedchardat>
//写数据函数,RS=1;
{
//写数据前,先检查设备是否忙?
RS=1;
//E由高电平到低电平跳变,液晶模块执行命令
P0=dat;
//数据由P1口送入LCD
delay(2>
//延时大约2ms
voidLCD_init(>
//初始化函数,主要写命令
{wcmd(0x38>
//38H=00111000,使用8位,用5×
7的字型,2行
delay(20>
//改为0x3C=00111100,就用5×
10字型
wcmd(0x01>
//01H=00000001,清屏【命令1】
//已经用检测是否忙,可以不用延时
wcmd(0x06>
//06H=00000110,字符不动,光标自动右移一格【命令3】
wcmd(0x0e>
//0eH=00001110,开显示,有光标,字符不闪烁【命令4】
}
//因为LCD是一慢速显示器件,所以在执行每条指令之前一定要确认LCD
//的忙标志为0,即非忙状态,否则该命令将失效。
voidmain(>
//主函数
{unsignedcharx=245。
LCD_init(>
//0x80,见命令8<
显示缓冲区DDRAM地址设置命令格式)
wcmd(0x80+00>
//写入显示缓冲区起始地址为第1行第1列
wdat(‘G’>
//第1行第1列显示字母“G”
wdat(‘O’>
//第1行第2列显示字母“O”
//第1行第3列显示字母“O”
wdat(‘D’>
//第1行第4列显示字母“D”
//【80H+45H=C5H】
wcmd(0x80+0x45>
//写入显示缓冲区起始地址为第2行第6列
wdat(‘B’>
//第2行第6列显示字母“B”
wdat(‘Y’>
//第2行第7列显示字母“Y”
wdat(‘E’>
//第2行第8列显示字母“E”
wdat(x/100+0x30>
//加0x30,把数字变为字符型,//最高位
wdat((x/10>
%10+0x30>
wdat(x%10+0x30>
//最低位
/*wdat(num[x/100]>
//最高位,也可以用字符数组来变换
wdat(num[(x/10>
%10]>
wdat(num[x%10]>
//最低位*/
while(1>
【写入时,需要送相应的字符。
如果需要显示数字,则需要转换成字符】
【例2】向LCD1602写任意的字符串【已通过CAP8-EX2】
//【已通过CAP8-EX2】
string.h>
//strlen函数的原型在string.h中
voidInit_LCD(>
voidShowString(unsignedchar,unsignedchar>
voidWcmd(unsignedchar>
voidWdat(unsignedchar>
voidDelay(unsignedint>
unsignedcharPrompt[]="
1234567890abcdefghijklmnopqrstuvwxyz"
sbitRS=P2^0。
sbitRW=P2^1。
sbitEN=P2^2。
voidDelay(unsignedintcount>
////延时函数
unsignedchari。
i<
i++>
//初始化LCD
Wcmd(0x38>
//00111000,8位,2行显示,用5×
Delay(1>
Wcmd(0x01>
//00000001,清屏
Wcmd(0x06>
//00000110,字符不动,光标自动右移一格。
命令3
Wcmd(0x0e>
//00001110,开显示,有光标,字符不闪烁
//0x0c=00001100,开显示,无光标,字符不闪烁
voidShowString(unsignedcharx,unsignedchary>
unsignedchari=0。
if(y==1>
{Wcmd(0x80|x>
//命令8要求最高位为“1”,第一行的第x位置开始写
if(strlen(Prompt>
>
16>
16。
//一行显示16个字符
Wdat(Prompt[i]>
else
strlen(Prompt>
if(y==2>
{
Wcmd(0xc0|x>
//0x80+0x40=0xc0,从第二行的第x位置开始写
if(strlen(Prompt>
31>
for(i=16。
32。
for(i=16。
voidWcmd(unsignedcharcmd>
//写命令函数
while((Busy_Check(>
&
0x80>
==0x80>
RS=0。
RW=0。
//写命令,RS=0;
EN=1。
P0=cmd。
Delay(1>
EN=0。
//EN由高电平到低电平跳变,液晶模块执行命令
voidWdat(unsignedchardat>
//写数据函数
RS=1。
//写数据,RS=1;
P0=dat。
//EN由高电平到低电平跳变,液晶模块执行命令
//检查是否忙
unsignedcharLCD_Status。
RS=0。
//读忙状态,RS=0;
RW=1
voidmain(>
//主函数
Init_LCD(>
ShowString(0,1>
//(x,y>
x开始写的列(从0~15>
,y=1,显示在第1行
ShowString(0,2>
x开始写的列,y=2在第2行
while(1>
【例题扩展1】用LCD1602来显示ADC0809的转换结果
【已经通过CAP8-LCD-0809】
sbitADDC=P1^6。
sbitADDB=P1^5。
sbitADDA=P1^4。
unsignedcharmes[]="
TheValueis:
"
sbitOE=P1^0。
sbitEOC=P1^1。
sbitSTART=P1^2。
sbitCLK=P1^3。
{unsignedchari。
{RS=0。
RW=1。
E=1。
E=0。
{while((Busy_Check(>
==0x80>
RS=0。
RW=0。
P0=cmd。
RS=1。
P0=dat。
voidinit(>
{wc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD 显示器 原理 应用 副本