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