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 + -
显示快捷键?