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