📄 kb.a51
字号:
ORG 00H
JMP START
;-----------------------------------------------------------
KB_PORT EQU P1
LED_PORT EQU P2
;-----------------------MAIN_PRO----------------------------
ORG 40H
START:
CALL KEY_SCAN
MOV P2,R3
MOV R5,#10
L1: CALL DL20MS
DJNZ R5,L1
JMP START
;--------------------查表法得顺序码------键码存于R3中------------------------
KEY_SCAN:
MOV KB_PORT,#0FH ;用反转法查键
MOV A,KB_PORT
ANL A,#0FH
MOV B,A
MOV KB_PORT,#0F0H
MOV A,KB_PORT
ANL A,#0F0H
ORL A,B
CJNE A,#0FFH,KEY1
RET ;无键按下
KEY1:
MOV B,A ;有键按下,存键码
MOV DPTR,#TABLE
MOV R3,#0FFH ;存顺序码单元初始化
KEY2:
INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEY3 ;判键码,求顺序码
MOV A,R3 ;若找到键码,存顺序码
RET
KEY3:
CJNE A,#0FFH,KEY2 ;判是否查完
RET ;已查完,键码未找到,以无按键处理
;--------------------------------------------------------------------------------------------
DL20MS:
MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;-------------------可改表的须序来改变对应键的顺序--------------------------------------------
TABLE:
DB 0E7H,0D7H,0DBH,0DDH;7 8 9 F
DB 0B7H,0BBH,0BDH,077H;4 5 6 E
DB 07BH,07DH,0EBH,0EDH;1 2 3 D
DB 0EEH,0DEH,0BEH,07EH;0 A B C
DB 0FFH
;------------------可改表的须序来改变对应键的顺序--------------------------------------------
;TABLE:
; DB 077H,07BH,07DH,07EH ;0 1 2 3
; DB 0B7H,0BBH,0BDH,0BEH ;4 5 6 7
; DB 0D7H,0DBH,0DDH,0DEH ;8 9 A B
; DB 0E7H,0EBH,0EDH,0EEH ;C D E F
; DB 0FFH ;查表的结束标记
;--------------------delay 20 ms-----------------------
END
;------------------------------------------------------------------------
;KEY_SCAN:
; MOV KEY_PORT,#0FH ;置高4位为低电平,低四位为输入
; MOV A,KEY_PORT ;保存键码
; CJNE A,#0FH,KEY1 ;有键按下就到KEY1
; JMP OUT
;KEY1:
; CALL DL20MS ;去抖
; MOV A,KEY_PORT ;再次读键码
; CJNE A,#0FH,KEY2 ;是否有键按下
; JMP OUT
;KEY2:
; MOV KEY_PORT,#0F0H ;置低四位为低电平,高四位为输入
; MOV B,KEY_PORT ;保存键码
;KEY3:
; ORL A,B ;将两次的键码合并为1B的键码并放在A中
;----------------------------查表-----------------------------------------
; MOV B,A ;保存键码于B中
; MOV DPTR,#TABLE ;取表首地址
; MOV R3,#00H ;存顺序码单元初始化
;KEY4:
; MOV A,R3
; MOVC A,@A+DPTR
; CJNE A,B,KEY5 ;判键码,求顺序码
; MOV A,R3 ;若找到键码,存顺序码
; JMP OUT
;KEY5:
; INC R3 ;指向表的下一个
; CJNE R3,#16,KEY4 ;判断是否查完
;OUT: RET
;-------------------------KEY_SCAN---------------------------
;采用行送低电平,列设输入,读列值
;列送低电平,行设为输入,读行值,
;最后得到按键对应唯一的代码,优点:可识别多键同时按下的情况
;------------------------------------------------------------
;KB_PORT EQU P1
;KEY_CODE EQU 30H
;
;KEY_SCAN:
; MOV KEY_CODE,#0
; MOV KB_PORT,#0FH
; MOV A,KB_PORT
; ANL A,#0FH
; CJNE A,#0FH,SAV1
; JMP OUT ;若无键按下,退出
;SAV1: MOV KEY_CODE,A ;保存
;
; CALL DELAY ;去抖动
;
; MOV KB_PORT,#0F0H
; MOV A,KB_PORT
; ANL A,#0F0H
; CJNE A,#0F0H,SAV2 ;若无键按下,退出
; JMP OUT
;SAV2:
; ORL A,KEY_CODE ;得到8位键盘码
; MOV KEY_CODE,A ;保存8位键盘码
;OUT: RET
;---------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -