ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT_0
ORG 0030H
;==========主程序MAIN函数====LED流水灯===
MAIN: MOV SP, #40H ;设置栈底
MOV A,#0FEH ;送显示模式字
MOV P0,#0FFH ;P0口等待输入
SETB EA ;开总中断
SETB EX0 ;开外部中断0
SETB EX1 ;开外部中断1,可以直接写MOV IE,#85H
LINE: MOV P2,A ;点亮二极管 P2=1111 1011B
ACALL DELAY500MS
RL A ;左移一位,改变显示模式字A=1111 1011
ACALL DELAY500MS
SJMP LINE ;下面一个二极管
;==========外部中断0中断服务成程序=====
INT_0: CLR EA ;关中断
PUSH ACC ;保护现场
PUSH PSW
JB P0.0,EXT0 ;中断查询
JB P0.1,EXT1
JB P0.2,EXT2
JB P0.3,EXT3
EXIT: POP PSW ;恢复现场
POP ACC
SETB EA
RETI ;中断返回
EXT0: ; EXINT0中断程序
MOV R3, #0FH ;LED亮灭8次
MOV A, #0FFH ;送LED灭
ON_OFF0:MOV P2, A
LCALL DELAY500MS
CPL A ;8个LED亮灭转换
LCALL DELAY500MS
DJNZ R3, ON_OFF0
AJMP EXIT
EXT1: ; EXINT1中断程序
MOV R3, #0FH ;LED亮灭8次
MOV A, #0FH ;送LED灭
ON_OFF1:MOV P2, A
LCALL DELAY500MS
CPL A ;8个LED亮灭转换
LCALL DELAY500MS
DJNZ R3, ON_OFF1
AJMP EXIT
EXT2: ;EXINT2中断程序
MOV R3, #0FH ;LED亮灭8次
MOV A, #33H ;送LED灭
ON_OFF2:MOV P2, A
LCALL DELAY500MS
CPL A ;8个LED亮灭转换
LCALL DELAY500MS
DJNZ R3, ON_OFF2
AJMP EXIT
EXT3: ;EXINT3中断程序
MOV R3, #0FH ;LED亮灭8次
MOV A, #55H ;送LED灭
ON_OFF3:MOV P2, A
LCALL DELAY500MS
CPL A ;8个LED亮灭转换
LCALL DELAY500MS
DJNZ R3, ON_OFF3
AJMP EXIT
;==========延时0.5秒===================
DELAY500MS: ;@12.000MHz
PUSH 30H
PUSH 31H
PUSH 32H
MOV 30H,#2 ; 总时间=(3*255*255+215*255+100)*2μs ≈ 500ms
MOV 31H,#215
MOV 32H,#10
NEXT:
DJNZ 32H,NEXT
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 32H
POP 31H
POP 30H
RET
END ;汇编程序结束
|