lcd0602使用说明.docx

上传人:b****8 文档编号:29903585 上传时间:2023-08-03 格式:DOCX 页数:31 大小:1.30MB
下载 相关 举报
lcd0602使用说明.docx_第1页
第1页 / 共31页
lcd0602使用说明.docx_第2页
第2页 / 共31页
lcd0602使用说明.docx_第3页
第3页 / 共31页
lcd0602使用说明.docx_第4页
第4页 / 共31页
lcd0602使用说明.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

lcd0602使用说明.docx

《lcd0602使用说明.docx》由会员分享,可在线阅读,更多相关《lcd0602使用说明.docx(31页珍藏版)》请在冰豆网上搜索。

lcd0602使用说明.docx

lcd0602使用说明

5.自制单片机之五LCD1602的驱动

LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液

晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上

大部分的字符型液晶。

字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条

线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,定义如下表所示:

字符型LCD的引

脚定义

引脚号

引脚名

电平

输入#输岀

作用

1

Uss

电源地|

2

Ucc

电源C+5U)

3

Uee

对比调整电压

4

RS

8/1

输入

咼入数据

5

R/w

0/1

输入

”向LCD写入指今或数据"从LCD谏取信息

6

E

1

输入

使能信号,=吋谖取信息.—毗下降沿)齡指令

1

Dsa

0/1

输入#输岀

数据总线lirw肌最低位)

8

DB1

0/1

输入禽岀

数据总线

9

DB2

0/1

输入#输出

数据总线HneZ

1Q

0/1

输入#输岀

数据总线lines

11

DE即

0/1

输入#输岀

数据总线lineH

12

0/1

输入#输出

数据总线lines

13

DBG

0/1

输入#输出

数据总线

14

0/1

输入#输岀

数据总线line7(最高位)

15

(I

+Ucc

LCD背光电源正极

16

K

接地

LCD背光电源员极

HD44780内置了DDRAMCGRO和CGRAM

DDRA就是显示数据RAM用来寄存待显示的字符代码。

共80个字节,其地址和屏幕的对应

关系如下表:

显示位置

1

2

3

4

5

6

7

DDRAM

第一行

D1H

03H

0UH

05H

06H

27H

地址

第二行

40H

MH

42H

H3H

44H

屿H

昨H

67H

也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRA的00H地址写入“A”字的代码就行了。

但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到

的。

那么一行可有40个地址呀?

是的,在1602中我们就用前16个就行了。

第二行也一样用前16个地址。

对应如下:

DDRAM地址与显示位置的对应关系

OOH05H06HQ7H08H09H0仙OBHOCHODHOEH6FH

40H41H>I2H43H"耳H45H46H47H49H4AH4BHUCH4DH4EH4FH

我们知道文本文件中每一个字符都是用一个字节的代码记录的。

一个汉字是用两个字节的代

码记录。

在PC上我们只要打开文本文件就能在屏幕上看到对应的字符是因为在操作系统里和BIOS里都固化有字符字模。

什么是字模?

就代表了是在点阵屏幕上点亮和熄灭的信息数据。

例如“A”

字的字模:

01110

10001

10001

10001

11111

■■■■■

10001

10001

0,用“■”代表1。

上图左边的数据就是字模数据,右边就是将左边数据用“O”代表

出是个“A”字了吗?

在文本文件中“A”字的代码是41H,PC收到41H的代码后就去字模文

件中将代表A字的这一组数据送到显卡去点亮屏幕上相应的点,你就看到“A”这个字了。

刚才我说了想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRA啲00H地址写

入“A”字的代码41H就行了,可41H这一个字节的代码如何才能让LCD模块在屏幕的阵点

上显示“A”字呢?

同样,在LCD模块上也固化了字模存储器,这就是CGRO和CGRAM

HD44780内置了192个常用字符的字模,存于字符产生器CGROM(CharacterGeneratorROM)中,另外还有8个允许用户自定义的字符产生RAM称为CGRAM(CharacterGeneratorRAM。

卜图说明了CGROM和CGRA与字符的对应关系。

CGMM中字符诃与字字符字複关系对胆表

 

wentao■口rogramfBii・con

从上图可以看出,“A”字的对应上面高位代码为0100,对应左边低位代码为0001,合起来

就是01000001,也就是41H。

可见它的代码与我们PC中的字符代码是基本一致的。

因此我

们在向DDRAM写C51字符代码程序时甚至可以直接用P1='A'这样的方法。

PC在编译时就把

“A”先转为41H代码了。

字符代码0x00〜0x0F为用户自定义的字符图形RAM对于5X8点阵的字符,可以存放8组,

5X10点阵的字符,存放4组),就是CGRAMT。

后面我会详细说的。

0x20〜0x7F为标准的ASCII码,0xA0〜0xFF为日文字符和希腊文字符,其余字符码(0x10〜

Ox仆及0x80〜0x9F)没有定义。

那么如何对DDRAM勺内容和地址进行具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集,并找出对DDRA啲内容和地址进行操作的指令。

共11条指令:

1.清屏指令

指令功能

指令编码

时囘

/ns

RS

DB7

DB6

DBS

DBU

063

DB2

DD1

DBS

清屏

0

0

0

0

0

0

0

0

1

1.64

功能:

<1>清除液晶显示器,即将DDRA的内容全部填入"空白”的ASCII码20H;<2>光标归位,即将光标撤回液晶显示屏的左上方<3>将地址计数器(AC)的值设为0。

2.光标归位指令

指令功能

指令编码

理行时I可

/ms

RS

R/U

DB7

DB6

DBS

DBM

DB3

DB2

DB1

DBO

光标归位

0

0

0

0

0

0

0

0

1

1^04

功能:

<1>把光标撤回到显示器的左上方;

<2>把地址计数器(AC)的值设置为0;

<3>保持DDRA的内容不变。

3.进入模式设置指令

扌旨令功能

指令编码

时冋

/US

RS

R/W

D87

DB6

DB4

DB3

DB2

0B1

逬入模式设置

0

0

0

E)

