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