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 ;匯編程序結束
|