lcd1602

  • 格式:doc
  • 大小:268.00 KB
  • 文档页数:10

控制接口说明:

1、基本操作时序:

1.1读状态:输入:RS=L,RW=H,E=H 输出:D0—D7=状态字

1.2写指令:输入:RS=L,RW=L,D0—D7=指令码,E=高脉冲 输出:无

1.3读数据:输入:RS=H,RW=H,E=H 输出:D0—D7=数据

1.4写数据:输入:RS=L,RW=L,D0—D7=数据,E=高脉冲 输出:无

2、状态字说明

STA7 STA6 STA5 STA4 STA3 STA2 STA1 STA0

D7 D6 D5 D4 D3 D2 D1 D0

STA0—STA6 当前数据地址指针的数值

STA7 读写操作使能 1:禁止0:允许

注:对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7=0

3、RAM地址映射图

控制器内部带有80×8位(80字节)的RAM缓冲区,对应的关系如下图所示:

4、指令说明

4.1初始化设置

显示模式设置

指令码 功能

00111000设置16×2显示,5×7点阵,8位数据接口

显示开/关及光标设置

指令码 功能

0 0 0 0 1 D C B D=1 开显示; D=0关显示

C=1 显示光标;

C=0不显示光标

B=1 光标闪烁;

B=0光标不显示

0 0 0 0 0 1 N S N=1 当读或写一个字符后地址指针加—,且光标加—

N=0 当读或写一个字符后地址指针减—,且光标减—

S=1 当写一个字符,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果。

S=0 当写一个字符,整屏显示不移动

数据控制

控制器内部设有一个数据地址指针,可通过它们来访问内部的全部80字节RAM。

数据指针设置: 指令码 功能

80H+地址码(0—27H,40H—67H) 设置数据地址指针

其它设置:

指令码 功能

01H 显示清屏:1.数据指针清零

2.所有显示清零

02H 显示回车:1.数据指针清零

5、初始化过程

延时15ms

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

延时5ms

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

延时5ms

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

(以后每次写指令、读/写数据操作之前均需检测忙信号)

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

写指令08H:显示关闭

写指令01H:显示清屏

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

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

原文出自:/47okey/blog/item/809c7cfc8dd6541c08244d60.html 程序分析:、

程序清单:

RS BIT P3.7 ;RS1602液晶的数据命令控制端,高电平为数据,低电平为指令

;这3位是液晶屏的控制信号,连接方式由具体硬件而定

RW BIT P3.6 ;RW1602液晶的读写控制端,高电平为读,低电平为写

E BIT P3.5 ;E1602的使能端 ORG 0000H ;程序开始

LJMP MAIN;跳转到MAIN处执行程序

ORG 0100H ;数据存放地址

MAIN:

LCALL DISPLAY;调用液晶显示子程序

LCALL D1S;延时1秒

LJMP MAIN;返回到MAIN处

;-------液晶显示的子程序(显示前先格式转换)---------------------------------------

DISPLAY:

LCALL INITIAL ;调用初始化子程序

MOV A, #10000000B ; LINE1: DB 'This

is a TEST',00H,设置第一行的显示地址

LCALL WRITE_INSTRUCTION ;调用写液晶命令子程序

MOV DPTR, #LINE1 ;将表格1送到DPTR中

LCALL PR_STRING ;调用写字符子程序

LCALL WRITE_LCDDATA ;调用写液晶数据子程序

MOV A, #11000000B ; LINE2: DB

'Design by 47okey',00H,设置第二行的显示地址

LCALL WRITE_INSTRUCTION ;调用写液晶命令子程序

MOV DPTR, #LINE2 ;将表格2送到DPTR中

LCALL PR_STRING ;调用写字符子程序

RET

;---液晶屏初始化,具体请参考资料-------------------------------------------------

initial: MOV A, #01H ;01H这个指令是设置1602的清屏操作

LCALL WRITE_INSTRUCTION ;调用液晶命令写入子程序

MOV A, #38H ;38H这个指令是设置1602的显示模式,2行,16个字符/行

LCALL WRITE_instruction ;调用液晶命令写入子程序

MOV A, #0FH ;0FH这个指令是设置1602的显示、显示光标、光标闪烁

LCALL WRITE_instruction ;调用液晶命令写入子程序

MOV A, #06H ;06H这个指令是设置1602的输入方式,增量不移位

LCALL WRITE_instruction ;调用液晶命令写入子程序

RET

;----写液晶指令的子程序------------------------------------------

WRITE_instruction: MOV P1, A ;将累加器A中的命令送到P0口做输出数据

CLR RS ;写入控制命令,RS低电平为命令

CLR RW ;读写控制端,RW,低电平为写,就是写命令

CLR E ;使能端,E发生电平跳变就开始写入命令

LCALL DELAY ;调用延时子程序,也就是下面写的判断液晶模块是否处于忙状态

SETB E ;使能端,E发生电平跳变完成,写入命令完成

RET

;----写液晶数据的子程序---------------------------------------------

write_lcddata: MOV P1, A ;将累加器A中的数据送到P0口做输出数据 SETB RS ;写入显示数据,RS高电平为数据

CLR RW ;读写控制端,RW低电平为写数据

CLR E ;使能端E,低电平

LCALL DELAY ;判断液晶模块是否忙?

SETB E ;使能端,E发生电平跳变完成,写入数据完成

RET

;-----写行字符的子程序---------------------------------------------------------------

PR_STRING: CLR A ;将累加器A中的内容做清零操作

MOVC A, @A+DPTR ;查表,将查到的数据送到累加器A中去

JZ END_PR ;JZ为累加器A判0转移指令,若A中不为0则往下执行程序,为0则跳转到END_PR处

LCALL WRITE_LCDDATA ;调用写液晶数据的的子程序

INC DPTR ;DPTR地址加一

LJMP PR_STRING ;跳转到PR_STRING处执行程序

END_PR: RET ;----查看液晶忙碌信号的子程序---------------------------------------------------------

DELAY: MOV P1,#0FFH ;判断液晶显示器是否忙的子程序

CLR RS ;RS低电平,写命令

SETB RW ;RW高电平,读液晶内部的数据

CLR E ;使能端低电平

NOP ;延时一个机器周期

SETB E ;使能端高电平

JB P1.7,DELAY ;如果P1.7为高电平表示忙就循环等待,JB判bit转移,bit为1则跳转,否则顺序执行程序

RET

;---1mS延时(按12MHZ算)-----------------------------------------------------------------

D1mS: MOV R7,#250

LOOP0: NOP

NOP

DJNZ R7,LOOP0

RET ;----1S延时(按12MHZ算)-----------------------------------------------------------------

D1S: Mov R6,#4

LOOP2: mov R5,#250

LOOP1: LCALL D1mS

DJNZ R5,LOOP1

DJNZ R6,LOOP2

RET

;--------------------------------------------------------------------------------------

LINE1: DB 'This is a TEST !',00H

LINE2: DB 'Design by 47okey',00H

END