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

📄 get_key.asm

📁 周立功开发板源代码,里面包含了各种关于周立功dp51开发板的源代码
💻 ASM
字号:
;*******************************Copyright (c)********************************
;**                 广州周立功单片机发展有限公司研究所
;**                        http://www.zlgmcu.com
;********************************文件信息*************************************
;文件名:Get_Key.asm
;功能:使用DP-51S实验仪学习键盘扫描、检测即处理的程序设计方法
;说明:
;1.检测键盘KL1~KL8并判断其键值
;2.根据键值的不同,使用散转程序执行相应的服务子程序
;3.正确设置跳线JP1使P1.0~P1.7分别与LKBIT1~KBIT7\KEY_REC相连,即把跳线置于下端
;4.注意体会软件实现的键盘去抖动的方法
;最后修改时间:2003年3月21
;*************************************************************************
LED_ADDR	EQU		2000H			;定义键盘、数码管操作地址	
DATA_BUF	DATA	30H				;定义显示缓冲区首地址
DATA_SL		DATA	37H

		ORG		8000H				;伪指令,指定程序从8000H开始存放
		AJMP	MAIN				;跳转指令,程序跳转到MAIN处

		ORG		8100H				;伪指令,指定以下程序从8100H开始存放
MAIN:
		MOV	SP,#60				;给堆栈指针赋初值
		MOV	DATA_BUF,#0DH		;数据"d"
		MOV	DATA_BUF+1,#12H		;数据"P"
		MOV	DATA_BUF+2,#10H		;数据"-"	
		MOV	DATA_BUF+3,#05H		;数据"5"
		MOV	DATA_BUF+4,#01H		;数据"1"
		MOV	DATA_BUF+5,#05H		;数据"S"

ON_PROG:
		ACALL	DISPLAY				;调显示子程序
		ACALL	GET_KEY				;调键盘扫描、检测子程序
		MOV	A,R1					;读取键值
		ANL		A,#0F0H
		CJNE	A,#00H,ON_PROG		;判断此次按键是否有效
		MOV	A,R1					;有效,键值送A保存
		ACALL	KEY_PROG			;调键盘服务子程序
		AJMP	ON_PROG

;*****************************************************************
;键盘服务子程序,利用散转的方法根据键值的不同执行相应的服务程序。
;*****************************************************************
KEY_PROG:
		MOV	DPTR,#K_PROG
		MOV	B,#03H
		MUL		AB
		JMP		@A+DPTR
K_PROG:								;散转	处理
		LJMP	K_PROG0
		LJMP	K_PROG1
		LJMP	K_PROG2
		LJMP	K_PROG3
		LJMP	K_PROG4
		LJMP	K_PROG5
		LJMP	K_PROG6
		LJMP	K_PROG7
K_PROG0:							;用户处理程序0
		MOV	DATA_BUF+5,#00H		;数据"0"
		;USER	PRO_CODE
		LJMP	KEY_RET
K_PROG1:							;用户处理程序1
		MOV	DATA_BUF+5,#01H		;数据"1"
		;USER	PRO_CODE
		LJMP	KEY_RET
K_PROG2:							;用户处理程序2
		MOV	DATA_BUF+5,#02H		;数据"2"
		;USER	PRO_CODE
		LJMP	KEY_RET
K_PROG3:							;用户处理程序3
		MOV	DATA_BUF+5,#03H		;数据"3"
		;USER	PRO_CODE
		LJMP	KEY_RET
K_PROG4:							;用户处理程序4
		MOV	DATA_BUF+5,#04H		;数据"4"
		;USER	PRO_CODE
		LJMP	KEY_RET
K_PROG5:							;用户处理程序5
		MOV	DATA_BUF+5,#05H		;数据"5"
		;USER	PRO_CODE
		LJMP	KEY_RET
K_PROG6:							;用户处理程序6
		MOV	DATA_BUF+5,#06H		;数据"6"
		;USER	PRO_CODE
		LJMP	KEY_RET
K_PROG7:							;用户处理程序7
		MOV	DATA_BUF+5,#07H		;数据"7"
		;USER	PRO_CODE
KEY_RET:
		RET

;*******************************************
;键盘扫描、检测子程序
;若键按下,R1返回键值,无键按下R1返回0FFH
;*******************************************
GET_KEY:
		MOV	P1,#0FFH				;P1口置高电平
		MOV	DPTR,#LED_ADDR
		MOV	A,#00
		MOVX	@DPTR,A				;输出扫描信号
		MOV	R1,#0FFH				;给键值寄存器赋初置
		JB		P1.7,KEY_NEXT		;判断是否有键按下?
		ACALL	DELAY				;延时去抖动
		MOV	DPTR,#LED_ADDR		;键盘操作地址送DPTR
		MOV	R7,#08H				;给扫描键值寄存器赋初值
		MOV	DATA_SL,#0FEH		;扫描初值
		MOV	R1,#00H
KEY_UP:
		MOV	A,DATA_SL
		MOVX	@DPTR,A				;输出扫描信号
		JNB		P1.7,KEY_NEXT		;是否是该键按下?
		INC		R1					;否,则扫描下一位键盘
	RL		A
		MOV	DATA_SL,A			;更新键盘扫描值
		DJNZ	R7,KEY_UP
		MOV	R1,#0FFH
KEY_NEXT:
		RET

;***********************
;LED数码管显示子程序
;***********************
DISPLAY:
		MOV	R7,#06H				;给R7赋初值,存放数码管的个数
		MOV	R0,#DATA_BUF			;把显示缓冲区首地址送R0
		MOV	DATA_SL,#0FEH
LOOP:
		MOV	A,@R0				;取若显示的数据
		ACALL	TABLE				;查段码表,得出该数据对应的段码
		MOV	DPTR,#LED_ADDR		;LED数码管地址送DPTR
		MOVX	@DPTR,A
		MOV	A,DATA_SL			;位码送A
		MOV	P1,A					;输出位码
		ACALL	DELAY				;调延时子程序
		MOV	P1,#0FFH				;输出位码
		Rl		A					;取下一个数码管
		MOV	DATA_SL,A			;保存该位码值
		INC		R0					;取下一个数据显示
		DJNZ	R7,LOOP				;6位数据显示完否?
		RET

;**************
;延时子程序
;**************
DELAY:	
		MOV	R6,#10H
DELAY0:	MOV	R5,#40H
DELAY1:	DJNZ	R5,DELAY1
		DJNZ	R6,DELAY0
		RET

;查表子程序
TABLE:  	INC		A	    		      	;基地址加一
        	MOVC	A,       @A+PC    	;查段码表,取其相应的段码
        	RET

DB     	0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,80H,090H	;0-9的段码
DB		088H,083H,0c6H,0a1H,86H,8eH,0bfH,89H,8cH			;A-F、-、P的段码
		;
		END

⌨️ 快捷键说明

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