📄 键盘.asm
字号:
ORG 0000H
JMP MAIN
MAIN: MOV SP,#4FH
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
MOV 44H,#00H
MOV 45H,#00H
MOV 46H,#00H
MOV 47H,#00H
KEY_SCAN1: ;识别键盘有无键按下子程序
MOV P2,#0F0H ;置列线为0,行线为1
MOV A,P2 ;读P2口
ANL A,#0F0H ;取出高四位
MOV B,A ;暂存到B
MOV P2,#0FH ;置列线为1,行线为0
MOV A,P2 ;读P2口
ANL A,#0FH ;取出低四位
ORL A,B ;高四位与低四位逻辑或运算重新组合
CJNE A,#0FFH,KEY_IN1_1 ;0FFH为无按键按下
JMP KEY_SCAN1
KEY_IN1_1: ;识别具体按键值子程序
MOV B,A ;将按键的特征编码暂存于B
MOV DPTR,#KEY_TABLE
MOV R3,#0FFH
KEY_IN1_2:
INC R3 ;顺序码加1
MOV A,R3
MOVC A,@A+DPTR ;查表
CJNE A,B,KEY_IN1_3 ;比较,若相同则找到按键的特征编码。
MOV A,R3 ;找到特征编码后,取顺序码
MOV 43H,A ;存入43H单元
CALL DISPLAYKEY_1
MOV 42H,43H
MOV 43H,#0AH
CJNE R3,#10,KEY_SCAN2 ;输入是否结束
JMP EXIT
KEY_IN1_3:
CJNE A,#00H,KEY_IN1_2 ;末完,继续查
;CALL KEY_PLAER1
JMP KEY_SCAN1 ;00H为结束码
KEY_SCAN2: ;识别键盘有无键按下子程序
MOV P2,#0F0H ;置列线为0,行线为1
MOV A,P2 ;读P2口
ANL A,#0F0H ;取出高四位
MOV B,A ;暂存到B
MOV P2,#0FH ;置列线为1,行线为0
MOV A,P2 ;读P2口
ANL A,#0FH ;取出低四位
ORL A,B ;高四位与低四位逻辑或运算重新组合
CJNE A,#0FFH,KEY_IN2_1 ;0FFH为无按键按下
JMP KEY_SCAN2
KEY_IN2_1: ;识别具体按键值子程序
MOV B,A ;将按键的特征编码暂存于B
MOV DPTR,#KEY_TABLE
MOV R3,#0FFH
KEY_IN2_2:
INC R3 ;顺序码加1
MOV A,R3
MOVC A,@A+DPTR ;查表
CJNE A,B,KEY_IN2_3 ;比较,若相同则找到按键的特征编码。
MOV A,R3 ;找到特征编码后,取顺序码
MOV 43H,A ;存入43H单元
CJNE R3,#10,OUT2 ;输入是否结束
MOV 43H,42H
MOV 42H,#0AH
MOV 41H,#0AH
JMP EXIT
OUT2:
CALL DISPLAYKEY_1
MOV 41H,42H
MOV 42H,43H
MOV 43H,#0AH
JMP KEY_SCAN3
KEY_IN2_3:
CJNE A,#00H,KEY_IN2_2 ;末完,继续查
;CALL KEY_PLAER1
JMP KEY_SCAN2 ;00H为结束码
KEY_SCAN3: ;识别键盘有无键按下子程序
MOV P2,#0F0H ;置列线为0,行线为1
MOV A,P2 ;读P2口
ANL A,#0F0H ;取出高四位
MOV B,A ;暂存到B
MOV P2,#0FH ;置列线为1,行线为0
MOV A,P2 ;读P2口
ANL A,#0FH ;取出低四位
ORL A,B ;高四位与低四位逻辑或运算重新组合
CJNE A,#0FFH,KEY_IN3_1 ;0FFH为无按键按下
JMP KEY_SCAN3
KEY_IN3_1: ;识别具体按键值子程序
MOV B,A ;将按键的特征编码暂存于B
MOV DPTR,#KEY_TABLE
MOV R3,#0FFH
KEY_IN3_2:
INC R3 ;顺序码加1
MOV A,R3
MOVC A,@A+DPTR ;查表
CJNE A,B,KEY_IN3_3 ;比较,若相同则找到按键的特征编码。
MOV A,R3 ;找到特征编码后,取顺序码
MOV 43H,A ;存入43H单元
CJNE R3,#10,OUT3 ;输入是否结束
MOV 43H,42H
MOV 42H,41H
MOV 41H,#0AH
JMP EXIT
OUT3: CALL DISPLAYKEY_1
JMP EXIT
KEY_IN3_3:
CJNE A,#00H,KEY_IN3_2 ;末完,继续查
;CALL KEY_PLAER1
JMP KEY_SCAN3 ;00H为结束码
EXIT:
NOP
NOP
LOOP: CALL DISPLAYKEY_2
JMP LOOP
;====================================================
;键值显示子程序
;====================================================
DISPLAYKEY_1: MOV R1,#40H
MOV R5,#07FH
PLAY_1: MOV A,R5
MOV P0,#0FFH
MOV P1,A
MOV A,@R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
CALL DELAY1
INC R1
MOV A,R5
JNB ACC.0,ENDOUT_1
RR A
MOV R5,A
JMP PLAY_1
ENDOUT_1: MOV P1,#0FFH
MOV P0,#0FFH
RET ;显示完成,返回
DISPLAYKEY_2:MOV R1,#40H
MOV R5,#07FH
PLAY_2: MOV A,R5
MOV P0,#0FFH
MOV P1,A
MOV A,@R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
CALL DL1MS
INC R1
MOV A,R5
JNB ACC.0,ENDOUT_2
RR A
MOV R5,A
JMP PLAY_2
ENDOUT_2: MOV P1,#0FFH
MOV P0,#0FFH
RET ;显示完成,返回
;;晶振12MHZ,延时0.25秒
DELAY1:MOV 72H,#100
LOOP1_3:MOV 71H,#100
LOOP1_1:MOV 70H,#10
LOOP1_0:DJNZ 70H,LOOP1_0
DJNZ 71H,LOOP1_1
MOV 70H,#46
LOOP1_2:DJNZ 70H,LOOP1_2
NOP
DJNZ 72H,LOOP1_3
MOV 70H,#48
LOOP1_4:DJNZ 70H,LOOP1_4
RET
;;晶振12MHZ,延时1秒
DELAY2:MOV 72H,#100
LOOP2_3:MOV 71H,#100
LOOP2_1:MOV 70H,#47
LOOP2_0:DJNZ 70H,LOOP2_0
NOP
DJNZ 71H,LOOP2_1
MOV 70H,#46
LOOP2_2:DJNZ 70H,LOOP2_2
NOP
DJNZ 72H,LOOP2_3
MOV 70H,#48
LOOP2_4:DJNZ 70H,LOOP2_4
RET
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
; 特征编码与顺序编码的对应关系表
KEY_TABLE:DB 07DH ;0 顺序码
DB 0EEH,0EDH,0EBH ;1,2,3 顺序码
DB 0DEH,0DDH,0DBH ;4,5,6 顺序码
DB 0BEH,0BDH,0BBH ;7,8,9 顺序码
DB 077H ;D 输入结束确认
DB 00H ;结束码
TABLE:DB 03H,9FH,25H,0DH,99H,49H,41H,01FH,01H,09H,0FFH ;0--9,"全灭"
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -