📄 1602book.asm
字号:
RS EQU P1.1 ;RS和硬件的P1.1脚相连
RW EQU P1.3 ;RW和硬件的P1.3脚相连
E EQU P1.2 ;E和硬件的P1.2脚相连
XPOS EQU 41H ;行号
YPOS EQU 42H ;列号
ORG 0000H ;复位的地址,跳转到主程序。
LJMP MAIN
ORG 0030H ;主程序入口。
MAIN:
MOV SP,#5FH
LCALL RSTLCD ;调用LCD初始化函数。
MOV XPOS,#0D ;屏幕上显示的起始位置。
MOV YPOS,#0D
LCALL STARTADDRESS ;调用显示的其始地址。
MOV DPTR,#TABLE
MOV A,#0D
MOV R1,#0
WRITESTRING:MOVC A,@A+DPTR
CJNE R1,#16D,SHOW
SJMP $
SHOW: LCALL BUSYCHECK
LCALL WRITECHAR
MOV A,#0D
INC DPTR
INC R1
LCALL WRITESTRING
SJMP $
/*-----------------------------------------------------------------------------------------------------*/
STARTADDRESS:MOV A,XPOS ;此处的三个函数是求出显示字符的函数的屏幕位置。
ANL A,#0FH ;求出X轴的值。范围是0-15
MOV XPOS,A
MOV A,YPOS
ANL A,#01H ;求出行值。0或者1
MOV YPOS,A
CJNE A,#0D,LPSLAY ;如果是第1行
MOV A,XPOS
JMP LPSLAX
LPSLAY: MOV A,XPOS
ADD A,#40H
LPSLAX: ORL A,#80H ;利用逻辑或命令,和写命令结合起来。
PUSH ACC
LCALL BUSYCHECK ;确定显示的其始地址。
POP ACC
LCALL LCDWC
RET
/*-----------------------------------------------------------------------------------------------------*/
/*------------------------------写指令-----------------------------------------------------------------*/
LCDWC: MOV P0,A ;首先这是初始化的需要,不是真正的写入命令。命令写入P0口
CLR RS ;最好用查询函数。LCDWCN函数读取数据线上的命令。RS=0,说明数据线上传送的是命令。
CLR RW ;RW=0,说明允许写入命令。
CLR E ;命令写入SPLC78,片选。
NOP ;给点读取的时间。
SETB E ;取消片选。
RET
/*-----------------------------------------------------------------------------------------------------*/
/*--------------------------------------写数据---------------------------------------------------------*/
WRITECHAR: MOV P0,A
SETB RS
CLR RW
CLR E
NOP
SETB E
RET
/*-----------------------------------------------------------------------------------------------------*/
/*------------------------------------LCD初始化--------------------------------------------------------*/
RSTLCD: MOV R6,#15D ;调用延时。上电延时15MS. 完全按照数据手册来写指令
LCALL DELAY1MS
MOV A,#38H
LCALL LCDWC
MOV R6,#5D
LCALL DELAY1MS
MOV A,#38H
LCALL LCDWC
MOV R6,#5D
LCALL DELAY1MS
MOV A,#38H
LCALL LCDWC
MOV R6,#5D
LCALL DELAY1MS ;以上指令是写指令38H,但是不检测忙信号。
;命令写入的开始。
LCALL BUSYCHECK ;写指令前检测LCD的状态。
MOV A,#38H ;功能设置。00111000B,说明数据总线的长度是8位。
;N=1,说明行数是两行。F=0,说明
;字符点阵是5*7
LCALL LCDWC ;调用函数写入命令。
LCALL BUSYCHECK
MOV A,#0CH ;显示控制,显示OFF,光标OFF,闪烁OFF
LCALL LCDWC ;调用函数写入指令。
LCALL BUSYCHECK
MOV A,#01H ;清屏指令。
LCALL LCDWC
LCALL BUSYCHECK
MOV A,#06H ;
LCALL LCDWC ;调用函数写入指令。
LCALL BUSYCHECK
RET
/*-----------------------------------------------------------------------------------------------------*/
/*------------------------------------------延时子程序-------------------------------------------------*/
DELAY1MS:
D1: MOV R5,#2D
D2: MOV R4,#250 ;延时函数。用R6控制延时的长短。
DJNZ R4,$
DJNZ R5,D2
DJNZ R6,D1
RET
/*-----------------------------------------------------------------------------------------------------*/
/*-----------------------------------读LCD状态---------------------------------------------------------*/
BUSYCHECK:MOV P0,#0FFH ;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
SETB E
JB P0.7,BUSYCHECK ;如果P1.7为高电平表示忙就循环等待
RET
/*-----------------------------------------------------------------------------------------------------*/
TABLE: DB " 1602TESTAGAIN "
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -