keyscan.asm
来自「51单片机用汇编实例 包括ad」· 汇编 代码 · 共 135 行
ASM
135 行
;==============================================================
; 文件名称: KeyScan.Asm
; 功能描述: 8255扩展IO, 完成键盘及数码管显示实验.
; 按下按键, 数码管显示相应键值.
;==============================================================
A_8255 EQU 7F00H ;8255端口定义
B_8255 EQU 7F01H
C_8255 EQU 7F02H
CON_8255 EQU 7F03H
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV 50H,#00H ;键值缓冲清0
MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
MOV 55H,#00H
MOV R5, #55H
MOV A, #81H
MOV DPTR, #CON_8255 ;8255控制端口
MOVX @DPTR, A ;写入控制字
BEGIN: LCALL DIS ;调用显示子程序
LCALL CLEAR ;清屏
LCALL CCSCAN ;调用键扫子程序
JNZ INK1 ;判是否有键按下
LJMP BEGIN
INK1: LCALL DIS
LCALL DL1MS ;消除按键抖动
LCALL DL1MS
LCALL CLEAR
LCALL CCSCAN
JNZ INK2
AJMP BEGIN
INK2: MOV R2,#0FEH
MOV R4,#00H ;从第0列开始扫描
COLUM: MOV DPTR,#A_8255
MOV A,R2
MOVX @DPTR,A ;写入列扫描值
MOV DPTR, #C_8255
MOVX A,@DPTR
JB ACC.0,LINE1 ;判第0行的值
MOV A,#00H ;第0行
AJMP KCODE
LINE1: JB ACC.1,LINE2
MOV A,#04H ;第1行
AJMP KCODE
LINE2: JB ACC.2,LINE3
MOV A,#08H ;第2行
AJMP KCODE
LINE3: JB ACC.3,NEXT
MOV A, #0CH ;第3行
KCODE: ADD A,R4 ;得到键值
ACALL PUTBUF
PUSH ACC
KON: ACALL DIS
ACALL CLEAR
ACALL CCSCAN
JNZ KON
POP ACC
NEXT: INC R4
MOV A,R2
JNB ACC.4,KERR
RL A
MOV R2,A
AJMP COLUM
KERR: AJMP BEGIN
CCSCAN: MOV DPTR,#A_8255 ;按键扫描
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#C_8255
MOVX A,@DPTR
CPL A ;取反
ANL A,#0FH
RET
CLEAR: MOV DPTR, #B_8255 ;清屏
MOV A,#00H
MOVX @DPTR,A
RET
DIS: PUSH ACC ;显示子程序
PUSH 00H
PUSH 03H
MOV R0,#50H ;显示缓冲首地址
MOV R3,#0DFH ;显示扫描值
AGAIN: MOV A,#0FFH ;关闭显示
MOV DPTR,#A_8255
MOVX @DPTR,A
MOV A,@R0
MOV DPTR,#DSEGS ;数码管段表地址
MOVC A,@A+DPTR ;查表
MOV DPTR,#B_8255 ;送段显示
MOVX @DPTR,A
MOV A,R3
MOV DPTR,#A_8255
MOVX @DPTR,A
ACALL DL1MS
INC R0 ;显示缓冲加1
MOV A,R3
JNB ACC.0,OUT ;扫描结束否
RR A ;向右移一位
MOV R3,A
AJMP AGAIN
OUT: POP 03H
POP 00H
POP ACC
RET
;数码管段显示值
DSEGS: DB 03FH, 06H,05BH,04FH,066H,06DH,07DH, 07H
DB 07FH,06FH,077H,07CH,039H,05EH,079H,071H
DL1MS: MOV R7,#01H
DL0: MOV R6,#080H
DL1: DJNZ R6,DL1
DJNZ R7,DL0
RET
PUTBUF: PUSH 00H ;保存键值到缓冲RAM中
PUSH ACC
MOV A,R5
MOV R0,A
POP ACC
MOV @R0,A
DEC R5
CJNE R5,#04FH,GOBACK
MOV R5,#55H ;重置缓冲地址
GOBACK: POP 00H
RET
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?