📄 key.lst
字号:
A51 MACRO ASSEMBLER KEY 09/16/2006 15:20:16 PAGE 1
MACRO ASSEMBLER A51 V7.08a
OBJECT MODULE PLACED IN key.OBJ
ASSEMBLER INVOKED BY: D:\Keil\C51\BIN\A51.EXE key.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;*****************************************************************
2 ;*
3 ;* 程序功能 : 4×4矩阵式键盘识别技术
4 ;*
5 ;* 应用软件 : KEIL C
6 ;*
7 ;* 版 本 : KEIL 7.06
8 ;*
9 ;******************************************************************
10 ;* 注:为了有更多实用的实验程序供大家学习,部分程序参考网上的资源,
11 ;* 在此谢谢这些无私奉献的朋友!!!
12 ;******************************************************************
13 ; 0 1 2 3 ---P20
14 ; 4 5 6 7 ---P21
15 ; 8 9 10 11 ---P22
16 ; 12 13 14 15 ---P23
17 ; | | | |
18 ; P24 P25 P26 P27
19 ;******************************************************************
20
0000 21 ORG 0000h
0000 0130 22 AJMP MAIN
0030 23 ORG 0030h
0030 24 MAIN:
0030 90009D 25 MOV DPTR,#TAB ;将表头放入DPTR
0033 12003E 26 LCALL KEY ;调用键盘扫描程序
0036 93 27 MOVC A,@A+DPTR ;查表后将键值送入ACC
0037 F580 28 MOV P0,A ;将Acc值送入P0口
0039 C293 29 CLR P1.3 ;开显示
003B 020030 30 LJMP MAIN ;返回调用子程序反复循环显示
31
32 ;----------------------------------------------------------------------
003E 33 KEY:
003E 12008C 34 LCALL KS ;调用检测按键子程序
0041 7005 35 JNZ K1 ;有键按下继续
0043 120094 36 LCALL DELAY2 ;无键按下调用延时去抖动程序
0046 013E 37 AJMP KEY ;返回继续检测有无按键按下
0048 38 K1:
0048 120094 39 LCALL DELAY2
004B 120094 40 LCALL DELAY2 ;有键按下继续延时去抖动
004E 12008C 41 LCALL KS ;再一次调用检测按键程序
0051 7002 42 JNZ K2 ;确认有按下进行下一步
0053 013E 43 AJMP KEY ;无键按下返回继续检测
0055 44 K2:
0055 7AEF 45 MOV R2,#0EFH ;将扫描值送入 R2暂存
0057 7C00 46 MOV R4,#00H ;将第一列的列值00H送入R4暂存,R4用于存放列值。
0059 47 K3:
0059 8AA0 48 MOV P2,R2 ;将R2的值送入P1口
005B 49 L6:
005B 20A004 50 JB P2.0,L1 ;P1.0等于1跳转到L1
005E 7400 51 MOV A,#00H ;将第一行的行值00H送入ACC
0060 0175 52 AJMP LK ;跳转到键值处理程序
0062 53 L1:
0062 20A104 54 JB P2.1,L2 ;P1.1等于1跳转到L2
0065 7404 55 MOV A,#04H ;将第二行的行值送入ACC
0067 0175 56 AJMP LK ;跳转到键值理程序进行键值处理
0069 57 L2:
A51 MACRO ASSEMBLER KEY 09/16/2006 15:20:16 PAGE 2
0069 20A204 58 JB P2.2,L3 ;P1.2等于1跳转到L3
006C 7408 59 MOV A,#08H ;将第三行的行值送入ACC
006E 0175 60 AJMP LK ;跳转到键值处理程序
0070 61 L3:
0070 20A310 62 JB P2.3,NEXT ;P1.3等于1跳转到NEXT处
0073 740C 63 MOV A,#0cH ;将第四行的行值送入ACC
0075 64 LK:
0075 2C 65 ADD A,R4 ;行值与列值相加后的键值送入A
0076 C0E0 66 PUSH ACC ;将A中的值送入堆栈暂存
0078 67 K4:
0078 120094 68 LCALL DELAY2 ;调用延时去抖动程序
007B 12008C 69 LCALL KS ;调用按键检测程序
007E 70F8 70 JNZ K4 ;按键没有松开继续返回检测
0080 D0E0 71 POP ACC ;将堆栈的值送入ACC
0082 22 72 RET
73
0083 74 NEXT:
0083 0C 75 INC R4 ;将列值加一
0084 EA 76 MOV A,R2 ;将R2的值送入A
0085 30E7B6 77 JNB ACC.7,KEY ;扫描完成跳至KEY处进行下一回合的扫描
0088 23 78 RL A ;扫描未完成将A中的值右移一位进行下一列的扫描
0089 FA 79 MOV R2,A ;将ACC的值送入R2暂存
008A 0159 80 AJMP K3 ;跳转到K3继续
008C 81 KS:
008C 75A00F 82 MOV P2,#0FH ;将P1口高四位置0低四位值1
008F E5A0 83 MOV A,P2 ;读P1口
0091 640F 84 XRL A,#0FH ;将A中的值与A中的值相异或
0093 22 85 RET ;子程序返回
0094 86 DELAY2: ;40ms延时去抖动子程序8*FA*2=40ms
0094 7D08 87 MOV R5,#08H
0096 88 L7:
0096 7EFA 89 MOV R6,#0FAH
0098 90 L8:
0098 DEFE 91 DJNZ R6,L8
009A DDFA 92 DJNZ R5,L7
009C 22 93 RET
94
009D 95 tab:
009D C0 96 DB 0C0H;0
009E F9 97 DB 0F9H;1
009F A4 98 DB 0A4H;2
00A0 B0 99 DB 0B0H;3
00A1 99 100 DB 099H;4
00A2 92 101 DB 092H;5
00A3 82 102 DB 082H;6
00A4 F8 103 DB 0F8H;7
00A5 80 104 DB 080H;8
00A6 90 105 DB 090H;9
00A7 88 106 DB 088H;A
00A8 83 107 DB 083H;b
00A9 C6 108 DB 0C6H;C
00AA A1 109 DB 0A1H;d
00AB 86 110 DB 086H;E
00AC 8E 111 DB 08EH;F
112
113 END
A51 MACRO ASSEMBLER KEY 09/16/2006 15:20:16 PAGE 3
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ACC. . . . . . . . D ADDR 00E0H A
DELAY2 . . . . . . C ADDR 0094H A
K1 . . . . . . . . C ADDR 0048H A
K2 . . . . . . . . C ADDR 0055H A
K3 . . . . . . . . C ADDR 0059H A
K4 . . . . . . . . C ADDR 0078H A
KEY. . . . . . . . C ADDR 003EH A
KS . . . . . . . . C ADDR 008CH A
L1 . . . . . . . . C ADDR 0062H A
L2 . . . . . . . . C ADDR 0069H A
L3 . . . . . . . . C ADDR 0070H A
L6 . . . . . . . . C ADDR 005BH A
L7 . . . . . . . . C ADDR 0096H A
L8 . . . . . . . . C ADDR 0098H A
LK . . . . . . . . C ADDR 0075H A
MAIN . . . . . . . C ADDR 0030H A
NEXT . . . . . . . C ADDR 0083H A
P0 . . . . . . . . D ADDR 0080H A
P1 . . . . . . . . D ADDR 0090H A
P2 . . . . . . . . D ADDR 00A0H A
TAB. . . . . . . . C ADDR 009DH A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -