📄 file7.lst
字号:
PAGE 1
1: ; 这是 读取键盘的子程序
2: ; 主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法
3: ; 以及如何处理读入的键值
4: ; 思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反
5: ; 那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms
6: ; 消除干扰,然后,等待用户释放,否则,可能重复的到某种结果,发生意外情况
7: ;现象;我们按不同的按键,会用数码管在不同的位置显示不同的结果1/2/3来
8:
9:
10: B B7 beep bit p3.7 ; 蜂鸣器定义
11:
12: D 0080 segdata equ p0 ;数据 输出
13: B 00A7 sege equ p2.7 ;显示 选中
14: B 00A6 segb equ p2.6 ;位 选
15: B 00A5 segd equ p2.5 ;段 选
16:
17: B B3 key1 bit p3.3 ; 按键引脚定义
18: B B4 key2 bit p3.4 ;
19: B B5 key3 bit p3.5 ;
20: N 0046 key equ 46h ; 按键寄存单元
21:
22:
23: N 0000 org 00h
24: 0000 02 00 30 jmp main
25:
26: N 0030 org 030h
27:
28: 0030 75 81 30 main:mov sp,#30h ;首先定义
29: 0033 12 00 3E lcall REST ;初始化子程序
30: 0036 12 00 A7 lp:lcall pro_key ;调用键盘查询子程序
31: 0039 12 00 52 lcall KEYPR ;用来显示所查询到的键值
32: 003C 80 F8 jmp lp ;反复调用,不断查询
33:
34: 003E REST:
35: 003E 74 00 mov a,#00h
36: 0040 75 F0 00 mov b,#00h
37: 0043 75 80 00 mov p0,#0
38: 0046 85 FF 90 mov p1,0ffh
39: 0049 75 46 00 mov key,#00h
40: 004C 75 A0 FF mov p2,#255
41: 004F C2 B7 clr beep
42: 0051 22 RET
43:
44: 0052 E5 46 KEYPR: mov a,key ;键值在累加器KEY中
45: 0054 60 50 jz PROEND ;如果 A= 0,表示没有按键,返回
46: 0056 B4 01 1A cjne a,#1,k1 ; A= 1 ,用户按了第一个键
47: 0059 74 01 mov a,#1 ;处理 A = 1的情况
48: 005B 90 00 EB mov dptr,#tab_nu ;查表
49: 005E 93 movc a,@a+dptr
50:
51: 005F C2 A7 clr sege ;选中显示
52: 0061 F5 80 mov segdata,a ;显示 "1"
53: 0063 D2 A5 setb segd
54: 0065 00 nop
55: 0066 C2 A5 clr segd
56:
PAGE 2
57: 0068 75 80 01 mov segdata,#1 ;显示 "1"
58: 006B D2 A6 setb segb
59: 006D 00 nop
60: 006E C2 A6 clr segb
61:
62: 0070 02 00 A6 jmp PROEND ;处理完成,子程序返回
63: ;以下分别处理 KEY = 2,3 的情况
64: 0073 B4 02 18 k1: cjne a,#2,k2
65: 0076 74 02 mov a,#2
66: 0078 90 00 EB mov dptr,#tab_nu
67: 007B 93 movc a,@a+dptr
68: 007C F5 80 mov segdata,a ;显示 "2"
69: 007E D2 A5 setb segd
70: 0080 00 nop
71: 0081 C2 A5 clr segd
72:
73: 0083 75 80 02 mov segdata,#2 ;显示 "2"
74: 0086 D2 A6 setb segb
75: 0088 00 nop
76: 0089 C2 A6 clr segb
77:
78: 008B 02 00 A6 jmp PROEND
79: 008E B4 03 15 k2: cjne a,#3, PROEND
80: 0091 74 03 mov a,#3
81: 0093 90 00 EB mov dptr,#tab_nu
82: 0096 93 movc a,@a+dptr
83: 0097 F5 80 mov segdata,a ;显示 "3"
84: 0099 D2 A5 setb segd
85: 009B 00 nop
86: 009C C2 A5 clr segd
87:
88: 009E 75 80 04 mov segdata,#4 ;显示 "3"
89: 00A1 D2 A6 setb segb
90: 00A3 00 nop
91: 00A4 C2 A6 clr segb
92: 00A6 22 PROEND:ret
93:
94: 00A7 pro_key: ;键盘查询子程序
95: 00A7 D2 B3 setb key1 ;首先输出高电平,检测低电平的到来
96: 00A9 D2 B4 setb key2 ;不同电路,可能检测方式不一样
97: 00AB D2 B5 setb key3
98: 00AD 20 B3 08 jb key1,ke1 ;如果用户没有按第一个键,到第下个处理部分,
99: 00B0 75 46 01 mov key,#1 ;表示用户按了第一个键
100: 00B3 12 00 CF lcall delay20ms ;软件延时,防止干扰
101: 00B6 80 EF jmp pro_key ;重新查询,直到用户释放按键
102: 00B8 20 B4 08 ke1:jb key2,ke2 ;处理第二个按键,如果没有到下一个处理部分
103: 00BB 75 46 02 mov key,#2 ;以下和第一个处理单元相似。
104: 00BE 12 00 CF lcall delay20ms
105: 00C1 80 E4 jmp pro_key
106: 00C3 20 B5 08 ke2:jb key3,ke3
107: 00C6 75 46 03 mov key,#3
108: 00C9 12 00 CF lcall delay20ms
109: 00CC 80 D9 jmp pro_key
110: 00CE 22 ke3:ret
111: ;************ 定时20 ms *************
112: 00CF delay20ms:
113: 00CF C0 D0 push psw ; 保存原来的寄存器单元
114: 00D1 C2 D3 clr psw.3 ; 设置新的寄存器
PAGE 3
115: 00D3 C2 D4 clr psw.4 ;
116: 00D5 78 02 mov r0,#2 ; 延时参数1
117: 00D7 79 FA mov r1,#250 ; 延时参数2
118: 00D9 7A 01 mov r2,#1 ; 延时参数3
119: 00DB D8 FE dl1:djnz r0,dl1 ; 延时循环1
120: 00DD 78 FA mov r0,#250 ; 重新设置循环数据
121: 00DF D9 FA dl2:djnz r1,dl1 ; 开始第二道循环
122: 00E1 78 F0 mov r0,#240 ;
123: 00E3 79 F8 mov r1,#248 ;
124: 00E5 DA F4 dl3:djnz r2,dl1 ; 第三道循环
125: 00E7 00 nop ; 修正定时精度
126: 00E8 D0 D0 pop psw ; 恢复原来的寄存器组
127: 00EA 22 ret ; 返回
128: ;*********** end *******************
129:
130: ;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
131: ;比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推
132:
133: 00EB tab_nu:
134: 00EB C0 F9 A4 B0 db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ; 数字0-7 不带小数点代码
00EF 99 92 82 F8
135: 00F3 80 90 88 83 db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ; 数字8-f 不带小数点代码
00F7 C6 A1 86 8E
136: 00FB 40 79 24 30 db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ; 数字0-7 带小数点代码
00FF 19 12 02 78
137: 0103 00 10 08 03 db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ; 数字8-f 带小数点代码
0107 46 21 06 0E
138:
139: end ;告诉编译器本程序到此结束,一定需要加上,否则编译通不过。
140:
register banks used: ---
0 个错误
PAGE 4
L I S T O F S Y M B O L S
=============================
SYMBOL TYPE VALUE LINE
------------------------------------------------------------
AC BIT D6
ACC DATA E0
B DATA F0
BEEP BIT B7 10
CY BIT D7
DELAY20MS CODE 00CF 112
DL1 CODE 00DB 119
DL2 CODE 00DF 121
DL3 CODE 00E5 124
DPH DATA 83
DPL DATA 82
EA BIT AF
ES BIT AC
ET0 BIT A9
ET1 BIT AB
EX0 BIT A8
EX1 BIT AA
EXTI0 CODE 0003
EXTI1 CODE 0013
F0 BIT D5
IE DATA A8
IE0 BIT 89
IE1 BIT 8B
INT0 BIT B2
INT1 BIT B3
IP DATA B8
IT0 BIT 88
IT1 BIT 8A
K1 CODE 0073 64
K2 CODE 008E 79
KE1 CODE 00B8 102
KE2 CODE 00C3 106
KE3 CODE 00CE 110
KEY NUMBER 0046 20
KEY1 BIT B3 17
KEY2 BIT B4 18
KEY3 BIT B5 19
KEYPR CODE 0052 44
LP CODE 0036 30
MAIN CODE 0030 28
OV BIT D2
P BIT D0
P0 DATA 80
P1 DATA 90
P2 DATA A0
P3 DATA B0
PCON DATA 87
PROEND CODE 00A6 92
PRO_KEY CODE 00A7 94
PS BIT BC
PAGE 5
SYMBOL TYPE VALUE LINE
------------------------------------------------------------
PSW DATA D0
PT0 BIT B9
PT1 BIT BB
PX0 BIT B8
PX1 BIT BA
RB8 BIT 9A
RD BIT B7
REN BIT 9C
RESET CODE 0000
REST CODE 003E 34
RI BIT 98
RS0 BIT D3
RS1 BIT D4
RXD BIT B0
SBUF DATA 99
SCON DATA 98
SEGB NUMBER 00A6 14
SEGD NUMBER 00A5 15
SEGDATA NUMBER 0080 12
SEGE NUMBER 00A7 13
SINT CODE 0023
SM0 BIT 9F
SM1 BIT 9E
SM2 BIT 9D
SP DATA 81
T0 BIT B4
T1 BIT B5
TAB_NU CODE 00EB 133
TB8 BIT 9B
TCON DATA 88
TF0 BIT 8D
TF1 BIT 8F
TH0 DATA 8C
TH1 DATA 8D
TI BIT 99
TIMER0 CODE 000B
TIMER1 CODE 001B
TL0 DATA 8A
TL1 DATA 8B
TMOD DATA 89
TR0 BIT 8C
TR1 BIT 8E
TXD BIT B1
WR BIT B6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -