📄 get_key.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 + -