澳门新濠天地讲堂

51单片机分析进修系统之1602字符型液晶显示篇

51单片机分析进修系统之1602字符型液晶显示篇 《电子制造》2008年1月 站长原创,如需引用请说明出处

 

    在日常糊口生计中,咱们对液晶显示器并不目生。液晶显示模块已作为良多电子产物的经由器件,如在算计器、万用表、电子表及良多家用电子产物中都能够看到,显示的主如果数字、公用符号和图形。在单片机的人机交换界面中,一般的输出编制有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比力常用,软硬件都比力简单,在后面章节曾经引见过,在此不作引见,本章重点引见字符型液晶显示器的使用。

    在单片机系统中使用晶液显示器作为输出器件有以下几个长处:

显示质量高

    由于液晶显示器每一个点在收到信号后就不断保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不竭刷新新亮点。因而,液晶显示器画质高且不会明灭。

数字式接口

    液晶显示器都是数字式的,和单片机系统的接口愈加简单靠得住,操作愈加便当。

体积小、分量轻

    液晶显示器经由显示屏上的电极节制液晶分子情况来达到显示的方针,在分量上比不异显示面积的保守显示器要轻得多。

功耗低

    相对而言,液晶显示器的功耗次要耗损在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

10.8.1 液晶显示简介

①液晶显示道理

    液晶显示的道理是把持液晶的物理特征, 经由电压对其显示区域进行节制,有电就有显示,多么即能够显示出图形。液晶显示器具有厚度薄、合用于大规模集成电路间接驱动、易于完成全彩色显示的特点,今朝曾经被遍及使用在便携式电脑、数字摄像机、PDA挪动通信对象等浩繁范畴。

②液晶显示器的分类

    液晶显示的分类方式有良多种,凡是可按其显示编制分为段式、字符式、点阵式等。除了吵嘴显示外,液晶显示器又一次有多灰度有彩色显示等。若是按照驱动编制来分,能够分为静态驱动(Static)、纯真矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。

③液晶显示器各类图形的显示道理:

线段的显示

    点阵图形式液晶由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)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线构成的虚线。这便是LCD显示的基来历根底理。

字符的显示

    用LCD显示一个字符时比力复杂,由于一个字符由6×8或8×8点阵构成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,又一次要使每字节的不合位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。多么一来就构成某个字符。但由于内带字符发生器的节制器来说,显示字符就比力简单了,能够让节制器工作在文本编制,按照在LCD上起头显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此奉上该字符对应的代码即可。

汉字的显示

    汉字的显示一般采用图形的编制,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分摆布两半,各占16B,右边为1、3、5……右边为2、4、6……按照在LCD上起头显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,奉上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就能够LCD上获得一个完整汉字。

10.8.2 1602字符型LCD简介

    字符型液晶显示模块是一种特地用于显示字母、数字、符号等点阵式LCD,今朝常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,引见其用法。一般1602字符型液晶显示器实物如图10-53:

 

 

图10-53 1602字符型液晶显示器实物图

 

10.8.2.1 1602LCD的根底参数及引脚功能

 

    1602LCD分为带背光和不带背光两种,基节制器大部门为HD44780,带背光的比不带背光的厚,能否带背光在使用中并无不同,两者尺寸不同如下图10-54所示:

 

 

图10-54 1602LCD尺寸图

 

1602LCD次要技术参数:

    显示容量:16×2个字符

    芯片工作电压:4.5—5.5V

    工作电流:2.0mA(5.0V)

    模块最佳工作电压:5.0V

    字符尺寸:2.95×4.35(W×H)mm

引脚功能申明

    1602LCD采用尺度的14脚(无背光)或16脚(带背光)接口,各引脚接口申明如表10-13所示:

编号

符号

引脚申明

编号

符号

引脚申明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/号令选择

12

D5

数据

5

R/W

读/写选择

13

D6

数据

6

E

使能信号

14

D7

数据

7

D0

数据

15

BLA

背光源正极

8

D1

数据

16

BLK

背光源负极

    表10-13:引脚接口申明表

 

第1脚:VSS为地电源。

 

第2脚:VDD接5V正电源。

 

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比渡过高时会发生“鬼影”,使用时能够经由一个10K的电位器调整对比度。

 

第4脚:RS为寄放器选择,高电日常普通选择数据寄放器、低电日常普通选择指令寄放器。

 

第5脚:R/W为读写信号线,高电日常普通进行读操作,低电日常普通进行写操作。当RS和R/W共同为低电日常普通能够写入指令或者显示地址,当RS为低电平R/W为高电日常普通能够读忙信号,当RS为高电平R/W为低电日常普通能够写入数据。

 

第6脚:E端为使能端,当E端由高电平跳变成低电日常普通,液晶模块施行号令。

 

