ORG 00H
MOV TMOD, #01H ; 设定Timer 0 工作在模式1下
START:
CLR C ; 清进位CY
MOV A, #0FFH ; ACC=FFH, 左移初始值
MOV R2, #8 ; 左移8次
LOOP:
RLC A ; 左移1位
MOV P0, A ; 输出到P0口,低电平
MOV R3, #20 ; 延时0.2秒
CALL DELAY
DJNZ R2, LOOP ; 是否左移了8次?不是则循环
MOV R2, #7 ; 右移7次
LOOP_1:
RRC A ; 右移1位
MOV P0, A ; 输出到P0口,低电平
MOV R3, #20
CALL DELAY
DJNZ R2, LOOP_1
JMP START ; 循环
;;;;;;;;;;;;;;;;;以下是利用计时器延时的子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:
SETB TR0 ; 启动Timer 0 开始计时
RECOUNT: MOV TH0, #(65536-2000)MOD 256 ; 计数初值2000
MOV TH0, #(65536-2000) / 256
LOOP_2:
JBC TF0, LOOP_3 ; TF0是否为1,是则跳到LOOP_3
JMP LOOP_2 ; 不是表明计时还没有完成,循环等待
LOOP_3:
DJNZ R3, RECOUNT ; R3为重复计时的次数
CLR TR0 ; 停止计时
RET
END