; By Eberhard Haug (c) 4.8.2017 - www.LED-Treiber.de
; Please note: use this software at your own risk - no liability assumed
;=======================================================================
; HBCD hex counter, up to 5 ASCII BCD digits in 5 separate registers
; stop at a given value, the demo includes the
digit print out
; (similar to MAX7219_COUNT_BCD)
;
MAX7219_COUNT_HBCD:
push AKKU ; save counter registers
push AKKU2
push AKKU3
push AKKU4
push AKKU5
ldi AKKU5,'0' ; reset counter
ldi AKKU4,'0'
ldi AKKU3,'0'
ldi AKKU2,'0'
ldi AKKU,'0'
ldi MAX7219_ADDR, 1 ;
right most digit
mov MAX7219_DATA, AKKU
rcall MAX7219_PRINT_CHAR
rcall Delay1ms
REPEAT.m ; medium range is required
REPEAT.m ; medium range is required
REPEAT
REPEAT
REPEAT
inc AKKU
IF AKKU ==
#'9'+1
ldi AKKU,'A' ; next is ASCII A
ELSEIF AKKU
== #'F'+1
ldi AKKU,'0' ; carry to next digit
ENDI
ldi MAX7219_ADDR, 1
mov MAX7219_DATA, AKKU
rcall MAX7219_PRINT_CHAR
IF AKKU
<> #'0' ; otherwise delay is
; handled by next digit
rcall Delay1ms
ENDI
UNTIL AKKU == #'0'
inc AKKU2 ; next digit
IF AKKU2 ==
#'9'+1
ldi AKKU2,'A'
ELSEIF AKKU2 ==
#'F'+1
ldi AKKU2,'0'
ENDI
ldi MAX7219_ADDR,
2
mov MAX7219_DATA, AKKU2
rcall MAX7219_PRINT_CHAR
IF AKKU2
<> #'0'
rcall Delay1ms
ENDI
UNTIL AKKU2 == #'0'
inc AKKU3 ; next digit
IF AKKU3 == #'9'+1
ldi AKKU3,'A'
ELSEIF AKKU3 ==
#'F'+1
ldi AKKU3,'0'
ENDI
ldi MAX7219_ADDR, 3
mov MAX7219_DATA, AKKU3
ori MAX7219_DATA, 0x80 ; set DP
rcall MAX7219_PRINT_CHAR
IF AKKU3 <>
#'0'
rcall Delay1ms
ENDI
UNTIL AKKU3 == #'0'
inc AKKU4 ; next digit
IF AKKU4 == #'9'+1
ldi AKKU4,'A'
ELSEIF AKKU4 == #'F'+1
ldi AKKU4,'0'
ENDI
ldi MAX7219_ADDR, 4
mov MAX7219_DATA, AKKU4
rcall MAX7219_PRINT_CHAR
IF AKKU4 <> #'0'
rcall Delay1ms
ENDI
UNTIL AKKU4 == #'0'
inc AKKU5 ; next digit
IF AKKU5 == #'9'+1
ldi AKKU5,'A'
ELSEIF AKKU5 == #'F'+1
ldi AKKU5,'0'
ENDI
ldi MAX7219_ADDR, 5
mov MAX7219_DATA, AKKU5
ori MAX7219_DATA,
0x80 ; set
another DP
rcall MAX7219_PRINT_CHAR
IF AKKU5 <> #'0'
rcall Delay1ms
ENDI
EXITIF AKKU5 == #'1' ;
exit the demo at 0x01_00_00
UNTIL AKKU5 == #'0' ; all
5 digits done!
pop AKKU5
pop AKKU4
pop AKKU3
pop AKKU2
pop AKKU
ret