📄 keyboardlcd.asm
字号:
EN EQU P2.2
RW EQU P2.1
RS EQU P2.0
LCD EQU P0
LINE EQU 30H
ROW EQU 31H
VAL EQU 32H
x equ 33h
ORG 0000h
ljmp start
org 0030h
START: MOV x,#00H
begin:lcall keyscan
lcall disp
ljmp begin
KEYSCAN: MOV P3,#0F0H ;列线置高电平,行线置高电平
L1: JNB P3.0,L2 ;逐行扫描
LCALL DELAY
JNB P3.0,L2
MOV LINE,#00H ;存行号
LJMP RSCAN
L2: JNB P3.1,L3
LCALL DELAY
JNB P3.1,L3
MOV LINE,#01H ;存行号
LJMP RSCAN
L3: JNB P3.2,L4
LCALL DELAY
JNB P3.2,L4
MOV LINE,#02H ;存行号
LJMP RSCAN
L4: JNB P3.3,L1
LCALL DELAY
JNB P3.3,L1
MOV LINE,#03H ;存行号
RSCAN: MOV P3,#0FH ;行线列线电平互换
C1: JNB P3.4,C2 ;逐列扫描
MOV ROW,#00H ;存列号
LJMP CALCU
C2: JNB P3.5,C3
MOV ROW,#01H ;存列号
LJMP CALCU
C3: JNB P3.6,C4
MOV ROW,#02H ;存列号
LJMP CALCU
C4: JNB P3.7,C1
MOV ROW,#03H ;存列号
CALCU: MOV A,LINE ;根据行号和列号计算键值
MOV B,#04H
MUL AB
ADD A,ROW
MOV VAL,A ;存键值
RET
disp:call lcd_init
mov r0,x
jb f0,loop3
cjne r0,#16,comp
comp:jnc loop
mov a,r0
add a,#80h
sjmp done
loop:setb f0
mov x,#00h
loop3:mov r0,x
mov a,r0
add a,#0c0h
done:call wr_inst
inc x
mov r0,x
cjne r0,#16,goon
clr f0
sjmp exit
goon:mov a,val
cjne a,#0ah,comp2
comp2:jnc loop2
add a,#30h
sjmp done2
loop2:add a,#37h
done2:call wr_data
sjmp exit1
exit:mov x,#00h
mov r0,x
exit1:ret
lcd_init: MOV A,#00111000B ;设定为8BIT,2行,5*7字形
CALL WR_INST
;MOV A,#00001000B ;关闭显示屏
;CALL WR_INST
MOV A,#00001110B ;开启显示屏,游标,与闪烁
CALL WR_INST
MOV A,#00000110B ;设定AC+1
CALL WR_INST
ret
WR_INST:
CALL CHECK_BF
CLR RS
CLR RW
SETB EN
MOV LCD,A
CLR EN
RET
;====================================
CHECK_BF:
PUSH ACC
BUSY:
CLR RS
SETB RW
SETB EN
MOV A,LCD
CLR EN ;硬件实验可以没有这条语句,仿真实验没有万万不可.
SETB EN ;硬件实验可以没有这条语句,仿真实验没有万万不可.
JB ACC.7,BUSY
CALL DELAY
POP ACC
RET
WR_DATA:
CALL CHECK_BF
SETB RS
CLR RW
SETB EN
MOV LCD,A
CLR EN
RET
DELAY2: MOV R3,#20
D3: MOV R4,#200
D2: MOV R5,#250
DJNZ R5,$
DJNZ R4,D2
DJNZ R3,D3
RET
DELAY: MOV R6,#60
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -