📄 wl010.lst
字号:
A51 MACRO ASSEMBLER WL010 12/02/2005 21:33:07 PAGE 1
MACRO ASSEMBLER A51 V7.09
OBJECT MODULE PLACED IN wl010.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE wl010.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ; /*******************************************************************************
2 ; * *
3 ; * File : wl010.asm *
4 ; * Date : 2004-11-5 *
5 ; * Version : 1.0 *
6 ; * *
7 ; ********************************************************************************
8 ; * Description: *
9 ; * 简易电子时钟 *
10 ; * AN1---时调整 *
11 ; * AN2---分调整 *
12 ; * *
13 ; * *
14 ; *******************************************************************************/
15 CODE_SEG SEGMENT CODE
16 DATA_SEG SEGMENT DATA
17 STACK_SEG SEGMENT IDATA
18
19
00B2 20 AN1 BIT P3.2
00B4 21 AN2 BIT P3.4
22
---- 23 RSEG DATA_SEG
0000 24 KEY_S: DS 1
0001 25 KEY_V: DS 1
0002 26 DIS_DIGIT: DS 1
0003 27 SEC: DS 1
0004 28 DIS_INDEX: DS 1
0005 29 HOUR: DS 1
0006 30 MIN: DS 1
0007 31 SEC100: DS 1
0008 32 DIS_BUF: DS 8
33
0008 34 BUF_HOUR_H EQU DIS_BUF ; 小时十位
0009 35 BUF_HOUR_L EQU DIS_BUF+1 ; 小时个位
000B 36 BUF_MIN_H EQU DIS_BUF+3 ; 分十位
000C 37 BUF_MIN_L EQU DIS_BUF+4 ; 分个位
000E 38 BUF_SEC_H EQU DIS_BUF+6 ; 秒十位
000F 39 BUF_SEC_L EQU DIS_BUF+7 ; 秒个位
40
---- 41 RSEG STACK_SEG
0000 42 STACK: DS 20
43
44
45 ;===============================================================================
46
---- 47 CSEG AT 0000H
0000 020000 F 48 JMP MAIN
49
---- 50 CSEG AT 0000BH
000B 020000 F 51 LJMP TIMER0
52
---- 53 CSEG AT 0001BH
001B 020000 F 54 LJMP TIMER1
55
56 ;===============================================================================
57
58
A51 MACRO ASSEMBLER WL010 12/02/2005 21:33:07 PAGE 2
---- 59 RSEG CODE_SEG
0000 60 MAIN:
61 USING 0
62
0000 758100 F 63 MOV SP, #(STACK-1) ;
64
65
0003 7580FF 66 MOV P0,#0FFH
0006 75A0FF 67 MOV P2,#0FFH
0009 758911 68 MOV TMOD,#011H ; 定时器0, 1工作模式1, 16位定时方式
000C 758CFC 69 MOV TH0,#0FCH
000F 758A17 70 MOV TL0,#017H
0012 758DDC 71 MOV TH1,#0DCH
0015 E4 72 CLR A
0016 F58B 73 MOV TL1,A
74
0018 75000C F 75 MOV HOUR,#12 ;
001B E4 76 CLR A ;
001C F500 F 77 MOV MIN,A
001E F500 F 78 MOV SEC,A
0020 F500 F 79 MOV SEC100,A
80
0022 E500 F 81 MOV A,HOUR
0024 75F00A 82 MOV B,#10
0027 84 83 DIV AB
0028 900000 F 84 MOV DPTR,#DIS_CODE
002B 93 85 MOVC A,@A+DPTR
002C F500 F 86 MOV BUF_HOUR_H,A ; 时十位
002E E500 F 87 MOV A,HOUR
0030 75F00A 88 MOV B,#10
0033 84 89 DIV AB
0034 E5F0 90 MOV A,B
0036 93 91 MOVC A,@A+DPTR
0037 F500 F 92 MOV BUF_HOUR_L,A ; 时个位
0039 E500 F 93 MOV A,MIN
003B 75F00A 94 MOV B,#10
003E 84 95 DIV AB
003F 93 96 MOVC A,@A+DPTR
0040 F500 F 97 MOV BUF_MIN_H,A ; 分十位
0042 E500 F 98 MOV A,MIN
0044 75F00A 99 MOV B,#10
0047 84 100 DIV AB
0048 E5F0 101 MOV A,B
004A 93 102 MOVC A,@A+DPTR
004B F500 F 103 MOV BUF_MIN_L,A ; 分个位
004D E500 F 104 MOV A,SEC
004F 75F00A 105 MOV B,#10
0052 84 106 DIV AB
0053 93 107 MOVC A,@A+DPTR
0054 F500 F 108 MOV BUF_SEC_H,A ; 秒十位
0056 E500 F 109 MOV A,SEC
0058 75F00A 110 MOV B,#10
005B 84 111 DIV AB
005C E5F0 112 MOV A,B
005E 93 113 MOVC A,@A+DPTR
005F F500 F 114 MOV BUF_SEC_L,A ; 秒个位
115
0061 7500BF F 116 MOV BUF_HOUR_H+02H,#0BFH
0064 7500BF F 117 MOV BUF_HOUR_H+05H,#0BFH
118
0067 7500FE F 119 MOV DIS_DIGIT,#0FEH
006A E4 120 CLR A
006B F500 F 121 MOV DIS_INDEX,A
122
006D 75A88A 123 MOV IE,#08AH ; 使能timer0,1 中断
124
A51 MACRO ASSEMBLER WL010 12/02/2005 21:33:07 PAGE 3
0070 D28C 125 SETB TR0
0072 D28E 126 SETB TR1
127
0074 750003 F 128 MOV KEY_V,#03H
129
0077 130 MAIN_LP:
0077 120000 F 131 LCALL SCAN_KEY ; 键扫描
007A 60FB 132 JZ MAIN_LP ; 无键返回
133
007C 7F0A 134 MOV R7,#10 ; 延时10ms
007E 120000 F 135 LCALL DELAYMS ; 延时去抖动
0081 120000 F 136 LCALL SCAN_KEY ; 再次扫描
0084 60F1 137 JZ MAIN_LP ; 无键返回
138
0086 850000 F 139 MOV KEY_V,KEY_S ; 保存键值
0089 120000 F 140 LCALL PROC_KEY ; 键处理
008C 80E9 141 SJMP MAIN_LP ; 调回主循环
142
143
144 ;===============================================================================
008E 145 SCAN_KEY:
146 ; 扫键扫描子程序
147 ; 保存按键状态到key_s
148 ; 返回: A --- 按键是否按下(BOOL)
149
008E E4 150 CLR A
151
008F A2B2 152 MOV C,AN1 ; 读按键AN1
0091 92E0 153 MOV ACC.0,C
0093 A2B4 154 MOV C,AN2 ; 读按键AN2
0095 92E1 155 MOV ACC.1,C
156
0097 F500 F 157 MOV KEY_S,A ; 保存按键状态到key_s
0099 6500 F 158 XRL A,KEY_V
009B 22 159 RET
160
161 ;===============================================================================
009C 162 PROC_KEY:
163 ; 键处理子程序
164 ; 传入参数: KEY_V --- 按键值
165 ; 返回值: 无
166
009C C2AF 167 CLR EA
168
009E E500 F 169 MOV A,KEY_V
00A0 30E005 170 JNB ACC.0,PROC_AN1
00A3 30E107 171 JNB ACC.1,PROC_AN2
00A6 8028 172 SJMP END_PROC_KEY
173
00A8 174 PROC_AN1: ; 按键AN1处理
00A8 120000 F 175 LCALL INC_HOUR ; 小时加1
00AB 8023 176 SJMP END_PROC_KEY
177
00AD 178 PROC_AN2: ; 按键AN2处理
00AD 0500 F 179 INC MIN ; 分钟加1
180
00AF E500 F 181 MOV A,MIN ;
00B1 D3 182 SETB C
00B2 943B 183 SUBB A,#59
00B4 4003 184 JC AN2_UPDATE_MIN ; 如果分钟等于60,则分清0,小时加1
185
00B6 E4 186 CLR A ;
00B7 F500 F 187 MOV MIN,A
188
00B9 189 AN2_UPDATE_MIN: ; 更新分显示缓冲区
00B9 E500 F 190 MOV A,MIN
A51 MACRO ASSEMBLER WL010 12/02/2005 21:33:07 PAGE 4
00BB 75F00A 191 MOV B,#10
00BE 84 192 DIV AB ; A = MIN / 10
00BF 900000 F 193 MOV DPTR,#DIS_CODE
00C2 93 194 MOVC A,@A+DPTR
00C3 F500 F 195 MOV BUF_MIN_H,A ; 更新分十位
196
00C5 E500 F 197 MOV A,MIN
00C7 75F00A 198 MOV B,#10
00CA 84 199 DIV AB
00CB E5F0 200 MOV A,B ; A = MIN % 10
00CD 93 201 MOVC A,@A+DPTR
00CE F500 F 202 MOV BUF_MIN_L,A ; 更新分个位
203
00D0 204 END_PROC_KEY:
00D0 D2AF 205 SETB EA
00D2 22 206 RET
207
208 ;===============================================================================
209
210 USING 0
00D3 211 TIMER0:
212 ; 定时器0中断服程序, 用于数码管的动态扫描
213 ; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
214 ; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
215 ; 选通P2.0口数码管
216 ; DIS_BUF --- 显于缓冲区基地址
217
00D3 C0E0 218 PUSH ACC
00D5 C0D0 219 PUSH PSW
00D7 C000 220 PUSH AR0
221
00D9 758CFC 222 MOV TH0,#0FCH
00DC 758A17 223 MOV TL0,#017H
224
00DF 75A0FF 225 MOV P2,#0FFH ; 先关闭所有数码管
226
00E2 7400 F 227 MOV A,#DIS_BUF ; 获得显示缓冲区基地址
00E4 2500 F 228 ADD A,DIS_INDEX ; 获得偏移量
00E6 F8 229 MOV R0,A ; R0 = 基地址 + 偏移量
00E7 E6 230 MOV A,@R0 ; 获得显示代码
00E8 F580 231 MOV P0,A ; 显示代码传送到P0口
232
00EA 8500A0 F 233 MOV P2,DIS_DIGIT
234
00ED E500 F 235 MOV A,DIS_DIGIT ; 位选通值左移, 下次中断时选通下一位数码管
00EF 23 236 RL A
00F0 F500 F 237 MOV DIS_DIGIT,A
238
00F2 0500 F 239 INC DIS_INDEX ; DIS_INDEX加1, 下次中断时显示下一位
00F4 530007 F 240 ANL DIS_INDEX,#0x07 ; 当DIS_INDEX等于8(0000 1000)时, 清0
241
00F7 D000 242 POP AR0
00F9 D0D0 243 POP PSW
00FB D0E0 244 POP ACC
245
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -