📄 he26.asm
字号:
;=============硬件实验二十六 2×16LCD液晶显示接口实验=========
org 0000h
LJMP LCDGD
;8155命令口 0ffe8h
ORG 1000H
;==========2X16字符式液晶显示================
;R/W=8155_PA7
;RS=8155_PB3
;LCD_E=/0FFECH与/RD或/WR的乘积项
;DB0_DB7=数握据总线
;============写命命============
LC_WMB: PUSH 0E0H
CALL LC_RBF
MOV DPTR,#0FFE9H ;令R/W=0
MOV A,#7FH
LC_WRS: MOVX @DPTR,A
MOV DPTR,#0FFECH
POP 0E0H
MOVX @DPTR,A
RET
;==========写数据=============
LC_WDB: PUSH 0E0H
CALL LC_RBF
CJNE A,#50H,LCW_0
LCW_0: JC LCW_1
MOV A,#0C0H
CALL LC_WMB
CALL LC_RBF
LCW_1: MOV DPTR,#0FFE9H ;令R/W=0
MOV A,#7FH
MOVX @DPTR,A
INC DPTR
MOV A,#0FFH ;令RS=1
SJMP LC_WRS
;============ 读数据 =========
LC_RDB: CALL LC_RBF
MOV DPTR,#0FFEAH
MOV A,#0FFH ;令RS=1
MOVX @DPTR,A
MOV DPTR,#0FFECH
MOVX A,@DPTR
RET
;===========读状态及AC地址=========
LC_RBF: MOV DPTR,#0FFE9H ;令R/W=1
MOV A,#0FFH
MOVX @DPTR,A
INC DPTR
MOV A,#0F7H ;令RS=0
MOVX @DPTR,A
lC_BRN: MOV DPTR,#0FFECH ;读状态
MOVX A,@DPTR
JB ACC.7,lC_BRN
RET
;==================================
LCDGD: MOV SP,#60H
MOV DPTR,#0FFE8H ;写8155控制字
MOV A,#43H
MOVX @DPTR,A ;令A、B 口为输出口
;C口为输入口
lcd_t: mov dptr,#0ffe9h
MOV A,#7FH ;令LCD_R/W为零
MOVX @DPTR,A
INC DPTR
MOV A,#0F7H ;令LCD_RS为零
MOVX @DPTR,A
;=========== 启动 LCD =============
MOV DPTR,#0FFECH
MOV A,#30H ;启动lcd
MOVX @DPTR,A
mov r2,#30h ;等待500m秒
lce_wa: djnz r3,lce_wa
djnz r2,lce_wa
MOV A,#30H ;第二次启动
MOVX @DPTR,A
djnz r3,$ ;等待500u秒
MOV A,#30H ;第三次启动
MOVX @DPTR,A
djnz r3,$ ;等待500u秒
MOV A,#38H ;设定lcd当前工作模式
MOVX @DPTR,A ;汇流、两行、5X7字型
djnz r3,$ ;等待500u秒
MOV A,#08H ;关显示
MOVX @DPTR,A
djnz r3,$ ;等待500u秒
MOV A,#01H ;LCD清屏
MOVX @DPTR,A
djnz r3,$ ;等待500u秒
MOV A,#0EH ;开显示、光标不闪烁
MOVX @DPTR,A
djnz r3,$ ;等待500u秒
CALL LC_RBF ;检测LCD状态
LCD_P: MOV A,#06H ;光标右移且地址加1
CALL LC_WMB
MOV A,#02H ;光标归位
CALL LC_WMB
;=========送Dais-8052H+ good==============
MOV A,#44H ;写入“D”
CALL LC_WDB
MOV A,#61H ;写入“a”
CALL LC_WDB
MOV A,#69H ;写入“i”
CALL LC_WDB
mov a,#73h ;写入“s”
CALL LC_WDB
mov a,#0b0h ;写入“-”
CALL LC_WDB
mov a,#38h ;写入“8”
CALL LC_WDB
mov a,#30h ;写入“0”
CALL LC_WDB
mov a,#35h ;写入“5”
CALL LC_WDB
mov a,#32h ;写入“2”
CALL LC_WDB
mov a,#48h ;写入“H”
CALL LC_WDB
mov a,#2Bh ;写入“+”
CALL LC_WDB
mov a,#0a0h ;写入“ ”
CALL LC_WDB
mov a,#67h ;写入“g”
CALL LC_WDB
mov a,#6fh ;写入“o”
CALL LC_WDB
mov a,#6fh ;写入“o”
CALL LC_WDB
mov a,#64h ;写入“d”
CALL LC_WDB
MOV A,#0C0H ;写地址(换行)
CALL LC_WMB ;指向第二行第一位
mov a,#50h ;写入“P”
CALL LC_WDB
MOV A,#0C0H ;写地址(光标)
CALL LC_WMB ;指向第二行第一位
;=========4位七段显示、3x3键扫实验==============
;ioa equ 0ffe9h ;8155A口(字形)
;iob equ 0ffeah ;8155B口(字位)
;ioc equ 0ffebh ;8155C口(键入)
MOV 50H,#7EH ;清显示缓冲单元
MOV A,#10H
MOV R0,#7BH
LEDS: MOV @R0,A
INC R0
CJNE R0,#7EH,LEDS
INC A ;送待令符“p”
MOV @R0,A
LEDT: CALL X2
CJNE A,#10H,LED0 ;调闪动显示、键扫消抖子程序
LED0: JNC LED1 ;是返“P”命令转!
orl a,#30h ;ASCLL码转换
call lc_wdb ;送LCD单元
anl a,#0fh ;还原代码
acall x3 ;送当前LED光标闪动单元
DB 7BH,7EH ;调正光标闪动指针
SJMP LEDT ;完成送数操作返回显示键扫入口
LED1: MOV A,#01H ;LCD清屏
CALL LC_WMB
MOV a,#0eh
call lc_wmb ;开显示、光标不闪烁
jmp lcd_p ;返回初始待令入口
;=======刷新光标单元调正闪动指针==========
X3: MOV R4,A
MOV R0,#50H
MOV A,@R0
MOV R1,A
MOV A,R4
MOV @R1,A
CLR A
POP DPH
POP DPL
MOVC A,@A+DPTR
INC DPTR
CJNE A,01H,X30
dec r1
clr a
MOVC A,@A+DPTR
X31: MOV @R0,A
INC DPTR
PUSH DPL
PUSH DPH
RET
X30: DEC R1
MOV A,R1
SJMP X31
;==========闪动显示子程序===============
X2: MOV R6,#80H
X0: ACALL XLE
JNB ACC.5,XX0
DJNZ R6,X0
MOV R6,#30H
MOV R0,#50H
MOV A,@R0
MOV R0,A
MOV A,@R0
MOV R7,A
MOV A,#10H
MOV @R0,A
X1: ACALL XLE
JNB ACC.5,XX1
DJNZ R6,X1
MOV A,R7
MOV @R0,A
SJMP X2
XX1: MOV R6,A
MOV A,R7
MOV @R0,A
MOV A,R6
XX0: RET
;========= 显示、键扫消抖程序=========
XLE: ACALL DIS ;显示
ACALL KEY ;键扫
;========= 键消抖处理程序 =============
MOV R4,A
MOV R1,#48H
MOV A,@R1
MOV R2,A
INC R1
MOV A,@R1
MOV R3,A
MOV A,R4
XRL A,R3
MOV R3,04H
MOV R4,02H
JZ X10
MOV R2,#88H
MOV R4,#88H
X10: DEC R4
MOV A,R4
XRL A,#82H
JZ X11
MOV A,R4
XRL A,#0EH
JZ X11
MOV A,R4
JZ X12
MOV R4,#20H
DEC R2
SJMP X13
X12: MOV R4,#0FH
X11: MOV R2,04H
NOP
NOP
MOV R4,03H
X13: MOV R1,#48H
MOV A,R2
MOV @R1,A
INC R1
MOV A,R3
MOV @R1,A
MOV A,R4
JB ACC.5,X113
MOV DPTR,#LS3
MOVC A,@A+DPTR
X113: RET
;=========== 键值表===================
LS3: DB 00H,01H,02H,20H,20H,20H,20H,20H;
; 0, 1, 2,无键按下值
DB 03H,04H,05H,20H,20H,20H,20H,20H;
; 3, 4, 5,
DB 06H,07H,10H,20H,20H,20H,20H,20H;
; 6, 7, 返回键按下值
;=========== 显示子程序===============
DIS: PUSH DPH
PUSH DPL
SETB RS1
MOV R0,#7EH
MOV R2,#80H
MOV R3,#00H
MOV DPTR,#LS0
LS2: MOV A,@R0
MOVC A,@A+DPTR
MOV R1,#0E9H
ORL A,#80H
MOVX @R1,A
MOV A,R2
inc R1
ORL A,#0FH
MOVX @R1,A
LS1: DJNZ R3,LS1
MOV A,R2
CLR C
RRC A
MOV R2,A
DEC R0
JNB ACC.3,LS2
MOV A,#0FH
movx @R1,A
dec r0
CLR A
movx @r0,a
CLR RS1
POP DPL
POP DPH
RET
;=============字形表========================
LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H
; 0, 1, 2, 3, 4, 5,
DB 82H,0F8H,80H,90H,88H,83H,0C6H
; 6, 7, 8, 9, a, b, c,
DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH
; d, e, f, 空, p , h, -,
;=============键扫子程序====================
KEY: SETB RS1
MOV R2,#0FEH
MOV R3,#03H
MOV R0,#00H
LP1: MOV R1,#0EAH
MOV A,R2
MOVX @R1,A
RL A
MOV R2,A
inc r1
MOVX A,@R1
CPL A
ANL A,#07H
JNZ LP0
INC R0
DJNZ R3,LP1
XP33: MOV A,#20H
XP3: mov r2,a
MOV A,#0FH
mov r1,#0EAH
movx @r1,a
mov a,r2
CLR RS1
RET
LP0: CPL A
JB ACC.0,XP0
MOV A,#00H
SJMP LPP
XP0: JB ACC.1,XP1
MOV A,#08H
SJMP LPP
XP1: JB ACC.2,XP33
MOV A,#10H
LPP: ADD A,R0
sjmp xp3
;=============================
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -