📄 键盘.asm
字号:
键盘子程序
;;;;;;;;;;;;;;;;;;;;;
INPUT_DATE EQU P1.2
INPUT_CLOCK EQU P1.3
CHECK_1 EQU P1.4
CHECK_2 EQU P3.3
DATE_6 EQU 55H ;替换R6
DATE_7 EQU 56H ;替换R7
;使用到寄存器R0,R1 作为间接寻址
ORG 0013H ;中断1的调用
LJMP LOOP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:
MOV R1,#09H ;
PACE: CLR INPUT_DATE ;初始化74LS164使它的Q0~Q7电位为0
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE
CLR RS1 ;选择工作寄存器组
CLR RS0
SETB IT1 ;设置为中断1为跳沿触发
SETB EA ;打开总中断开关
SETB EX1 ;打开中断1
CLR EX0
CLR ET0
CLR ET1
MOV SP,#60H
SJMP START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOP1: CLR EX1 ;关闭中断
MOV R0,#30H ;初始化R0
SETB CHECK_2 ;;为CHECK_2输入数据做准备
LCALL WAIT ;延时消抖
JB CHECK_2,STATION1 ;判断是否按下键
MOV R1,#09H
PACE5: SETB INPUT_DATE ;初始化74LS164使它的Q0~Q7电位为1
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE5
CLR A ;清零的目的是用A做计数
SETB CHECK_2 ;;为CHECK_2输入数据做准备
CLR INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
JNB CHECK_2,LOOP2 ;;;;;;;;;;;;JNB CHECK_2,LOOP2;;;;;;;;;;;;;;;
SETB CHECK_2 ;;为CHECK_2输入数据做准备
LOOP3:SETB INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
SETB CHECK_2 ;;为CHECK_2输入数据做准备
JNB CHECK_2,LOOP2
SJMP LOOP3
LOOP2: MOV DATE_6,A ;使用到DATE_6寄存器
XRL A,#08H ;功能键识别区
JZ KEY14
MOV A,DATE_6
XRL A,#01H ;功能区键识别按下的是数字键
JZ STATION1
MOV A,DATE_6
XRL A,#02H ;功能区键识别按下的是数字键
JZ STATION1
;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,DATE_6 ;此区跳往查表区
XRL A,#03H
JZ X1 ;跳往POCESS处理
MOV A,DATE_6
XRL A,#04H
JZ X2
MOV A,DATE_6
XRL A,#05H
JZ X3
MOV A,DATE_6
XRL A,#06H
JZ X4
MOV A,DATE_6
XRL A,#07H
JZ X5
STATION1:
MOV R1,#09H
PACE_1: CLR INPUT_DATE ;初始化74LS164使它的Q0~Q7电位为0
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE_1
RETI ;返回中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
X1:
RETI
X2:
RETI ;功能键区查表
X3:
RETI
X4:
RETI
X5:
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY14: SETB CHECK_2 ;;为CHECK_2输入数据做准备
JNB CHECK_2,KEY14 ;防止按下数据输入键不放
;LJMP SPEAKE ;;;;;;////////////////////
KEY0:
;此区为输录数字区
MOV R1,#09H
SETB CHECK_1
SETB CHECK_2
PACE1: CLR INPUT_DATE ;初始化74LS164使它的Q0~Q7电位为0
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE1
KEY1: SETB CHECK_1 ;;为CHECK_1输入数据做准备
SETB CHECK_2;;为CHECK_2输入数据做准备
JNB CHECK_1,KEY2 ;判断键区
JNB CHECK_2,KEY8 ;判断键区
SJMP KEY1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY2: LCALL WAIT ;延时消抖
SETB CHECK_1 ;为CHECK_1输入数据做准备
JB CHECK_1,KEY1 ;;;;;;;;;;;;;;;;;;;;;;;;;;
;LJMP SPEAKL ;;;;;;;;;;///////////////////////////
MOV R1,#09H
PACE2: SETB INPUT_DATE ;该区使74LS164使它的Q0~Q7电位为1
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE2
KEY3: CLR A ;数字键区扫描
SETB CHECK_1
CLR INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
SETB CHECK_1 ;为CHECK_1输入数据做准备
JNB CHECK_1,KEY17 ;跳往KEY17数字处理区(如果此时CHECK_1为0则A里的数为0)
CLR A
KEY4: SETB INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
SETB CHECK_1 ;为CHECK_1输入数据做准备
JNB CHECK_1,KEY17 ;跳往KEY17数字处理区
JB CHECK_1,KEY4
KEY17: SETB CHECK_1 ;为CHECK_1输入数据做准备
JNB CHECK_1,KEY17 ;防止手按在按键未放开
JB CHECK_1,KEY7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY8: SETB CHECK_2 ;为CHECK_2输入数据做准备
LCALL WAIT
JB CHECK_2,KEY1 ;;;;;;;;;;;;;;;;;;;;;;;
MOV R1,#09H
PACE3: SETB INPUT_DATE ;该区使74LS164使它的Q0~Q7电位为1
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE3
KEY9: MOV A,#08H ;功能键区数字键扫描
SETB CHECK_2
CLR INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
SETB CHECK_2 ;为CHECK_2输入数据做准备
JNB CHECK_2,KEY18 ;跳往KEY18按键处理区(如果此时CHECK_2为0则A里的数为0)
SETB INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
SETB CHECK_2 ;为CHECK_2输入数据做准备
JNB CHECK_2,KEY18
KEY20: SETB INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
SETB CHECK_2 ;为CHECK_2输入数据做准备
JNB CHECK_2,SAMSUNG
JB CHECK_2,KEY20
KEY21: LJMP KEY0 ;防止按下功能键区不是数字键
KEY18: SETB CHECK_2 ;为CHECK_2输入数据做准备
JNB CHECK_2,KEY18 ;防止手按在按键未放开
JB CHECK_2,KEY7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SAMSUNG: SETB CHECK_2 ;为CHECK_2输入数据做准备
JNB CHECK_2,SAMSUNG ;防止手按在按键未放开
JB CHECK_2,SAMSUNG10
SAMSUNG10:XRL A,#0FH ;判断停止输入数据;
JZ KEY13 ;判断停止输入数据;
JNZ KEY21 ;判断停止输入数据;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY7: CLR IE1 ;软件清除中断1请求标志位 (保险)
MOV @R0,A ;此时@R0里的数据就是所按的数字键代表的数字
INC R0 ;使R0指向下一字节
;LCALL LCM ;调用显示
MOV A,R0
XRL A,#38H ;防止益处///////////////
JZ KEY13
LJMP KEY0
KEY13: CLR IE1 ;软件清除中断1请求标志位 (保险)
MOV R1,#040H
MOV A,R0
KEY16: DEC R0
MOV A,@R0 ;倒序存放数据区
MOV @R1,A
INC R1
CJNE R0,#030H, KEY16
MOV R1,#09H
PACE_2: CLR INPUT_DATE ;初始化74LS164使它的Q0~Q7电位为0
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE_2
RETI ;返回中断
;;;;;;;;;;;;;;;;;;;;;;;
WAIT: MOV DATE_7,#142 ;延时子程序 (35.074ms)
WAIT1: MOV DATE_6,#122
WAIT2:DJNZ DATE_6,WAIT2
DJNZ DATE_7,WAIT1
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -