51 匯編編程:中斷的現(xiàn)場保護(hù)與恢復(fù)
;
;有個(gè)交通燈的題目
;問題主要是中斷時(shí),強(qiáng)制變換為紅燈后,退出前應(yīng)該怎樣恢復(fù)原來的燈。
;
;一般來說,保護(hù)現(xiàn)場、恢復(fù)現(xiàn)場,都是用?PUSH、POP?來完成。
;
;這種方法,僅僅適用于片內(nèi)單元的保護(hù),對(duì)于接口,以及顯示器的內(nèi)容,就不適用了。
;
;外設(shè)的狀態(tài)如何恢復(fù)呢?
;
;做而論道編寫了一個(gè)小程序,來說明恢復(fù)的方法。
;
;仿真運(yùn)行如下圖:
;
;
;
;全部程序如下。
;
;交通燈
;-------------------------------------------
????ORG???0000H
????JMP???MAIN
????ORG???0003H?????????;外部中斷0的入口地址
????JMP???X0_INT
????ORG???000BH?????????;T0中斷的入口地址
????JMP???T0_INT
;***************************************
MAIN:
????MOV???TMOD,?#01H
????MOV???TH0,?#3CH
????MOV???TL0,?#0B0H
????MOV???R1,?#20???????;定時(shí)1s
????SETB??TR0
????SETB??ET0
????SETB??PT0
????SETB??EX0
????SETB??IT0
????SETB??EA
????MOV???SP,?#60H
M_LOOP:
;***************************************
N_B:
????MOV???30H,?#11H?????;南北
????MOV???P1,?30H
????MOV???R5,?#30???????;
????CALL??DISPLAY
????MOV???R2,?#27
LOOP1:
????CALL??WAIT_1S
????DJNZ??R2,?LOOP1?????;判斷是否過了27s
;--------------------------
????MOV???30H,?#21H
????MOV???P1,?30H
????MOV???R2,?#3
LOOP11:
????CALL??WAIT_1S
????DJNZ??R2,?LOOP11????;判斷是否過了3秒
;***************************************
D_X:
????MOV???30H,?#0AH?????;東西
????MOV???P1,?30H
????MOV???R5,?#30
????CALL??DISPLAY
????MOV???R2,?#27
LOOP2:
????CALL??WAIT_1S
????DJNZ??R2,?LOOP2?????;判斷是否過了27s
;--------------------------
????MOV???30H,?#0CH
????MOV???P1,?30H
????MOV???R2,?#3
LOOP22:
????CALL??WAIT_1S
????DJNZ??R2,?LOOP22????;判斷是否過了3秒
????JMP???M_LOOP
;***************************************
WAIT_1S:????????????????;等待新秒出現(xiàn)
????JNB???20H.0,?$
????CLR???20H.0
????DEC???R5
????CALL??DISPLAY
????RET
;-----------------------------
DISPLAY:
????MOV???A,?R5
????MOV???B,?#10
????DIV???AB
????MOV???DPTR,?#TAB1
????MOVC??A,?@A?+?DPTR
CPL??A
????MOV???P0,?A
????MOV???A,?B
????MOV???DPTR,?#TAB1
????MOVC??A,?@A?+?DPTR
CPL??A
????MOV???P2,?A
????RET
TAB1:
????DB????3FH,?06H,?5BH,?4FH,?66H,?6DH,?7DH,?07H,?7FH,?6FH???
;***************************************
X0_INT:
????MOV???P1,?#09H??????;全部紅燈
????PUSH??ACC
????PUSH??B
????PUSH??PSW
????SETB??RS0???????????;換工作區(qū)
????MOV???R5,?#10???????;倒計(jì)時(shí)顯示
????CALL??DISPLAY
????MOV???R1,?#20???????;定時(shí)1s
;----------------
????MOV???R2,?#10???????;倒計(jì)時(shí)
LOOP3:
????CALL??WAIT_1S
????DJNZ??R2,?LOOP3?????;判斷是否到了10s
;----------------
????POP???PSW???????????;恢復(fù)原區(qū)
????CALL??DISPLAY???????;顯示原值
????MOV???P1,?30H???????;顯示原燈
????POP???B
????POP???ACC
????RETI
;-----------------------------
T0_INT:?????????????????;T0中斷,高優(yōu)先級(jí)
????MOV???TL0,?#0B0H
????MOV???TH0,?#3CH?????;50ms中斷一次
????DJNZ??R1,?EXIT_T0
????MOV???R1,?#20???????;定時(shí)1s
????SETB??20H.0?????????;每到一秒就置一
EXIT_T0:
????RETI
;***************************************
END
;-------------------------------------------
;
;本程序?qū)χ袛喱F(xiàn)場的保護(hù)、恢復(fù)效果如何?
;
;感興趣的網(wǎng)友,可以試試看。
;