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
|
; Demonstration code for MCU 8051 IDE
;
; Load virtual HW from "mleddisplay.vhc"
; and press F2 and F6
;
; It should increment 4 digit number displayed
; on multiplexed LED display
; -----------------------------------------------
; CONSTANTS
; -----------------------------------------------
data_ptr data 20h ; Number to display
data_len equ 4h ; Number of digits
;; Codes for 8-segment LED display
; They can be easily determinated with
; 8-segment editor ( [Main menu] - >
; [Utilities] -> [8-segment editor] )
numbers:db 11000000b ; 0
db 11111001b ; 1
db 10100100b ; 2
db 10110000b ; 3
db 10011001b ; 4
db 10010010b ; 5
db 10000010b ; 6
db 11111000b ; 7
db 10000000b ; 8
db 10010000b ; 9
; -----------------------------------------------
; VECTORS
; -----------------------------------------------
; Reset vector
org 0
jmp start
; -----------------------------------------------
; SUBPROGRAMS
; -----------------------------------------------
;; Increment the number
;
; R0 must be set to data_ptr before call
;
; Affected registers: R0
; Interrupts: None
; Notes: Recursive sub-program
inrement_number:
inc @R0
cjne @R0, #0Ah, inc_num_end
mov @R0, #0
inc R0
cjne R0, #data_ptr+data_len, $+4
ret
call inrement_number
inc_num_end:
ret
;; Display the number on the LED display
;
; DPTR must point to table numbers
; R0 must contain (data_ptr+data_len)
;
; Affected registers: A, B, R0, P1, P3
; Interrupts: None
; Notes: Uses DPTR
display_number:
; Select digit to display
dec R0 ; In uC
mov A, B
rr A
mov B, A
; Translate the digit to binary
; representation for the LED display
mov A, @R0
movc A, @A+DPTR
; Display the digit on the display
mov P3, #0ffh
mov P1, A
mov P3, B
; Display next digit
cjne R0, #data_ptr, display_number
ret
; -----------------------------------------------
; PROGRAM START
; -----------------------------------------------
start:
; Data to zeroes
mov data_ptr+0, #0h ; left-most
mov data_ptr+1, #0h
mov data_ptr+2, #0h
mov data_ptr+3, #0h ; right-most
; Address 1st number on the display
mov B, #0EEh
; Initialize DPTR (Data PoinTeR)
mov DPTR, #numbers
; -----------------------------------------------
; MAIN LOOP
; -----------------------------------------------
main:
; Show the number on the LED display
mov R0, #data_ptr+data_len
call display_number
; Increment the number
mov R0, #data_ptr
call inrement_number
; Close main loop
jmp main
; -----------------------------------------------
; PROGRAM END
; -----------------------------------------------
end
|