1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
|
mleddisplay PAGE 1
1 ; Demonstration code for MCU 8051 IDE
2 ;
3 ; Load virtual HW from "mleddisplay.vhc"
4 ; and press F2 and F6
5 ;
6 ; It should increment 4 digit number displayed
7 ; on multiplexed LED display
8
9
10 ; -----------------------------------------------
11 ; CONSTANTS
12 ; -----------------------------------------------
13
0020 14 data_ptr data 20h ; Number to display
0004 15 data_len equ 4h ; Number of digits
16
17 ;; Codes for 8-segment LED display
18 ; They can be easily determinated with
19 ; 8-segment editor ( [Main menu] - >
20 ; [Utilities] -> [8-segment editor] )
0041 C0 21 numbers:db 11000000b ; 0
0042 F9 22 db 11111001b ; 1
0043 A4 23 db 10100100b ; 2
0044 B0 24 db 10110000b ; 3
0045 99 25 db 10011001b ; 4
0046 92 26 db 10010010b ; 5
0047 82 27 db 10000010b ; 6
0048 F8 28 db 11111000b ; 7
0049 80 29 db 10000000b ; 8
004A 90 30 db 10010000b ; 9
31
32 ; -----------------------------------------------
33 ; VECTORS
34 ; -----------------------------------------------
35 ; Reset vector
36 org 0
0000 020025 37 jmp start
38
39 ; -----------------------------------------------
40 ; SUBPROGRAMS
41 ; -----------------------------------------------
42
43 ;; Increment the number
44 ;
45 ; R0 must be set to data_ptr before call
46 ;
47 ; Affected registers: R0
48 ; Interrupts: None
49 ; Notes: Recursive sub-program
50 inrement_number:
0003 06 51 inc @R0
0004 B60A09 52 cjne @R0, #0Ah, inc_num_end
53
0007 7600 54 mov @R0, #0
0009 08 55 inc R0
000A B82401 56 cjne R0, #data_ptr+data_len, $+4
000D 22 57 ret
000E 1103 58 call inrement_number
59 inc_num_end:
0010 22 60 ret
61
62 ;; Display the number on the LED display
63 ;
64 ; DPTR must point to table numbers
65 ; R0 must contain (data_ptr+data_len)
66 ;
67 ; Affected registers: A, B, R0, P1, P3
68 ; Interrupts: None
69 ; Notes: Uses DPTR
70 display_number:
71 ; Select digit to display
0011 18 72 dec R0 ; In uC
0012 E5F0 73 mov A, B
0014 03 74 rr A
0015 F5F0 75 mov B, A
76
77 ; Translate the digit to binary
78 ; representation for the LED display
0017 E6 79 mov A, @R0
0018 93 80 movc A, @A+DPTR
81
82 ; Display the digit on the display
0019 75B0FF 83 mov P3, #0ffh
001C F590 84 mov P1, A
001E 85F0B0 85 mov P3, B
86
87 ; Display next digit
0021 B820ED 88 cjne R0, #data_ptr, display_number
0024 22 89 ret
90
91 ; -----------------------------------------------
92 ; PROGRAM START
93 ; -----------------------------------------------
94 start:
95 ; Data to zeroes
0025 752000 96 mov data_ptr+0, #0h ; left-most
0028 752100 97 mov data_ptr+1, #0h
002B 752200 98 mov data_ptr+2, #0h
002E 752300 99 mov data_ptr+3, #0h ; right-most
100
101 ; Address 1st number on the display
0031 75F0EE 102 mov B, #0EEh
103 ; Initialize DPTR (Data PoinTeR)
0034 900041 104 mov DPTR, #numbers
105
106 ; -----------------------------------------------
107 ; MAIN LOOP
108 ; -----------------------------------------------
109
110 main:
111 ; Show the number on the LED display
0037 7824 112 mov R0, #data_ptr+data_len
0039 1111 113 call display_number
114
115 ; Increment the number
003B 7820 116 mov R0, #data_ptr
003D 1103 117 call inrement_number
118
119 ; Close main loop
003F 80F6 120 jmp main
121
122 ; -----------------------------------------------
123 ; PROGRAM END
124 ; -----------------------------------------------
125 end
ASSEMBLY COMPLETE, NO ERRORS FOUND, NO WARNINGS
SYMBOL TABLE:
??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED
??VERSION. . . . . . . . . . . . . . N NUMB 0149H NOT USED
AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED
ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H NOT USED
ACSR . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
ADCF . . . . . . . . . . . . . . . . D ADDR 00F6H NOT USED
ADCLK. . . . . . . . . . . . . . . . D ADDR 00F2H NOT USED
ADCON. . . . . . . . . . . . . . . . D ADDR 00F3H NOT USED
ADDH . . . . . . . . . . . . . . . . D ADDR 00F5H NOT USED
ADDL . . . . . . . . . . . . . . . . D ADDR 00F4H NOT USED
AUXR . . . . . . . . . . . . . . . . D ADDR 008EH NOT USED
AUXR1. . . . . . . . . . . . . . . . D ADDR 00A2H NOT USED
B. . . . . . . . . . . . . . . . . . D ADDR 00F0H
BDRCON . . . . . . . . . . . . . . . D ADDR 009BH NOT USED
BDRCON_1 . . . . . . . . . . . . . . D ADDR 009CH NOT USED
BRL. . . . . . . . . . . . . . . . . D ADDR 009AH NOT USED
CCAP0H . . . . . . . . . . . . . . . D ADDR 00FAH NOT USED
CCAP0L . . . . . . . . . . . . . . . D ADDR 00EAH NOT USED
CCAP1H . . . . . . . . . . . . . . . D ADDR 00FBH NOT USED
CCAP1L . . . . . . . . . . . . . . . D ADDR 00EBH NOT USED
CCAP2H . . . . . . . . . . . . . . . D ADDR 00FCH NOT USED
CCAP3H . . . . . . . . . . . . . . . D ADDR 00FDH NOT USED
CCAP4H . . . . . . . . . . . . . . . D ADDR 00FEH NOT USED
CCAPL2H. . . . . . . . . . . . . . . D ADDR 00FCH NOT USED
CCAPL2L. . . . . . . . . . . . . . . D ADDR 00ECH NOT USED
CCAPL3H. . . . . . . . . . . . . . . D ADDR 00FDH NOT USED
CCAPL3L. . . . . . . . . . . . . . . D ADDR 00EDH NOT USED
CCAPL4H. . . . . . . . . . . . . . . D ADDR 00FEH NOT USED
CCAPL4L. . . . . . . . . . . . . . . D ADDR 00EEH NOT USED
CCAPM0 . . . . . . . . . . . . . . . D ADDR 00DAH NOT USED
CCAPM1 . . . . . . . . . . . . . . . D ADDR 00DBH NOT USED
CCAPM2 . . . . . . . . . . . . . . . D ADDR 00DCH NOT USED
CCAPM3 . . . . . . . . . . . . . . . D ADDR 00DDH NOT USED
CCAPM4 . . . . . . . . . . . . . . . D ADDR 00DEH NOT USED
CCF0 . . . . . . . . . . . . . . . . B ADDR 00D8H NOT USED
CCF1 . . . . . . . . . . . . . . . . B ADDR 00D9H NOT USED
CCF2 . . . . . . . . . . . . . . . . B ADDR 00DAH NOT USED
CCF3 . . . . . . . . . . . . . . . . B ADDR 00DBH NOT USED
CCF4 . . . . . . . . . . . . . . . . B ADDR 00DCH NOT USED
CCON . . . . . . . . . . . . . . . . D ADDR 00D8H NOT USED
CFINT. . . . . . . . . . . . . . . . C ADDR 0033H NOT USED
CH . . . . . . . . . . . . . . . . . D ADDR 00F9H NOT USED
CKCON. . . . . . . . . . . . . . . . D ADDR 008FH NOT USED
CKCON0 . . . . . . . . . . . . . . . D ADDR 008FH NOT USED
CKRL . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
CKSEL. . . . . . . . . . . . . . . . D ADDR 0085H NOT USED
CL . . . . . . . . . . . . . . . . . D ADDR 00E9H NOT USED
CLKREG . . . . . . . . . . . . . . . D ADDR 008FH NOT USED
CMOD . . . . . . . . . . . . . . . . D ADDR 00D9H NOT USED
CPRL2. . . . . . . . . . . . . . . . B ADDR 00C8H NOT USED
CR . . . . . . . . . . . . . . . . . B ADDR 00DEH NOT USED
CT2. . . . . . . . . . . . . . . . . B ADDR 00C9H NOT USED
CY . . . . . . . . . . . . . . . . . B ADDR 00D7H NOT USED
DATA_LEN . . . . . . . . . . . . . . N NUMB 0004H
DATA_PTR . . . . . . . . . . . . . . D ADDR 0020H
DISPLAY_NUMBER . . . . . . . . . . . C ADDR 0011H
DP0H . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED
DP0L . . . . . . . . . . . . . . . . D ADDR 0082H NOT USED
DP1H . . . . . . . . . . . . . . . . D ADDR 0085H NOT USED
DP1L . . . . . . . . . . . . . . . . D ADDR 0084H NOT USED
DPH. . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED
DPL. . . . . . . . . . . . . . . . . D ADDR 0082H NOT USED
EA . . . . . . . . . . . . . . . . . B ADDR 00AFH NOT USED
EC . . . . . . . . . . . . . . . . . B ADDR 00AEH NOT USED
EECON. . . . . . . . . . . . . . . . D ADDR 0096H NOT USED
ES . . . . . . . . . . . . . . . . . B ADDR 00ACH NOT USED
ET0. . . . . . . . . . . . . . . . . B ADDR 00A9H NOT USED
ET1. . . . . . . . . . . . . . . . . B ADDR 00ABH NOT USED
ET2. . . . . . . . . . . . . . . . . B ADDR 00ADH NOT USED
EX0. . . . . . . . . . . . . . . . . B ADDR 00A8H NOT USED
EX1. . . . . . . . . . . . . . . . . B ADDR 00AAH NOT USED
EXEN2. . . . . . . . . . . . . . . . B ADDR 00CBH NOT USED
EXF2 . . . . . . . . . . . . . . . . B ADDR 00CEH NOT USED
EXTI0. . . . . . . . . . . . . . . . C ADDR 0003H NOT USED
EXTI1. . . . . . . . . . . . . . . . C ADDR 0013H NOT USED
F0 . . . . . . . . . . . . . . . . . B ADDR 00D5H NOT USED
FE . . . . . . . . . . . . . . . . . B ADDR 009FH NOT USED
IE . . . . . . . . . . . . . . . . . D ADDR 00A8H NOT USED
IE0. . . . . . . . . . . . . . . . . B ADDR 0089H NOT USED
IE1. . . . . . . . . . . . . . . . . B ADDR 008BH NOT USED
INC_NUM_END. . . . . . . . . . . . . C ADDR 0010H
INREMENT_NUMBER. . . . . . . . . . . C ADDR 0003H
INT0 . . . . . . . . . . . . . . . . B ADDR 00B2H NOT USED
INT1 . . . . . . . . . . . . . . . . B ADDR 00B3H NOT USED
IP . . . . . . . . . . . . . . . . . D ADDR 00B8H NOT USED
IPH. . . . . . . . . . . . . . . . . D ADDR 00B7H NOT USED
IPH0 . . . . . . . . . . . . . . . . D ADDR 00B7H NOT USED
IPH1 . . . . . . . . . . . . . . . . D ADDR 00B3H NOT USED
IPL0 . . . . . . . . . . . . . . . . D ADDR 00B8H NOT USED
IPL1 . . . . . . . . . . . . . . . . D ADDR 00B2H NOT USED
IT0. . . . . . . . . . . . . . . . . B ADDR 0088H NOT USED
IT1. . . . . . . . . . . . . . . . . B ADDR 008AH NOT USED
KBE. . . . . . . . . . . . . . . . . D ADDR 009DH NOT USED
KBF. . . . . . . . . . . . . . . . . D ADDR 009EH NOT USED
KBLS . . . . . . . . . . . . . . . . D ADDR 009CH NOT USED
MAIN . . . . . . . . . . . . . . . . C ADDR 0037H
NUMBERS. . . . . . . . . . . . . . . C ADDR 0041H
OSCCON . . . . . . . . . . . . . . . D ADDR 0086H NOT USED
OV . . . . . . . . . . . . . . . . . B ADDR 00D2H NOT USED
P. . . . . . . . . . . . . . . . . . B ADDR 00D0H NOT USED
P0 . . . . . . . . . . . . . . . . . D ADDR 0080H NOT USED
P1 . . . . . . . . . . . . . . . . . D ADDR 0090H
P1M1 . . . . . . . . . . . . . . . . D ADDR 00D4H NOT USED
P1M2 . . . . . . . . . . . . . . . . D ADDR 00E2H NOT USED
P2 . . . . . . . . . . . . . . . . . D ADDR 00A0H NOT USED
P3 . . . . . . . . . . . . . . . . . D ADDR 00B0H
P3M1 . . . . . . . . . . . . . . . . D ADDR 00D5H NOT USED
P3M2 . . . . . . . . . . . . . . . . D ADDR 00E3H NOT USED
P4 . . . . . . . . . . . . . . . . . D ADDR 00C0H NOT USED
P4M1 . . . . . . . . . . . . . . . . D ADDR 00D6H NOT USED
P4M2 . . . . . . . . . . . . . . . . D ADDR 00E4H NOT USED
P5 . . . . . . . . . . . . . . . . . D ADDR 00E8H NOT USED
PC . . . . . . . . . . . . . . . . . B ADDR 00BEH NOT USED
PCON . . . . . . . . . . . . . . . . D ADDR 0087H NOT USED
PPCL . . . . . . . . . . . . . . . . B ADDR 00BEH NOT USED
PS . . . . . . . . . . . . . . . . . B ADDR 00BCH NOT USED
PSL. . . . . . . . . . . . . . . . . B ADDR 00BCH NOT USED
PSW. . . . . . . . . . . . . . . . . D ADDR 00D0H NOT USED
PT0. . . . . . . . . . . . . . . . . B ADDR 00B9H NOT USED
PT0L . . . . . . . . . . . . . . . . B ADDR 00B9H NOT USED
PT1. . . . . . . . . . . . . . . . . B ADDR 00BBH NOT USED
PT1L . . . . . . . . . . . . . . . . B ADDR 00BBH NOT USED
PT2. . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED
PT2L . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED
PX0. . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED
PX0L . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED
PX1. . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED
PX1L . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED
RB8. . . . . . . . . . . . . . . . . B ADDR 009AH NOT USED
RCAP2H . . . . . . . . . . . . . . . D ADDR 00CBH NOT USED
RCAP2L . . . . . . . . . . . . . . . D ADDR 00CAH NOT USED
RCLK . . . . . . . . . . . . . . . . B ADDR 00CDH NOT USED
RD . . . . . . . . . . . . . . . . . B ADDR 00B7H NOT USED
REN. . . . . . . . . . . . . . . . . B ADDR 009CH NOT USED
RESET. . . . . . . . . . . . . . . . C ADDR 0000H NOT USED
RI . . . . . . . . . . . . . . . . . B ADDR 0098H NOT USED
RS0. . . . . . . . . . . . . . . . . B ADDR 00D3H NOT USED
RS1. . . . . . . . . . . . . . . . . B ADDR 00D4H NOT USED
RXD. . . . . . . . . . . . . . . . . B ADDR 00B0H NOT USED
SADDR. . . . . . . . . . . . . . . . D ADDR 00A9H NOT USED
SADDR_0. . . . . . . . . . . . . . . D ADDR 00A9H NOT USED
SADDR_1. . . . . . . . . . . . . . . D ADDR 00AAH NOT USED
SADEN. . . . . . . . . . . . . . . . D ADDR 00B9H NOT USED
SADEN_0. . . . . . . . . . . . . . . D ADDR 00B9H NOT USED
SADEN_1. . . . . . . . . . . . . . . D ADDR 00BAH NOT USED
SBUF . . . . . . . . . . . . . . . . D ADDR 0099H NOT USED
SCON . . . . . . . . . . . . . . . . D ADDR 0098H NOT USED
SINT . . . . . . . . . . . . . . . . C ADDR 0023H NOT USED
SM0. . . . . . . . . . . . . . . . . B ADDR 009FH NOT USED
SM1. . . . . . . . . . . . . . . . . B ADDR 009EH NOT USED
SM2. . . . . . . . . . . . . . . . . B ADDR 009DH NOT USED
SP . . . . . . . . . . . . . . . . . D ADDR 0081H NOT USED
SPCON. . . . . . . . . . . . . . . . D ADDR 00C3H NOT USED
SPCR . . . . . . . . . . . . . . . . D ADDR 00D5H NOT USED
SPDAT. . . . . . . . . . . . . . . . D ADDR 00C5H NOT USED
SPDR . . . . . . . . . . . . . . . . D ADDR 0086H NOT USED
SPSR . . . . . . . . . . . . . . . . D ADDR 00AAH NOT USED
SPSTA. . . . . . . . . . . . . . . . D ADDR 00C4H NOT USED
START. . . . . . . . . . . . . . . . C ADDR 0025H
T0 . . . . . . . . . . . . . . . . . B ADDR 00B4H NOT USED
T1 . . . . . . . . . . . . . . . . . B ADDR 00B5H NOT USED
T2CON. . . . . . . . . . . . . . . . D ADDR 00C8H NOT USED
T2MOD. . . . . . . . . . . . . . . . D ADDR 00C9H NOT USED
TB8. . . . . . . . . . . . . . . . . B ADDR 009BH NOT USED
TCLK . . . . . . . . . . . . . . . . B ADDR 00CCH NOT USED
TCON . . . . . . . . . . . . . . . . D ADDR 0088H NOT USED
TF0. . . . . . . . . . . . . . . . . B ADDR 008DH NOT USED
TF1. . . . . . . . . . . . . . . . . B ADDR 008FH NOT USED
TF2. . . . . . . . . . . . . . . . . B ADDR 00CFH NOT USED
TH0. . . . . . . . . . . . . . . . . D ADDR 008CH NOT USED
TH1. . . . . . . . . . . . . . . . . D ADDR 008DH NOT USED
TH2. . . . . . . . . . . . . . . . . D ADDR 00CDH NOT USED
TI . . . . . . . . . . . . . . . . . B ADDR 0099H NOT USED
TIMER0 . . . . . . . . . . . . . . . C ADDR 000BH NOT USED
TIMER1 . . . . . . . . . . . . . . . C ADDR 001BH NOT USED
TIMER2 . . . . . . . . . . . . . . . C ADDR 002BH NOT USED
TL0. . . . . . . . . . . . . . . . . D ADDR 008AH NOT USED
TL1. . . . . . . . . . . . . . . . . D ADDR 008BH NOT USED
TL2. . . . . . . . . . . . . . . . . D ADDR 00CCH NOT USED
TMOD . . . . . . . . . . . . . . . . D ADDR 0089H NOT USED
TR0. . . . . . . . . . . . . . . . . B ADDR 008CH NOT USED
TR1. . . . . . . . . . . . . . . . . B ADDR 008EH NOT USED
TR2. . . . . . . . . . . . . . . . . B ADDR 00CAH NOT USED
TXD. . . . . . . . . . . . . . . . . B ADDR 00B1H NOT USED
WDTCON . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED
WDTPRG . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED
WDTRST . . . . . . . . . . . . . . . D ADDR 00A6H NOT USED
WR . . . . . . . . . . . . . . . . . B ADDR 00B6H NOT USED
|