0

0

'4

1

I/D

S

功能:

设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。

参数设定的

设置

情况如下所示:

位名

标左移

显示屏不移动

1=写入新数据后光标右移

S0=写入新数据后

1=写入新数据后显示屏整体右移1个字符

4.显示开关控制指令

位名

D

设置

0=显示功能

1=显示功能开

C

0=无光

仁有光标

B

0=光标闪

1=光标不闪烁

5.设定显示屏或光标移动方向指令

指令功能

指令编码

/us

RS

R/W

DB7

DB6

DBS

DB4

DB3

DB2

DB1

DBO

0

0

g

0

0|

1

S/C

R/L

X

X

功能:

使光标移位或使整个显示屏幕移位。

参数设定的情况如下:

S/CR/L

设定情况

00

光标左移1格,且AC值减1

01

光标右移1格,且AC值加1

10

显示器上字符全部左移一格,但光标不动

11

显示器上字符全部右移一格,但光标不动

6.功能设定指令

1=数据总线为8位

N0=显示1

1=显示2行

F0=5X7点阵/每

1=5X10点阵/每字符

7.设定CGRA哋址指令

指令功能

指令编码

/□s

RS

R/W

DB7

DB6

DBS

DB4

DB3

DB2

DB1

DBO

设定CGRAI4

地址

0

g

1

地址⑴位)

40

功能:

设定下一个要存入数据的CGRAI的地址。

 

8.设定DDRA地址指令

指令功能

拒令编码

/US

RS

R/U

DB7

DB6

DBli

DB3

082

DB1

DB0

设定DDRAM地址

0

0

1

CGRAM的地址“位)

3

功能:

设定下一个要存入数据的CGRAI的地址。

9.读取忙信号或AC地址指令

指令功能

指钟码

RS

R/W

DB7

DBADB5DR已DS3DB2DB1

0

1

rn

盹内容卩位)

功能:

<1>读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;

当BF=O时,液晶显示器可以接收单片机送来的数据或指令;

<2>读取地址计数器(AC)的内容。

10.数据写入DDRA或CGRAI指令一览

指令功能

指令编码

/US

RS

R/l>

DB7

DB6

DBS

DB4

DB3

DB2

D叭

DB0

数据写入到

DDR朋或CGRAM

1

0

要写入的数据叮

ME

功能:

<1>将字符码写入DDRAM以使液晶显示屏显示出相对应的字符;

