第8章LCD显示器原理应用副本#.docx

上传人:b****5 文档编号:6890940 上传时间:2023-01-12 格式:DOCX 页数:20 大小:339.91KB
下载 相关 举报
第8章LCD显示器原理应用副本#.docx_第1页
第1页 / 共20页
第8章LCD显示器原理应用副本#.docx_第2页
第2页 / 共20页
第8章LCD显示器原理应用副本#.docx_第3页
第3页 / 共20页
第8章LCD显示器原理应用副本#.docx_第4页
第4页 / 共20页
第8章LCD显示器原理应用副本#.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

第8章LCD显示器原理应用副本#.docx

《第8章LCD显示器原理应用副本#.docx》由会员分享,可在线阅读,更多相关《第8章LCD显示器原理应用副本#.docx(20页珍藏版)》请在冰豆网上搜索。

第8章LCD显示器原理应用副本#.docx

第8章LCD显示器原理应用副本#

第八章LCD显示器原理及应用

【Proteus中LCD的选择,用Optoelectronics,在后面有挺多的LCD显示器件】

8.1液晶显示器模块的原理

1.字符型液晶显示模块RT-1602C的外观与引脚

图8-1

显示容量:

16个×2排字符;工作电流2.0mA(5.0V>;字符尺寸:

2.95×4.35mm。

【能够看到的是2排,各16个字符,不是汉字】

RT-1602C采用标准的16脚接口,各引脚情况如下:

第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的内部结构

液晶显示模块RT-C1602C的内部结构可以分成三部分:

一为LCD控制器,二为LCD驱动器,三为LCD显示装置,如图所示:

图8-2

控制器采用HD44780,驱动器采用HD44100。

HD44780是字符型液晶显示控制器的代表电路。

HD44780控制器的特点:

(1>可选择5×7或5×10点字符。

【X方向为5个点,Y方向为7或10点】

(2>HD44780的显示缓冲区DDRAM、字符发生存储器

【如果用户不定义字符,则字符发生器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内部的字符发生存储器

【从这些点阵字符数据可以看出,显示时,需要用ASCII码】

这些字符有:

阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符都有一个固定的代码。

比如数字“1”的代码是00110001B<31H),又如大写的英文字母“A”的代码是01000001B<41H),【上面的数字在前,左边的数字在后】可以看出英文字母的代码与ASCII编码相同。

要显示“1”时,只需将ASCII码31H存入DDRAM指定位置,显示模块将在相应的位置把数字“1”的点阵字符图形显示出来,就可以看到数字“1”。

图8-4

3.指令格式与指令功能

LCD控制器HD44780内有多个寄存器,通过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的内容全部写入空格

光标复位,回到显示器的左上角<光标复位到地址00H位置,相当于地址计数器AC清零)。

【AC和单片机中的PC类似】

(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时,写入一个字符,整屏显示左移

(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+地址码80H,地址码为0-27H,40H-67H)】

【这个命令在编程时肯定要使用,主要用来设置在第一或第二行显示内容】

(9>读忙标志BF及光标地址AC命令格式:

【指令寄存器,忙标志读出】

RS

D7

D6

D5

D4

D3

D2

D1

D0

0

1

BF

AC

功能:

BF

BF=1,表示忙,LCM不能接收命令和数据;BF=0,表示LCM不忙,可以接收命令和数据。

AC位为地址计数器的值,范围为0~127。

【00~7FH】

例如:

(Busy_Check(>&0x80>==0x80>。

//取出最高位,判断是否忙。

【通常就是用来判断最高位是否为“1”,表示LCD忙,“0”表示不忙】

(10>写DDRAM或CGRAM命令格式:

【数据寄存器写入】

RS

D7

D6

D5

D4

D3

D2

D1

D0

1

0

DATA

功能:

将数据写入CGRAM或DDRAM中,应与CGRAM或DDRAM地址设置命令结合使用。

【命令9和命令10,肯定使用】

(11>读DDRAM或CGRAM命令格式:

【数据寄存器读出】

RS

D7

D6

D5

D4

D3

D2

D1

D0

1

1

DATA

功能:

从CGRAM或DDRAM中读出数据,应与CGRAM或DDRAM地址设置命令结合使用。

【一般不用】

液晶显示模块是一个慢显示器件,如果在执行每条指令之前,一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。

所以在写入命令或数据时,要先查询液晶显示模块是否忙。

显示字符时首先要输入显示字符地址,也就是告诉模块在什么位置显示字符,表8-2是TC1602EL液晶模块的内部显示位与DDRAM地址的对应关系。

表8-2显示位与DDRAM地址的对应关系

4.LCD显示器的初始化

LCD使用之前须对它进行初始化,初始化可通过复位完成,也可在复位后完成,初始化过程如下:

(1>清屏;

(2>功能设置;【一般有多条语句进行设置】

(3>开/关显示设置;

(4>输入方式设置。

8.2LCD显示器与单片机的接口与应用

下图是LCD显示器与8051单片机的接口连接图,图中RT-1602C的数据线与P0口相连,RS与P2.0相连,

与P2.1相连,E端与P2.2相连。

编程在LCD显示器的第一行、第一列开始显示“GOOD”,第二行、第6列开始显示“BYE”。

【第1脚:

VSS为电源地;

第2脚:

VDD为+5V电源;

第3脚:

VEE为液晶显示对比度调整端,可通过电位器调整对比度。

第4脚:

RS为数据/命令选择端

第5脚:

,读写操作选择<1-读,0-写)。

第6脚:

当E端由高电平跳变成低电平时<负跳变),液晶模块执行命令】

【例1】在LCD上显示GOODBYE245【已通过CAP8-EX1】

#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>;

}

【写入时,需要送相应的字符。

如果需要显示数字,则需要转换成字符】

【例2】向LCD1602写任意的字符串【已通过CAP8-EX2】

#include//【已通过CAP8-EX2】

#include//strlen函数的原型在string.h中

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

i++>//一行显示16个字符

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

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>。

}

【例题扩展1】用LCD1602来显示ADC0809的转换结果

#include【已经通过CAP8-LCD-0809】

#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(>

{wc

展开阅读全文
相关搜索

当前位置:首页 > 人文社科

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1