Tương tự như cỏc vớ dụ trước, chương trỡnh dành phần lớn thời gian của mỡnh trong vũng một gọi là LOOP1. Từ 16-bit Timer T0 được chia thành hai 8-bit timers, cũng cú hai nguồn ngắt.
Ngắt đầu tiờn được tạo ra sau khi Reset timer T0. Thủ tục TIM0_ISR, thực hiện bit logic khụng (0) xoay quanh cổng P1. Nhỡn từ bờn ngoài, cú vẻ như là di chuyển LED.
Một ngắt được tạo ra khi thiết lập lại Timer T1. Thủ tục TIM1_ISR thực hiện một bit HƯỚNG dựng để đảo chiều của bit trước. Kể từ khi bit này xỏc định hướng bit sỏng LED, LED sẽ quay theo hướng của bit HƯỚNG. Nếu bạn bấm một nỳt nhấn T1 tại một số điểm, một logic số khụng (0) trờn đầu vào P3.2 sẽ vụ hiệu húa 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
Bộ mụn Kỹ thuật mỏy tớnh – Khoa Điện tử - Trường ĐH Kỹ thuật Cụng nghiệp 150
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