Timer T0 in Split mode
Similarly to the previous example, the program spends most of its time in a loop called LOOP1. Since 16-bit Timer T0 is split into two 8-bit timers, there are also two interrupt sources.The first interrupt is generated after timer T0 reset. Routine TIM0_ISR in which logic zero (0) bit on port P1 rotates is executed. Outside looking, it seems that LEDs move.
Another interrupt is generated upon Timer T1 reset. Routine TIM1_ISR in which the bit state DIRECTION inverts is executed. Since this bit determines direction of bit rotation then the moving direction of LED is also changed.
If you press a push button T1 at some point, a logic zero (0) on the P3.2 output will disable Timer T1.
;************************************************************************
;* PROGRAM NAME : Split.ASM
;* DESCRIPTION: Timer TL0 rotates bit on port P1, while TL1 determines
;* the rotation direction. Both timers operate in mode
;* 3. Logic zero (0) on output P3.2 disables rotation on port P1.
;************************************************************************
;BASIC DIRECTIVES
$MOD53
$TITLE(SPLIT.ASM)
$PAGEWIDTH(132)
$DEBUG
$OBJECT
$NOPAGING
;DECLARATION OF VARIABLES
BSEG AT 0
;DECLARATION OF BIT-VARIABLES
SEMAPHORE: DBIT 8
DIRECTION BIT SEMAPHORE
;STACK
DSEG AT 03FH
STACK_START: DS 040H
;RESET VECTORS
CSEG AT 0
JMP XRESET ; Reset vector
ORG 00BH
JMP TIM0_ISR ; Timer T0 reset vector
ORG 01BH
JMP TIM1_ISR ; Timer T1 reset vector
ORG 100H
XRESET: MOV SP,#STACK_START ; Define Stack pointer
MOV TMOD,#00001011B ; Define MOD3
MOV A,#0FFH
MOV P1,#0FFH
MOV R0,#30D
SETB TR0 ; TL0 is turned on
SETB TR1 ; TL1 is turned on
MOV IE,#08AH ; Interrupt enabled
CLR C
CLR DIRECTION ; Rotate to the right
LOOP1: SJMP LOOP1 ; Remain here
TIM0_ISR:
DJNZ R0,LAB3 ; Slow down rotation by 256 times
JB DIRECTION,LAB1
RRC A ; Rotate contents of Accumulator to the right through
; Carry flag
SJMP LAB2
LAB1: RLC A ; Rotate contents of Accumulator to the left through
; Carry flag
LAB2: MOV P1,A ; Contents of Accumulator is moved to port P1
LAB3: RETI ; Return from interrupt
TIM1_ISR:
DJNZ R1,LAB4 ; Slow down direction of rotation by 256 times
DJNZ R2,LAB4 ; When time expires, change rotation direction
CPL SMER
MOV R2,#30D
LAB4: RETI
END ; End of program