Simultaneous use of timers T0 and T1
This program can be considered as continuation of the previous one.
They share the same idea, but in this case true timers T0 and T1 are
used. In order to demonstrate the operation of both timers on the same
port at the same time, timer T0 reset is used to shift logic zero (0) on
the port, while Timer T1 reset is used to change rotation direction.
This program spends most of its time in the loop
LOOP1 waiting
for an interrupt to be caused by reset. By checking the DIRECTION bit,
information on rotation direction of both bits in accumulator as well as
of moving port LED is obtained.
;************************************************************************
;* PROGRAM NAME : Tim0Tim1.ASM
;* DESCRIPTION: Timer TO rotates bit on port P1 while Timer1
;* changes rotation direction. Both timers are configured to operate in mode 1.
;************************************************************************
;BASIC DIRECTIVES
$MOD53
$TITLE(TIM0TIM1.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 ; Timer 0 Reset vector
JMP TIM0_ISR
ORG 01BH ; Timer 1 Reset vector
JMP TIM1_ISR
ORG 100H
XRESET: MOV SP,#STACK_START ; Define Stack pointer
MOV TMOD,#11H ; Select MOD1 for both timers
MOV A,#0FFH
MOV P1,#0FFH
MOV R0,#30D ; R0 is initialized
SETB TR0 ; TIMER0 is turned on
SETB TR1 ; TIMER1 is turned on
MOV IE,#08AH ; Timer0 and Timer1 Interrupt enabled
CLR C
CLR DIRECTION ; Rotate to the right
LOOP1: SJMP LOOP1 ; Remain here
TIM0_ISR:
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
RETI ; Return from interrupt
TIM1_ISR:
DJNZ R0,LAB3 ; When time expires, change rotation direction
CPL DIRECTION
MOV R0,#30D ; Initialize R0
LAB3:
RETI
END ; End of program