第7~14脚:D0~D7为8位双向数据线。

 

第15脚:背光源正极。

 

第16脚:背光源负极。

 

10.8.2.3 1602LCD的指令申明及时序

 

    1602液晶模块内部的节制器共有11条节制指令,如表10-14所示:

 

序号

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清显示

0

0

0

0

0

0

0

0

0

1

2

光标前去

0

0

0

0

0

0

0

0

1

*

3

置输入模式

0

0

0

0

0

0

0

1

I/D

S

4

显示开/关节制

0

0

0

0

0

0

1

D

C

B

5

光标或字符移位

0

0

0

0

0

1

S/C

R/L

*

*

6

置功能

0

0

0

0

1

DL

N

F

*

*

7

置字符发保留贮器地址

0

0

0

1

字符发保留贮器地址

8

置数据存贮器地址

0

0

1

显示数据存贮器地址

9

读忙标记或地址

0

1

BF

计数器地址

10

写数到CGRAM或DDRAM)

1

0

要写的数据内容

11

从CGRAM或DDRAM读数

1

1

读出的数据内容

    表10-14:节制号令表

 

    1602液晶模块的读写操作、屏幕和光标的操作都是经由指令编程来完成的。(申明:1为高电平、0为低电平)

 

指令1:清显示,指令码01H,光标复位到地址00H位置。

 

指令2:光标复位,光标前去到地址00H。

 

指令3:光标和显示模式设置 I/D:光标挪动标的目的,高电平右移,低电平左移 S:屏幕上所有文字能否左移或者右移。高电平暗示无效,低电平则无效。

 

指令4:显示开关节制。 D:节制全体显示的开与关,高电平暗示开显示,低电平暗示关显示 C:节制光标的开与关,高电平暗示有光标,低电平暗示无光标 B:节制光标能否明灭,高电黎明灭,低电平不明灭。

 

指令5:光标或显示移位 S/C:高电日常普通挪动显示的文字,低电日常普通挪动光标。

 

指令6:功能设置号令 DL:高电日常普通为4位总线,低电日常普通为8位总线 N:低电日常普通为单行显示,高电日常普通双行显示 F: 低电日常普通显示5x7的点阵字符,高电日常普通显示5x10的点阵字符。

 

指令7:字符发生器RAM地址设置。

 

指令8:DDRAM地址设置。

 

指令9:读忙信号和光标地址 BF:为忙标记位,高电平暗示忙,此时模块不能领受号令或者数据,若是为低电平暗示不忙。

 

指令10:写数据。

 

指令11:读数据。

 

    与HD44780相兼容的芯片时序表如下:

 

读情况

输入

RS=L,R/W=H,E=H

输出

D0—D7=情况字

写指令

输入

RS=L,R/W=L,D0—D7=指令码,E=高脉冲

输出

读数据

输入

RS=H,R/W=H,E=H

输出

D0—D7=数据

写数据

输入

RS=H,R/W=L,D0—D7=数据,E=高脉冲

输出

    表10-15:根底操作时序表

 

    读写操作时序如图10-55和10-56所示:

 

 

图10-55 读操作时序

 

 

 

图10-56 写操作时序

 

10.8.2.4 1602LCD的RAM地址映照及尺度字库表

 

  液晶显示模块是一个慢显示器件,所以在施行每条指令之前必然要确认模块的忙标记为低电平,暗示不忙,不然此指令失效。要显示字符时要先输入显示字符地址,也便是告诉模块在哪里显示字符,图10-57是1602的内部显示地址。

 

 

图10-57 1602LCD内部显示地址

 

    例如第二行第一个字符的地址是40H,那么能否间接写入40H就能够将光标定位在第二行第一个字符的位置呢?多么不成,由于写入显示地址时要求最高位D7恒定为高电平1所以现实写入的数据该当是01000000B(40H)+10000000B(80H)=11000000B(C0H)。

 

  在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符工夫标是主动右移的,无需人工干涉。每次输入指令前都要判断液晶模块能否处于忙的情况。

 

    1602液晶模块内部的字符发保留储器(CGROM)曾经存储了160个不合的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文化名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,咱们就能看到字母“A”

 

 

图10-58 字符代码与图形对应图

 

10.8.2.5 1602LCD的一般初始化(复位)过程

 

延时15mS

 

写指令38H(不检测忙信号)

 

延时5mS

 

写指令38H(不检测忙信号)

 

延时5mS

 

写指令38H(不检测忙信号)

 

当前每次写指令、读/写数据操作均需要检测忙信号

 

写指令38H:显示模式设置

 

写指令08H:显示封闭

 

写指令01H:显示清屏

 

写指令06H:显示光标挪动设置

 

写指令0CH:显示开及光标设置

 

