功能说明:
主程序将P1的8个LED作左移右移,中断时(按INT0时)使P1的8个LED闪烁5次。
硬件原理图
**********************外部中断(INT0/INT1)实验源程序**********************
ORG 0000H | ;起始地址 | |
JMP START | ;跳到主程序START | |
ORG 0003H | ;INT0中断子程序起始地址 | |
JMP EXT0 | ;中断子程序 | |
START: | MOV IE,#10000001B | ;INT0中断使能 |
MOV IP,#00000001B | ;INT0中断优先 | |
MOV TCON,#00000000B | ;INT0为电平触发 | |
MOV SP,#70H ; | ;设定堆栈指针 | |
LOOP: | MOV A,#0FFH | ;左移初值 |
CLR C | ;C=0 | |
MOV R2,#08 | ;设定左移8次 | |
LOOP1: | RLC A | ;含C左移一位 |
MOV P1,A | ;输出至P1 | |
CALL DELAY | ;延时0.2秒 | |
DJNZ R2,LOOP1 | ;左移8次 | |
MOV R2,#07 | ;设定右移7次 | |
LOOP2: | RRC A | ;含C右移一位 |
MOV P1,A | ;输出至P1 | |
CALL DELAY | ;延时0.2秒 | |
DJNZ R2,LOOP2 | ;左移7次 | |
JMP LOOP | ;重复 | |
EXT0: | PUSH ACC | ;将累加器的值压入堆栈保存 |
PUSH PSW | ;将PSW的值压入堆栈保存 | |
SETB RS0 | ;设定工作寄存器组1 | |
CLR RS1 | ||
MOV A,#00 | ;为使P1全亮 | |
MOV R2,#10 | ;闪烁5次(全亮,全减10次) | |
LOOP3: | MOV P1,A | ;将A输出至P1 |
CALL DELAY | ;延时0.2秒 | |
CPL A | ;将A的值取反 | |
DJNZ R2,LOOP3 | ;闪烁5次(亮减10次)? | |
POP PSW | ;从堆栈取回PSW的值 | |
POP ACC | ;从堆栈取回A的值 | |
RETI | ;返回主程序 | |
DELAY: | MOV R5,#20 | ;0.2秒 |
D1: | MOV R6,#20 | ;10毫秒 |
D2: | MOV R7,#248 | ;0.5毫秒 |
DJNZ R7,$ | ||
DJNZ R6,D2 | ||
DJNZ R5,D1 | ||
RET | ||
END |