<2>将使用者自己设计的图形存入CGRAM

11.从CGRAM或DDRA读出数据的指令一览

指令功能

扌自令编码

I聽

/us

KS

R/U

DB7

DB6

DBS

DB4

DB3

DB2

DB1

DBO

从仙RAH或DDRAMi咚出数据

1

1

要读出的数据"~D0

功能:

读取DDRAM或CGRAI中的内容。

基本操作时序:

输入:

RS=LRW=H

读状态

E=H

输出:

DBADB7=犬态字

写指令

读数据

E=H

输出:

DBADB7=^据

写数据

输入:

RS=L,

RW=LE=下降沿脉冲,DB0-DB7=旨令

输出:

输入:

RS=H,

RW=,H

输入:

RS=HRW=LE=下降沿脉冲,DBZDB7=^

输出:

看了那么多是不是有些晕?

我也是啊,不过慢慢理解还是没问题的。

实际上面说了那么多具体怎么操作我还是没会啊?

好!

咱就简单点。

举个实例,就在LCD1602屏幕上第一行第一列显示个“A”字。

1.先初始化。

(老大!

好像上面没初始化这条指令啊!

先别拿东西扔我,说明书上是这么说的。

也就先写入些指令。

//先定义接口

#include

***************************************

P1——DB0〜DB7

P2.0RS

P2.1RW

P2.2E

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

#defineLCD_DBP1

sbit

LCD_RS=P2A0;

sbit

LCD_RW=P2A1;

sbit

LCD_E=P2A2;

定义函数**************

 

 

#defineucharunsignedchar

#defineuintunsignedint

voidLCD_init(void);//初始化函数

voidLCD_write_command(ucharcommand);//写指令函数

voidLCD_write_data(uchardat);//写数据函数

voidLCD_disp_char(ucharx,uchary,uchardat);//在某个屏幕位置上显示一个字符,X

(0-16),y(1-2)

//voidLCD_check_busy(void);//检查忙函数。

我没用到此函数,因为通过率极低。

voiddelay_n40us(uintn);//延时函数

〃********************************

delay_n40us(100);〃实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指

令。

*******************************

voidLCD_write_command(uchardat)

{

LCD_DB=dat;

LCD_RS=0;〃指令

LCD_RW=0;〃写入

LCD_E=1;//允许

LCD_E=0;

delay_n40us

(1);〃实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。

}

〃*******************************

 

voidLCD_write_data(uchardat)

{

LCD_DB=dat;

LCD_RS=1;〃数据

LCD_RW=0;〃写入

LCD_E=1;//允许

LCD_E=0;

delay_n40us

(1);

}

〃********************************

voidLCD_disp_char(ucharx,uchary,uchardat)

{

ucharaddress;

if(y==1)

address=0x80+x;

else

address=0xc0+x;

LCD_write_command(address);

LCD_write_data(dat);

}

〃********************************

/*******

检查忙函数*************

voidLCD_check_busy()//实践证明,在我的LCD1602上,检查忙指令通过率极

低,以

{

//至于不能正常使用LCD因此我没有再用检查忙函数。

而使

do

//用了延时的方法,延时还是非常好用的。

我试了一下,用{LCD_E=0;

普通指令只要1次循就可完成。

清屏指令

LCD_RS=0;

能完成。

LCD_RW=1;

LCD_DB=0xff;

LCD_E=1;

}while(LCD_DBA7==1);

//for循环作延时,

//要用200次循环便

****************************

voiddelay_n40us(uintn)

{uinti;

ucharj;

for(i=n;i>0;i--)

for(j=0;j<2;j++);//在这个延时循环函数中我只做了2次循环,

}

//实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。

//*

******************************

//*********

主函数*****************

voidmain(void)

{

LCD_init();

LCD_disp_char(0,1,"A");

while

(1);

}

//*

******************************

具体电路的制作是很简单的,就接了两个电阻,一个是10欧姆的背光限流电阻,另一个是

2K的LCD极板电压调节电阻。

这两个电阻的阻值怎么定呢?

背光比较简单,它就相当于在后面接了几个发光二极管,任何时候你只要在15、16脚串上个100欧的电位器接上电源,

调节电位器,觉得亮度合适。

此时的阻值便可。

LCD液晶极板驱动电压调节电阻的确定就稍

微麻烦一点。

在各数据线,控制线接好关通上电源的前提下在第3脚(VEE)和地之间接一个

10K的电位器。

调节电位器。

当3脚电压高时为全亮,电压为0时为全暗(液晶全显示为黑块)。

你用电位器把屏幕从全暗刚好调到变亮。

这时便可调试程序。

待屏幕能正确显示后再细调电位器,使对比度合适。

这时的阻值便可确定,然后换成等值的固定电阻焊上便可。

我们接着上次的系统板制做:

LLLLLLL

1

h

iiriirrnTriiiiirriI门

«■v

1・、小•r

7

■——

™n■■■■■-—丄-rhjT-

8.8.Q8.8.8.

新买的1602LCD,20元,贵不?

反面:

 

组装后:

具体电路图:

_<>

自己选择号ATT芻51•

的PD-阳捋:

自己迤择与Areaesi的三幄珥0口接

DSO

«

DBT

ES

e/fLCDt1602

UL

1U

BLA

 

接口说明:

运行:

 

 

用户自定义字符的应用:

我们从CGRO表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM从上往下

看着是16个,实际只有8个字节可用。

它的字符码是00000000—00000111这8个地址,表的下面还有8个字节,但因为这个CGRA的字符码规定0—2位为地址,3位无效,4—7全为零。

因此CGRA的字符码只有最后三位能用也就是8个字节了。

等效为0000X111,X为无效位,最后三位为000—111共8个。

如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM的一样,先设置DDRAM

位置,再向DDRAMI入字符码,例如“A”就是41H。

现在我们要显示CGRAI的第一个自定

义字符,就向DDRA写入00000000B(00H),如果要显示第8个就写入00000111(08H),简单吧!

好!

现在我们来看怎么向这八个自定义字符写入字模。

有个设置CGRAI地址的指令大家还记

得吗?

赶快再找出来看看。

九设定CGRftlflte址指令

指令功能

指令编码

/

RS

R/W

DB7

DB6

BB5

DM

D83

DB2

DB1

设定CGRAM地址

0

0

0

1

CGRflM的地址"位)

J

10

功能:

设定下亠个要存入数据的WR刪的地址。

从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。

例如第一

个自定义字符的字模地址为

01000000—01000111八个地址。

我们向这8个字节写入字模数

据,让它能显示出“C

地址:

01000000

数据:

00010000

01000001

00000110

01000010

00001001

01000011

00001000

01000100

00001000

01000101

00001001

图示:

OOO^OOOO

OOOO・OO・

OOOO・OOO

OOOO・OOO

OOOO・OO・

OOOOO"Ooooooooo

8个自定义字符显示出一个心的图案:

#includeunsignedchartable1[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,

0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,

0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,

0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,

0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,

0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,

0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,

0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图案

unsignedchartable[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};〃字符C

#define

CLEARSCREENLCD_write_command(0x01)

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

定义接口************************/

#define

LCDIOP2

sbitLCD1602_RS=P3P;

sbitLCD1602_RW=P3A1;

sbitLCD1602_EN=P3A2;

voidLCD_write_command(unsignedcharcommand);//写入指令函数

voidLCD_write_dat(unsignedchardat);//写入数据函数

voidLCD_set_xy(unsignedcharx,unsignedchary);//设置显示位置函数

voidLCD_dsp_char(unsignedx,unsignedchary,unsignedchardat);//显示一个字符

函数

voidLCD_dsp_string(unsignedcharX,unsignedcharY,unsignedchar*s);//显示字符

串函数

voidLCD_init(void);//初始化函数

voiddelay_nms(unsignedintn);//延时函数

voidLCD_init(void)

{

CLEARSCREEN;//clearscreen

LCD_write_command(0x38);//set8bitdatatransmissionmodeLCD_write_command(0x0c);//opendisplay(enablelcddisplay)LCD_write_command(0x80);//setlcdfirstdisplayaddress

CLEARSCREEN;//clearscreen

}

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

 

voidLCD_dsp_char(unsignedx,unsignedchary,unsignedchardat){

LCD_set_xy(x,y);LCD_write_dat(dat);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 演讲主持

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

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