📄 keypad.asm
字号:
NAME KEYPAD
?PR?input?KEYPAD SEGMENT CODE
PUBLIC input
PUBLIC init
?DT?input?KEYPAD SEGMENT DATA
RSEG ?DT?input?KEYPAD
KEY_ROW0 equ 0F7h
KEY_ROW1 equ 0EFh
KEY_ROW2 equ 0DFh
KEY_ROW3 equ 0BFh
KEY_ROW4 equ 07Fh
keyflags: ds 20
RSEG ?PR?input?KEYPAD
init:
ANL TMOD,#0F0H
ORL TMOD,#01H
MOV TH0,#0FFH
MOV TL0,#0FFH
SETB EA
SETB ET0
SETB TR0
RET
input:
keyscan:
push DPH
push DPL
mov R0,#keyflags ; R0 addresses the key toggle bytes
mov R1,#KEY_ROW0 ; R1 address the keyboard row address
mov R2,#5 ; R2 counts rows
ksrow:
mov P3,R1 ; Set row address to port P3
nop
mov A,P1 ; Read column data from port P1
mov R3,#4 ; R3 counts keys per row
anl A,#3Fh
ks0: rrc A ; Move next bit into carry
mov R4,A ; R4 preserves the row data
jc ks1 ; Jump if key not pressed
mov A,@R0 ; Test if key already pressed
mov @R0,#1 ; Flag pressed anyway
jz ksnew ; Jump if key newly pressed
jmp ks2
ks1:
mov @R0,#0 ; Flag key as not pressed
ks2:
inc R0 ; Loop for next key in this row
mov A,R4
djnz R3,ks0
mov A,R1 ; Jiggle R1 to address next row
rl A
mov R1,A
djnz R2,ksrow
clr A
mov R7,A ; Return zero - no (new) key press.
jmp ksend
ksnew: mov DPTR,#keycodes ; We've found a new key since last time:
mov A,R0 ; The key flag address (ordinal) is in R0
clr C
subb A,#keyflags
movc A,@A+DPTR
mov R7,A ;返回值放入R7.
ksend: mov P3,#0FFh
pop DPL
pop DPH
ret
;Data tables for returned row bits
keycodes:
db 'S',09h,08h,07h
db 07h,08h,09h, '/'
db 04h,05h,06h, '*'
db 01h,02h,03h, '-'
db 'C','0','=', '+'
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -