第10章 LCD显示器原理及应用.docx
- 文档编号:4685122
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:18
- 大小:200.54KB
第10章 LCD显示器原理及应用.docx
《第10章 LCD显示器原理及应用.docx》由会员分享,可在线阅读,更多相关《第10章 LCD显示器原理及应用.docx(18页珍藏版)》请在冰豆网上搜索。
第10章LCD显示器原理及应用
第10章LCD显示器原理及应用
10.1液晶显示器模块的原理
1.字符型液晶显示模块RT-1602C的外观与引脚
显示容量:
16个×2排字符;工作电流2.0mA(5.0V);字符尺寸:
2.95×4.35mm。
【能够看到的是2排,各行16个字符,不是汉字】
RT-1602C16引脚如下:
第1脚:
VSS为电源地;
第2脚:
VDD为+5V电源;【从高频的角度,应该1电源,2地】
第3脚:
VEE为液晶显示对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时,会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为数据/命令选择端,高电平时选择数据寄存器、低电平时选择命令寄存器。
[RS:
RegisterSelection]
第5脚:
,读写操作选择(1-读,0-写)。
RS
寄存器及操作
0
0
指令寄存器写入
0
1
忙信号和地址计数器读出
1
0
数据寄存器写入
1
1
数据寄存器读出
第6脚:
E端为使能端,当E端由高电平跳变成低电平时(负跳变),液晶模块执行命令。
【类似于74LS373,需要负跳变】执行一条命令或写入一个数据,都要使E有一个负跳变。
第7~14脚:
D0~D7,为8位双向数据总线,与单片机的数据总线相连,三态。
第15脚:
BLA,背光电源,通常为+5V,并联一个电位器,调节背光亮度。
第16脚:
BLK,背光电源地。
2.字符型液晶显示模块RT-1602C的内部结构
分成三部分:
一为LCD控制器,二为LCD驱动器,三为LCD显示装置。
控制器采用HD44780,驱动器采用HD44100。
HD44780是字符型液晶显示控制器的代表电路。
HD44780控制器的特点:
(1)可选择5×7或5×10点字符。
【X方向为5个点,Y方向为7或10点】
(2)HD44780的显示缓冲区DDRAM、字符发生存储器(ROM)及用户自定义的字符发生器CGRAM全部集成在芯片内。
HD44780有80个字节的显示缓冲区,分两行,地址为:
第一行为00H~27H;(0~39→40个)
第二行为40H~67H。
(64~103→40个)
显示位置的排列顺序跟LCD的型号有关,RT-1602C液晶显示模块的显示地址与实际显示位置的关系如下图所示。
(3)具有8位数据和4位数据传输两种方式,可与4/8位CPU相连。
【采用8位CPU时,应该采用8位数据传输方式,在51系列中,用8位方式】
(4)HD44780具有简单而功能较强的指令集,可实现字符移动、闪烁等显示功能。
HD44780内部的字符发生存储器(ROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符都有一个固定的代码。
比如数字“1”的代码是00110001B(31H),又如大写的英文字母“A”的代码是01000001B(41H)。
3.指令格式与指令功能
RS和
引脚上的电平决定对(命令和数据)寄存器的选择和读/写,DB7~DB0决定命令功能。
RS
寄存器及操作
0
0
指令寄存器写入
0
1
忙信号和地址计数器读出
1
0
数据寄存器写入
1
1
数据寄存器读出
E端,当E出现负跳变的时候,LCD执行命令或执行数据。
总共有11条指令,它们的格式和功能如下:
表格中红色“1”代表每一个指令的特征。
(1)清屏命令格式【指令寄存器写入,RS=0,R/W=0,指令码0X01】
RS
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
0
0
0
0
1
功能:
清除屏幕,将显示缓冲区DDRAM的内容全部写入空格(ASCII20H),也就是LCD上无显示。
光标复位,回到显示器的左上角(光标复位到地址00H位置,相当于地址计数器AC清零)。
(2)光标复位命令格式【指令寄存器写入,指令码0X10】
RS
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
0
0
0
1
×
功能:
光标返回到地址00H位置。
【数据指针清零】
(3)输入方式设置命令格式:
【指令寄存器写入】
RS
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
0
0
1
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)显示开关控制命令格式:
【指令寄存器写入】
RS
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
0
1
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)光标或显示移位置命令格式:
【指令寄存器写入】
RS
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
1
S/C
R/L
×
×
功能:
移动光标或整体显示,DDRAM中内容不变。
其中:
S/C=1时,移位显示的文字;S/C=0时,移动光标。
R/L=1时,向右移位;R/L=0时,向左移位。
(6)功能设置命令格式:
【指令寄存器写入】
RS
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
1
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地址命令格式:
【指令寄存器写入】
RS
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
1
A
A
A
A
A
A
功能:
设置CGRAM的地址,地址范围0~63。
【字符发生器RAM地址设置。
】【用户自定义的字符,如果没有自定义的字符,此命令可以不用】
(8)显示缓冲区DDRAM地址设置命令格式:
【指令寄存器写入】
RS
D7
D6
D5
D4
D3
D2
D1
D0
0
0
1
A
A
A
A
A
A
A
功能:
DDRAM地址设置,地址范围为0~127。
【不能任意取值】
【控制器内设有一个数据地址指针,用户可通过它们来访问内部的全部80字节RAM,80H+地址码(D7=1,->80H,地址码为0-27H,40H-67H)】
【强调:
这个命令在编程时肯定要使用,主要用来设置在第一或第二行显示内容】
(9)读忙标志BF及光标地址AC命令格式:
【指令寄存器,忙标志读出】
RS
D7
D6
D5
D4
D3
D2
D1
D0
0
1
BF
AC
功能:
BF(BusyFlag)位为忙标志。
BF=1,表示忙,LCM不能接收命令和数据;BF=0,表示LCM不忙,可以接收命令和数据。
AC位为地址计数器的值,范围为0~127。
【00~7FH】
例如:
(Busy_Check()&0x80)==0x80);//取出最高位,判断是否忙。
【编程时,可以用延时的方式,但最好用查询是否忙的方法,这样可以少延时一些时间】
(10)写DDRAM或CGRAM命令格式:
【数据寄存器写入】
RS
D7
D6
D5
D4
D3
D2
D1
D0
1
0
DATA
功能:
将数据写入CGRAM或DDRAM中,应与CGRAM或DDRAM地址设置命令结合使用。
(11)读DDRAM或CGRAM命令格式:
【数据寄存器读出】
RS
D7
D6
D5
D4
D3
D2
D1
D0
1
1
DATA
功能:
从CGRAM或DDRAM中读出数据,应与CGRAM或DDRAM地址设置命令结合使用。
液晶显示模块是一个慢显示器件,所以在写入命令或数据时,要先查询液晶显示模块是否忙。
4.LCD显示器的初始化
初始化过程如下:
(1)清屏;
(2)功能设置;(一般有多条语句)
(3)开/关显示设置;
(4)输入方式设置。
10.2LCD显示器与单片机的接口与应用
图中RT-1602C的数据线与P0口相连,RS与P2.0相连,
与P2.1相连,E端与P2.2相连。
编程在LCD显示器的第一行、第一列开始显示“GOOD”,第二行、第6列开始显示“BYE”。
【难点解决:
可以先复习LCD1602的引脚分布,这样有利于理解电路的连接】
【例1】在LCD上显示GOODBYE245【已通过CAP8-EX1】
【Proteus中LCD的选择,用Optoelectronics,在后面有较多的LCD显示器件】
#include
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的状态
delay
(2);
E=0;//E端出现负跳变
returnLCD_Status;
}
voidwcmd(unsignedcharcmd)//写命令函数,RS=0;RW=0
{//&0x80取出最高位D7,见命令9(读忙标志BF及光标地址AC命令格式)
while((Busy_Check()&0x80)==0x80);//写命令前,先检查设备是否忙?
RS=0;RW=0;//指令寄存器写入
E=1;//E设置为高电平
P0=cmd;//命令由P1口送入LCD
delay
(2);
E=0;//E由高电平到低电平跳变,液晶模块执行命令
}
voidwdat(unsignedchardat)//写数据函数,RS=1;RW=0
{
while((Busy_Check()&0x80)==0x80);//写数据前,先检查设备是否忙?
RS=1;RW=0;
E=1;//E由高电平到低电平跳变,液晶模块执行命令
P0=dat;//数据由P1口送入LCD
delay
(2);//延时大约2ms
E=0;
}
voidLCD_init()//初始化函数,主要写命令
{wcmd(0x38);//38H=00111000,使用8位,用5×7的字型,2行
delay(20);//改为0x3C=00111100,就用5×10字型
wcmd(0x01);//01H=00000001,清屏【命令1】
delay(20);//已经用检测是否忙,可以不用延时
wcmd(0x06);//06H=00000110,字符不动,光标自动右移一格【命令3】
delay(20);
wcmd(0x0e);//0eH=00001110,开显示,有光标,字符不闪烁【命令4】
delay(20);
}
//由于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”
wdat(‘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);
}
【强调:
写入LCD时,需要送相应的字符。
如果需要显示数字,则需要转换成字符。
数字转换成字符的方法:
数字+0x30(字符0的ASCII码)】
【例2】向LCD1602写任意的字符串【已通过CAP8-EX2】
#include
#include
voidInit_LCD();
voidShowString(unsignedchar,unsignedchar);
voidWcmd(unsignedchar);
voidWdat(unsignedchar);
voidDelay(unsignedint);
unsignedcharBusy_Check();
unsignedcharPrompt[]="1234567890abcdefghijklmnopqrstuvwxyz";
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
voidDelay(unsignedintcount)////延时函数
{
unsignedchari;
while(count--)
for(i=0;i<120;i++);
}
voidInit_LCD()//初始化LCD
{
Wcmd(0x38);//00111000,8位,2行显示,用5×7点阵字符
Delay
(1);
Wcmd(0x01);//00000001,清屏
Delay
(1);
Wcmd(0x06);//00000110,字符不动,光标自动右移一格。
命令3
Delay
(1);
Wcmd(0x0e);//00001110,开显示,有光标,字符不闪烁
Delay
(1);//0x0c=00001100,开显示,无光标,字符不闪烁
}
voidShowString(unsignedcharx,unsignedchary)
{
unsignedchari=0;
if(y==1)
{Wcmd(0x80|x);//命令8要求最高位为“1”,第一行的第x位置开始写
if(strlen(Prompt)>16)
for(i=0;i<16;i++)//一行显示16个字符
Wdat(Prompt[i]);
else
for(i=0;i Wdat(Prompt[i]); } if(y==2) { Wcmd(0xc0|x);//0x80+0x40=0xc0,从第二行的第x位置开始写 if(strlen(Prompt)>31) for(i=16;i<32;i++)//一行显示16个字符 Wdat(Prompt[i]); else for(i=16;i Wdat(Prompt[i]); } } voidWcmd(unsignedcharcmd)//写命令函数 { while((Busy_Check()&0x80)==0x80); RS=0;RW=0;//写命令,RS=0;RW=0 EN=1; P0=cmd; Delay (1); EN=0;//EN由高电平到低电平跳变,液晶模块执行命令 } voidWdat(unsignedchardat)//写数据函数 { while((Busy_Check()&0x80)==0x80); RS=1;RW=0;//写数据,RS=1;RW=0 EN=1; P0=dat; Delay (1); EN=0;//EN由高电平到低电平跳变,液晶模块执行命令 } unsignedcharBusy_Check()//检查是否忙 { unsignedcharLCD_Status; RS=0;RW=1;//读忙状态,RS=0;RW=1 EN=1; LCD_Status=P0; Delay (1); EN=0;//EN由高电平到低电平跳变,液晶模块执行命令 returnLCD_Status; } voidmain()//主函数 { Init_LCD(); ShowString(0,1);//(x,y),x开始写的列(从0~15),y=1,显示在第1行 if(strlen(Prompt)>16)ShowString(0,2);//(x,y),x开始写的列,y=2在第2行 while (1); } 【例3】用LCD1602来显示ADC0809的转换结果 【把LCD1602和ADC0809芯片结合起来使用】 #include #include sbitRS=P2^0; sbitRW=P2^1; sbitE=P2^2; sbitADDC=P1^6; sbitADDB=P1^5; sbitADDA=P1^4; unsignedcharLCD_Status; unsignedcharnum[]="0123456789"; unsignedcharmes[]="TheValueis: "; sbitOE=P1^0; sbitEOC=P1^1; sbitSTART=P1^2; sbitCLK=P1^3; voiddelay(unsignedintcount) {unsignedchari; while(count--) for(i=0;i<120;i++); } unsignedcharBusy_Check()//检查忙函数 {RS=0; RW=1; E=1; delay (2); E=0; returnLCD_Status; } voidwcmd(unsignedcharcmd) {while((Busy_Check()&0x80)==0x80); RS=0; RW=0; E=1; P0=cmd; delay (2); E=0; } voidwdat(unsignedchardat) {while((Busy_Check()&0x80)==0x80); RS=1; RW=0; E=1; P0=dat; delay (2); E=0; } voidinit() {wcmd(0x38); delay(20); wcmd(0x01); delay(20); wcmd(0x06); delay(20); wcmd(0x0e); delay(20); } voidDisplay_LCD(unsignedchard) {wcmd(0x80+0x46);//写入显示缓冲区起始地址为第2行第7列 wdat(num[d/100]); wdat(num[(d/10)%10]); wdat(num[d%10]); } voidmain() {unsignedchark,m; init(); wcmd(0x80+0x00);//写入显示缓冲区起始地址为第1行第1列 TMOD=0x02;//0x02=00000010 TH0=206;//10KHz; TL0=206;//10KHz; EA=1; ET0=1; TR0=1; ADDC=0;ADDB=1;ADDA=1; for(k=0;k wdat(mes[k]); while (1) {START=0; START=1; START=0; while(EOC==0); OE=1; m=P3;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第10章 LCD显示器原理及应用 10 LCD 显示器 原理 应用