10.8.3 1602LCD的软硬件设想实例

 

    在1602LCD第一行显示网站名:www.agpgames.com在第二行显示联系德律:0571-56050300。测验考试前应先将显示切换开关心换到LCD工作情况。

 

 

 

图10-59 1602LCD测验考试演示图

10.8.3.1 硬件道理图

    1602液晶显示模块能够和单片机AT89C51间接接口,电路如图10-60所示。

图10-60 硬件道理图

10.8.3.2 法式流程图

 

图10-61 软件流程图

10.8.3.3 软件代码

 

/***************************************************************************/

 

/*杭州电子&算计机工作室*/

 

/**/

 

/*1602LCD演示法式*/

 

/*方针器件:AT89S51*/

 

/*晶振:11.0592MHZ*/

 

/*编译环境:Keil 7.50A*/

 

/***************************************************************************/

 

/*********************************包含头文件********************************/

 

#include <reg51.h>

 

#include <intrins.h>

 

/*********************************端口定义**********************************/

 

sbit rs= P2^0;

 

sbit rw = P2^1;

 

sbit ep = P2^2;

 

/********************************显示数据表*********************************/

 

unsigned char code dis1[] = {"www.agpgames.com"};

 

unsigned char code dis2[] = {"0571-56050300"};

 

/*****************************************************************************

 

函数功能:LCD延时子法式

 

入口参数:ms

 

出口参数:

 

*****************************************************************************/

 

void delay(unsigned char ms)

 

{

 

unsigned char i;

 

while(ms--)

 

{

 

for(i = 0; i< 250; i++)

 

{

 

_nop_();

 

_nop_();

 

_nop_();

 

_nop_();

 

}

 

}

 

}

 

/*****************************************************************************

 

函数功能:测试LCD忙碌情况

 

入口参数:

 

出口参数:result

 

*****************************************************************************/

 

bit lcd_bz()

 

{

 

bit result;

 

rs = 0;

 

rw = 1;

 

ep = 1;

 

_nop_();

 

_nop_();

 

_nop_();

 

_nop_();

 

result = (bit)(P0 & 0x80);

 

ep = 0;

 

return result;

 

}

 

/*****************************************************************************

 

函数功能:写指令数据到LCD子法式

 

入口参数:cmd

 

出口参数:

 

*****************************************************************************/

 

void lcd_wcmd(unsigned char cmd)

 

{

 

while(lcd_bz());//判断LCD能否忙碌

 

rs = 0;

 

rw = 0;

 

ep = 0;

 

_nop_();

 

_nop_();

 

P0 = cmd;

 

_nop_();

 

_nop_();

 

_nop_();

 

_nop_();

 

ep = 1;

 

_nop_();

 

_nop_();

 

_nop_();

 

_nop_();

 

ep = 0;

 

}

 

/*****************************************************************************

 

函数功能:设定显示位置子法式

 

入口参数:pos

 

出口参数:

 

*****************************************************************************/

 

void lcd_pos(unsigned char pos)

 

{

 

lcd_wcmd(pos | 0x80);

 

}

 

/*****************************************************************************

 

函数功能:写入显示数据到LCD子法式

 

入口参数:dat

 

出口参数:

 

*****************************************************************************/

 

void lcd_wdat(unsigned char dat)

 

{

 

while(lcd_bz());//判断LCD能否忙碌

 

rs = 1;

 

rw = 0;

 

ep = 0;

 

P0 = dat;

 

_nop_();

 

_nop_();

 

_nop_();

 

_nop_();

 

ep = 1;

 

_nop_();

 

_nop_();

 

_nop_();

 

_nop_();

 

ep = 0;

 

}

 

/*****************************************************************************

 

函数功能:LCD初始化子法式

 

入口参数:

 

出口参数:

 

*****************************************************************************/

 

void lcd_init()

 

{

 

lcd_wcmd(0x38);

 

delay(1);

 

lcd_wcmd(0x0c);

 

delay(1);

 

lcd_wcmd(0x06);

 

delay(1);

 

lcd_wcmd(0x01);

 

delay(1);

 

}

 

/*****************************************************************************

 

函数功能:主法式

 

入口参数:

 

出口参数:

 

*****************************************************************************/

 

void main(void)

 

{

 

unsigned char i;

 

lcd_init();// 初始化LCD

 

delay(10);

 

lcd_pos(0x01);//设置显示位置

 

i = 0;

 

while(dis1[i] != '\0')

 

{

 

lcd_wdat(dis1[i]);//显示字符

 

i++;

 

}

 

lcd_pos(0x42);// 设置显示位置

 

i = 0;

 

while(dis2[i] != '\0')

 

{

 

lcd_wdat(dis2[i]);// 显示字符

 

i++;

 

}

 

while(1);

 

}

 

前去列表