⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.asm

📁 程序功能:在单片机教学实验仪的MCU#3上 对矩阵按键进行扫描检测
💻 ASM
字号:
;********************************************************
;*程序功能:在单片机教学实验仪的MCU#3上			*
;*对矩阵按键进行扫描检测,将检测到的键号		*
;*以移位的形式显示在8个数码管上				*
;*							*	
;********************************************************

	ORG 0000H
	JMP	MAIN
;==================================
;RAM区变量定义

	UP_DOWN	BIT	00	;键状态指示,0按下,1弹起
	
	DISBUF	EQU	30H	;显示参数传递
	POSIT	EQU	38H	;位选
	KEYBUF	EQU	39H	;键码暂存
	KEYTEMP	EQU	40H	;暂存待确定的扫描码
;===================================
;主函数
	ORG	0030H
MAIN:
	SETB	UP_DOWN		;初始设置为弹起态
	MOV	DISBUF,#01H	;在第1个数码管上显示  1
	MOV	DISBUF+1,#02H	;在第2个数码管上显示  2
	MOV	DISBUF+2,#03H	;在第3个数码管上显示  3
	MOV	DISBUF+3,#04H	;在第4个数码管上显示  4
	MOV	DISBUF+4,#10H	;在第5个数码管上显示  -
	MOV	DISBUF+5,#11H	;在第6个数码管上显示  消隐
	MOV	DISBUF+6,#0AH	;在第7个数码管上显示  A
	MOV	DISBUF+7,#0FH	;在第8个数码管上显示  F
LOP:	
	CALL	KEY		;查键
	CALL	DISPLAY		;显示
	JMP	LOP

;==================================
;8路数码管驱动			;程序说明参见  TIME.ASM
DISPLAY:	
	MOV	POSIT,#01H
	MOV	DPTR,#DISCODE
	MOV	R0,#DISBUF
DISLOOP:
	MOV	A,@R0
	MOVC	A,@A+DPTR
	MOV	P0,A
	SETB	P1.3
	CLR	P1.3
	MOV	P0,POSIT
	SETB	P1.2
	CLR	P1.2
	CALL	DELAY
	MOV	P0,#00H
	SETB	P1.2
	CLR	P1.2
	MOV	A,POSIT		
	RL	A
	MOV	POSIT,A
	INC	R0
	CJNE	R0,#POSIT,DISLOOP	;8个欲显示的数是否
	RET				;显示完毕,返回
;=============================
;数码管移位
POSI_CH:
	MOV	R0,#DISBUF
	MOV	R1,#DISBUF+1		;将DISBUF中的数,从高位到低位
UU:					;依次覆盖
	MOV	A,@R1			;然后将得到的最新键植
	MOV	@R0,A			;装入DISBUF+7
	INC	R0
	INC	R1
	CJNE	R0,#POSIT,UU
	MOV	R1,#POSIT-1
	MOV	A,R7
	MOV	@R1,A
	RET
;================================
DELAY:
	MOV	R3,#0FH
LOOP:	DJNZ	R3,LOOP	
	NOP
	RET
;===================================
KEY_SCAN:
	MOV	P2,#0FH			;列扫描
	MOV	KEYBUF,P2
	MOV	P2,#0F0H		;行扫描
	MOV	A,P2
	ORL	A,KEYBUF		;将最新的扫描码放在A中
	RET
;===================================
KEY:
	JB	UP_DOWN,KEY_DOWN_CHECH	;检测当前按键的状态,若为按下状态,则检测键按下
	JMP	KEY_UP_CHECH		;若为按下状态,则检测键弹起
KEY_DOWN_CHECH:
	CALL	KEY_SCAN
	CJNE	A,#0FFH,KEY_CHECH	;有键按下否?
	JMP	KEY_END			;没有,返回主函数
KEY_CHECH:
	CALL	KEY_SCAN
	MOV	KEYTEMP,A		;存放最新的扫描码以被确认
	CALL	DELAY_KEY		;有,延时去抖
	CALL	KEY_SCAN		;重新检测键状态
	CJNE	A,KEYTEMP,KEY_END	;如和上次扫描的一样,说明确实有键按下
KEY_DOWN:
	MOV	DPTR,#KEYCODE		;将对应的键码与得到的码值
	CALL	KEY_SCAN		;比较,找到相应的键号
	MOV	KEYBUF,A
	MOV	R7,#0H
KEYSUR:
	CJNE	R7,#10H,KEYSUR1		;为防止干扰而得到错误的键号
	CLR	UP_DOWN			;只对键号码表进行16次比对,找不到
	JMP	KEY_END			;也要终止比较
KEYSUR1:
	MOV	A,R7
	MOVC	A,@A+DPTR
	CJNE	A,KEYBUF,KKK
	CALL	POSI_CH			;经过比对找到相应的键号,放在R7中返回
	CLR	UP_DOWN			;给出当前按键状态
	JMP	KEY_END
KKK:
	INC	R7
	JMP	KEYSUR
	JMP	KEY_END
KEY_UP_CHECH:				;按键弹起检测
	CALL	KEY_SCAN
	CJNE	A,#0FFH,KEY_END
	SETB	UP_DOWN			;给出当前按键状态
KEY_END:
	RET
;===================================
DELAY_KEY:
	MOV	R3,#0FH
L1:	MOV	R7,#0FFH
L2:	DJNZ	R7,L2
	DJNZ	R3,L1
	RET		
;===================================
;共阳数码管码表
DISCODE:  DB 	0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
	  ;	  0   1     2    3   4   5   6    7   8   9
	  DB	88H,83H,0C6H,0A1H,86H,08EH,0BFH,0FFH,0F7H
          ;	 A   B    C   D    E    F   -    消隐  _
;===================================
;扫描键码		
KEYCODE:  DB	0DEH,0E7H,0D7H,0B7H,0EBH,0DBH,0BBH
	   ;     0     1     2   3    4     5   6   
	  DB	0EDH,0DDH,0BDH,77H,7BH,07DH,07EH,0EEH,0BEH	
	   ;     7     8    9    A   B   C   D     *    #     
	END 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -