;*******************************************************************************
;* Function: max6951_counting
;*
;* This routine counts how many 10-milliseconds have elapsed and displays
;*
;* the value from 0000 to 9999 on LED digits 3-0(no way to blank leading digits).
;*
; The routine displays the same value on LED digits 7-4(by using no decode
;*
;* mode, individual leading digits can be blanked).
;*
;* Input: None
;*
;* Output: None
;*
;* Destroys: ACC, A[1] - A[4], A[9]
;*
;*******************************************************************************
MAX6951_COUNTING:
CALL MAX6951_SHUTDOWN
CALL MAX6951_SET_ALL_0 ; SET ALL BITS OF DATA REGISTERS TO 0
MOVE ACC, #010FH ; HEXDECIMAL DECODE DIGITS 3-0, NO DEOCDE DIGITS 7-4
CALL MAX6951_TRANSMIT
; INITIALIZE THE COUNT TO 0
MOVE A[1], #0 ; A[1] => DIGIT 0
MOVE A[2], #0 ; A[2] => DIGIT 1
MOVE A[3], #0 ; A[3] => DIGIT 2
MOVE A[4], #0 ; A[4] => DIGIT 3
COUNT_LOOP:
INCREASE_DIGIT3:
MOVE ACC, A[4] ; PROCESS DIGIT 3
SUB #9
JUMP Z, INCREASE_DIGIT2 ; DIGIT 3 = 9, THERE IS CARRY OVER
MOVE ACC, A[4] ; DIGIT 3 < 9, CONTINUE
ADD #1
MOVE A[4], ACC
CALL FONT_LOOKUP ; LOOK UP THE VALUE FOR THIS FONT
; STORE IT IN A[9], KEEP ACC UNCHANGED
OR #6300H
CALL MAX6951_TRANSMIT ; NO CARRY OVER, WRITE DIGIT 3 NEW VALUE
MOVE ACC, A[9] ; WRITE THE NO DECODE VALUE TO DIGIT 7
OR #6700H
CALL MAX6951_TRANSMIT
JUMP DISPLAY_NUMBER
INCREASE_DIGIT2:
OR #6300H
CALL MAX6951_TRANSMIT ; WRITE 0 TO DIGIT 3 REGISTER FIRST
MOVE A[4], #0 ; SET DIGIT 3 BACK TO 0
MOVE ACC, #677EH ; NO DECODE VALUE FOR FONT '0' IS "7EH"
CALL MAX6951_TRANSMIT ; WRITE 7EH TO DIGIT 7 REGISTER
MOVE ACC, A[3] ; PROCESS DIGIT 2
SUB #9
JUMP Z, INCREASE_DIGIT1 ; DIGIT 2 = 9, THERE IS CARRY OVER
MOVE ACC, A[3] ; DIGIT 2 < 9, CONTINUE
ADD #1
MOVE A[3], ACC
CALL FONT_LOOKUP ; LOOK UP THE VALUE FOR THIS FONT
; STORE IT IN A[9], KEEP ACC UNCHANGED
OR #6200H
CALL MAX6951_TRANSMIT ; NO CARRY OVER, WRITE DIGIT 2 NEW VALUE
MOVE ACC, A[9] ; WRITE THE NO DECODE VALUE TO DIGIT 6
OR #6600H
CALL MAX6951_TRANSMIT
JUMP DISPLAY_NUMBER
INCREASE_DIGIT1:
OR #6200H
CALL MAX6951_TRANSMIT ; WRITE 0 TO DIGIT 2 REGISTER FIRST
MOVE A[3], #0 ; SET DIGIT 2 BACK TO 0
MOVE ACC, #667EH ; NO DECODE VALUE FOR FONT '0' IS "7EH"
CALL MAX6951_TRANSMIT ; WRITE 7EH TO DIGIT 6 REGISTER
MOVE ACC, A[2] ; PROCESS DIGIT 1
SUB #9
JUMP Z, INCREASE_DIGIT0 ; DIGIT 1 = 9, THERE IS CARRY OVER
MOVE ACC, A[2] ; DIGIT 1 < 9, CONTINUE
ADD #1
MOVE A[2], ACC
CALL FONT_LOOKUP ; LOOK UP THE VALUE FOR THIS FONT
; STORE IT IN A[9], KEEP ACC UNCHANGED
OR #6100H
CALL MAX6951_TRANSMIT ; NO CARRY OVER, WRITE DIGIT 1 NEW VALUE
MOVE ACC, A[9] ; WRITE THE NO DECODE VALUE TO DIGIT 5
OR #6500H
CALL MAX6951_TRANSMIT
JUMP DISPLAY_NUMBER
INCREASE_DIGIT0:
OR #6100H
CALL MAX6951_TRANSMIT ; WRITE 0 TO DIGIT 1 REGISTER FIRST
MOVE A[2], #0 ; SET DIGIT 1 BACK TO 0
MOVE ACC, #657EH ; NO DECODE VALUE FOR FONT '0' IS "7EH"
CALL MAX6951_TRANSMIT ; WIRTE 7EH TO DIGIT 5 REGISTER
MOVE ACC, A[1] ; PROCESS DIGIT 0
SUB #9
JUMP Z, COUNT_COMPLETE ; DIGIT 0 = 9, COUNTING IS OVER
MOVE ACC, A[1] ; DIGIT 0 < 9, CONTINUE
ADD #1
MOVE A[1], ACC
CALL FONT_LOOKUP ; LOOK UP THE VALUE FOR THIS FONT
; STORE IT IN A[9], KEEP ACC UNCHANGED
OR #6000H
CALL MAX6951_TRANSMIT ; NO CARRY OVER, WRITE DIGIT 0 NEW VALUE
MOVE ACC, A[9] ; WRITE THE NO DECODE VALUE TO DIGIT 4
OR #6400H
CALL MAX6951_TRANSMIT
DISPLAY_NUMBER: ; DISPLAY DIGIT 3-0 IN HEXADECIMAL DECODE MODE
; DIEPLAY DIGIT 7-4 IN NO DECODE MODE
CALL MAX6951_ENABLE
CALL MAX6951_10MS_DELAY
JUMP COUNT_LOOP
COUNT_COMPLETE:
RET