将 P0 作为输出口,连接 8 个 LED,编写程序,使 LED 循环点亮。(LED1 亮,其余灭->LED2 亮,其余灭……,如此循环 5 次后,进行全灭->全亮闪烁,时间间隔为 500ms)。
/***************************************
定时器中断实验
Programed by Lee.rw,all right reserved
****************************************/
ORG 0000H
LJMP MAIN
/********************定时器0中断**************************/
ORG 000BH
LJMP T0_INT ;定时器0中断服务子程序
ORG 0100H
MAIN:
MOV P1,#0FFH ;初始全灭
MOV A,#0FEH ;A中存要赋值给P1口的值以控制LED亮灭
MOV R0,#27H ;循环39次左移即流水5次
/*****************三个标志位*****************/
MOV R1,#0H
MOV R2,#0H
MOV R3,#0H
START:
MOV P1,A
MOV B,#0AH ;循环10次
/****************设置定时器工作方式和中断**************/
SETB EA
SETB ET0
MOV TMOD,#01H ;定时器0工作在方式一
MOV TH0,#03CH ;定时器初值,一次50ms,循环10次,500ms
MOV TL0,#0AFH
SETB TR0
HERE:
SJMP HERE
RET
T0_INT:
MOV TH0,#03CH ;重新装入初值
MOV TL0,#0AFH
DJNZ B,RETURN
MOV B,#0AH
CJNE R3,#0H,JUDGE ;判断五次流水是不是已经完成
RL A
DJNZ R0,RETURN
MOV R3,#01H
MOV R1,#01H
JUDGE:
CJNE R1,#0H,OFF ;全灭
CJNE R2,#0H,ON ;全亮
ON:
MOV A,#00H
MOV R2,#0H
MOV R1,#01H
AJMP RETURN
OFF:
MOV A,#0FFH
MOV R1,#0H
MOV R2,#01H
RETURN:
MOV P1,A
RETI
END
下面是另一种运用延时子程序来达到目的的方法,因为太简单直接上代码,不再注释
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0100H
MAIN:
MOV P1,#0FFH
MOV A,#0FEH
MOV P1,A
MOV B,#0AH
MOV R0,#27H
SETB EA
SETB ET0
MOV TMOD,#01H
MOV TH0,#03CH
MOV TL0,#0AFH
SETB TR0
HERE:
SJMP HERE
RET
T0_INT:
MOV TH0,#03CH
MOV TL0,#0AFH
DJNZ B,LOOP
MOV B,#0AH
RL A
MOV P1,A
MOV A,R0
JZ FUN1
MOV A,P1
DEC R0
LOOP:
RETI
FUN1:
MOV P1,#00FFH
LCALL DELAY
MOV P1,#00H
LCALL DELAY
SJMP FUN1
DELAY:
DEL:MOV R7,#10
DEL1:MOV R6,#200
DEL2:MOV R5,#123
NOP
DEL3:DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
END