📄 lcdtest1.asm
字号:
;---------------------------------------------------管脚配置
RS BIT P3.5 ;P3.4脚接RS端
R_W BIT P3.6 ;P3.5脚接R_W端
E BIT P3.7 ;P3.6脚接E端
D_BUS DATA P0 ;P1口控制D_BUS输出
;----------------------------------------------------LCD Commands RS RW D7 D6 D5 D4 D3 D2 D1 D0
; LCD_CLS equ 1 ;清显示 0 0 0 0 0 0 0 0 0 1
; LCD_HOME equ 2 ;光标复位 0 0 0 0 0 0 0 0 1 0
; LCD_SETMODE equ 4 ;光标和显示模式设置 0 0 0 0 0 0 0 1 I/D S
;I/D=1光标右移,0左移,S=1文字移动使能
; LCD_SETVISIBLE equ 8 ;显示开关控制 0 0 0 0 0 0 1 D C B
;D:控制整体显示的开与关,高电平开显示
;C:控制光标的开与关,高电平表示有光标
;B:控制光标是否闪烁,高电平闪烁
; LCD_SHIFT equ 16 ;光标或显示移位 S/C 0 0 0 0 0 1 S/C R/L 0 0
;高电平时移动文字,低电平时移动光标
; LCD_SETFUNCTION equ 32 ;功能设置命令 0 0 0 0 1 DL N F 0 0
;DL:高电平为4位总线,低电平为8位总线
;N:低电平为单行显示,高电平时双行显示
;F: 低为5x7点阵字符,高为5x10点阵字符
; LCD_SETCGADDR equ 64 ;字符发生器RAM地址设置 0 0 0 1 字符发生寄存器地址
; LCD_SETDDADDR equ 128 ;置数寄存器地址 0 0 1 显示数据寄存器地址
;---------------------------------------------------------------------
ORG 0000H ;从0000H处开始
LJMP MAIN ;跳转到MAIN处
ORG 000BH
AJMP INSE
ORG 0030H ;主程序从0030H处开始
MAIN:
MOV TMOD,#0
MOV TL0,#0
MOV TH0,#0
SETB EA
SETB ET0
SETB TR0
MOV R5,#50
MOV SP,#60H ;堆栈指针指向70H
LCALL INITIAL ;调用启动LCM子程序进行初始化
LCALL CLS ;调用清除LCM子程序
MOV A,#80H ;向A送立即数80H设定显示地址为第一行第一列
LCALL WRITE_COM ;调用写指令到LCM子程序
;MOV A,#01000001B ;字母“A”的代码。
;LCALL WRITE_DATA
MOV DPTR,#LINE1 ;将第一行字符串的启始地址送如DPTR中
LCALL DISP ;调用显示字符串到LCM子程序
MOV A,#0C0H ;向A送立即数0C0H设定显示地址为第二行第一列
LCALL WRITE_COM
;MOV A,#01000010B ;字母“A”的代码。
;LCALL WRITE_DATA
;LCALL WRITE_COM ;调用写指令到LCM子程序
MOV DPTR,#LINE2 ;将第二行字符串的启始地址送如DPTR中
LCALL DISP ;调用显示字符串到LCM子程序
SJMP $ ;程序动态停机
INSE: MOV TL0,#0 ;中断服务子程序。
MOV TH0,#0
DJNZ R5,NO
MOV R5,#50
NO: RETI
LINE1: DB " welcome to ",00H ;第一行字符串
LINE2: DB " www.zwmcu.com! ",00H ;第二行字符串
INITIAL: ;初始化LCD子程序
MOV A,#00111000B ;使用8Bits汇流排,显示两行,使用5*7的字型。
LCALL WRITE_COM
MOV A,#00001111B ;显示器开,光标开,光标闪烁。
LCALL WRITE_COM
MOV A,#00000110B ;字符不动,光标自动右移一格
LCALL WRITE_COM
RET
CHECK_BUSY: ;查询忙碌信号子程序
PUSH ACC
BUSY_LOOP:
CLR RS
SETB R_W
CLR E
SETB E
MOV A,D_BUS
CLR E
JB ACC.7,BUSY_LOOP
POP ACC
ACALL DEL
RET
WRITE_COM: ;写指令到LCD子程序
LCALL CHECK_BUSY
CLR E
CLR RS
CLR R_W
SETB E
MOV D_BUS,A
CLR E
RET
WRITE_DATA: ;写数据到LCD子程序
LCALL CHECK_BUSY
CLR E
SETB RS
CLR R_W
SETB E
MOV D_BUS,A
CLR E
RET
CLS: ;清除LCD子程序
MOV A,#01H
LCALL WRITE_COM
RET
DEL:
MOV R6,#5 ;2.7ms延时子程序
D1:
MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DISP:
PUSH ACC ;将A的内容压栈
DISP_LOOP:
CLR A ;A清零
MOVC A,@A+DPTR ;查表将字符串内容送入A
JZ END_DISP ;若查到的内容为0则终止查表
LCALL WRITE_DATA ;调用写数据到LCM子程序
INC DPTR ;DPTR加1指向下一个对象
SJMP DISP_LOOP ;跳转到DISP_LOOP循环执行
END_DISP:
POP ACC ;弹出压栈内容至A
RET
END ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -