LED display as a two digit counter
Things are getting complicated... In addition to two digit multiplexing, the microcontroller also performs other operations. In this example, contents of registers R2 and R3 are incremented in order to display number counting (97, 98, 99, 00, 01, 02...).This time, transistors which activate displays remain turned on for 25mS. The soubroutine Delay is in charge of that. Even though digits shift much slower now, it is still not slow enough to make impression of simultaneous operation. After both digits of a number blink for 20 times, the number on displays is incremented by 1 and the whole procedure is repeated.
;************************************************************************
;* PROGRAM NAME : 7Seg4.ASM
;* DESCRIPTION: Program displays numbers 0-99 on 7-segment LED displays
;************************************************************************
;BASIC DIRECTIVES
$MOD53
$TITLE(7SEG4.ASM)
$PAGEWIDTH(132)
$DEBUG
$OBJECT
$NOPAGING
;STACK
DSEG AT 03FH
STACK_START: DS 040H
;RESET VECTORS
CSEG AT 0
JMP XRESET ; Reset vector
ORG 100H
XRESET: MOV SP,#STACK_START ; Define Stack pointer
MOV R2,#0 ; Counter starting value
MOV R3,#0
MOV R4,#0
LOOP: INC R4 ;Wait for display to be "refreshed" for 100 times
CJNE R4,#20d,LAB1 ;before incrementing the counter
MOV R4,#0
MOV P1,#0 ; Turn off all display segments
INC R2 ; Increment Register containing units by 1
CJNE R2,#10d,LAB1
MOV R2,#0 ; Reset units
INC R3 ; Increment Register with tens by 1
CJNE R3,#10d,LAB1 ;
MOV R3,#0 ; Reset tens
LAB1:
MOV P3,#20h ; Activate display D4
MOV A,R2 ; Copy Register containing units to A
LCALL Disp ; Call mask for that digit
MOV P1,A ; Write units on display D4
LCALL Delay ; 25ms delay
MOV P1,#0 ; Turn off all display segments
MOV P3,#10h ; Activate display D3
MOV A,R3 ; Copy Register contaning tens to A
LCALL Disp ; Call mask for that digit
MOV P1,A ; Write tens on display D3
LCALL Delay ; 25ms delay
SJMP LOOP
Delay:
MOV R1,#50 ; 5 ms delay
F01: MOV R0,#250
DJNZ R0,$
DJNZ R1,F01
RET
Disp: ; Subroutine for displaying digits
INC A
MOVC A,@A+PC
RET
DB 3FH ; Digit 0 mask
DB 06H ; Digit 1 mask
DB 5BH ; Digit 2 mask
DB 4FH ; Digit 3 mask
DB 66H ; Digit 4 mask
DB 6DH ; Digit 5 mask
DB 7DH ; Digit 6 mask
DB 07H ; Digit 7 mask
DB 7FH ; Digit 8 mask
DB 6FH ; Digit 9 mask
END ; End of program