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
|