📄 5io15key.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;塔式键盘,用5个IO,扩展15个按键,先扫描最右侧5个按键发0FFH,如无键按下再扫描其余十个按键
;;分别发0FEH,右移5次,建立一个特征值表TAB,用扫描到的特征值与表比较,比较次数即为对应按键
;;查表送P0显示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY EQU 40H ;键值
N EQU 41H ;5列,扫描5次
SIGN EQU 42H ;扫描信号,初始值为0FEH即11111110
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#50H
MOV N,#05H ;5列,左移5次
MOV SIGN,#0FEH ;从P2.0开始扫描
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;========================发全1判断接地5键是否按下=========================;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SCANKEY:
MOV P2,#0FFH ;扫描最右侧5个按键发11111111
MOV A,P2 ;读P2状态
CJNE A,#0FFH,KEY2 ;有键按下跳KEY3
LJMP KEY3 ;无键按下扫描其他10个按键
KEY2:
LCALL DELAY ;去抖
MOV P2,#0FFH
MOV A,P2
MOV R3,A ;特征值暂存R3
MOV R2,#00H ;比较次数赋初值
CJNE A,#0FFH,SCANNEXT ;再次扫描有键按下则比较
LJMP KEY3 ;无键按下扫描其他10个按键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;===========再判断其余10按键是否按下,分别置其中一列为0其余为1============;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY3:
MOV A,SIGN ;先判断其余10键是否按下,如有按下先消抖
MOV P2,A
MOV A,P2
CJNE A,SIGN,KEY4
LJMP KEY5
KEY4:
LCALL DELAY ;去抖
MOV A,SIGN ;发送扫描信号
MOV P2,A
MOV A,P2 ;读P2状态
MOV R3,A ;特征值暂存R3
MOV R2,#00H ;比较次数赋初值
CJNE A,SIGN,SCANNEXT ;再次扫描有键按下则比较
KEY5:
MOV A,SIGN
RL A
MOV SIGN,A ;扫描下一列
DJNZ N,KEY3 ;扫描5列
LJMP MAIN ;扫描完毕进行下一轮扫描
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;==========================用所得键值与TAB表比较==========================;;
;;===========================比较次数即为特征值============================;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SCANNEXT:
MOV A,R2
MOV DPTR,#TAB ;查表逐个比较
MOVC A,@A+DPTR
MOV KEY,A ;表中的内容暂存在KEY
MOV A,R3
CJNE A,KEY,KEY1 ;不相等则继续查找
LJMP DISPLAY
KEY1:
INC R2
LJMP SCANNEXT
DISPLAY: MOV A,R2
MOV DPTR,#DISCODE
MOVC A,@A+DPTR
MOV P0,A
LJMP MAIN
DELAY:
MOV R6,#2
D01: MOV R5,#25
NOP
D02: DJNZ R5,D02
DJNZ R6,D01
RET
TAB:
DB 0FEH ;1 11111110
DB 0FCH ;2 11111100
DB 0FDH ;3 11111101
DB 0FAH ;4 11111010
DB 0F9H ;5 11111001
DB 0FBH ;6 11111011
DB 0F6H ;7 11110110
DB 0F5H ;8 11110101
DB 0F3H ;9 11110011
DB 0F7H ;A 11110111
DB 0EEH ;B 11101110
DB 0EDH ;C 11101101
DB 0EBH ;D 11101011
DB 0E7H ;E 11100111
DB 0EFH ;F 11101111
DISCODE:
DB 03FH ;0
DB 006H ;1
DB 05BH ;2
DB 04FH ;3
DB 066H ;4
DB 06DH ;5
DB 07DH ;6
DB 007H ;7
DB 07FH ;8
DB 06FH ;9
DB 077H ;A
DB 07CH ;B
DB 039H ;C
DB 05EH ;D
DB 079H ;E
DB 071H ;F
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -