一、ORG 0000H
本文引用地址:http://cafeforensic.com/article/201611/320488.htm AJMP MAIN
ORG 0209H
MAIN: MOV SP,#50H PC=0209H
MOV 30H,#1
MOV 31H,#2
MOV 32H,#3
MOV DPTR,#TABLE TABLE=040EH
MOV A,30H
LCALL SQR PC=021AH,當前指針為021DH,
mov b,#7 SP=50H
push b
MOV R1,A SP=51H,51H=07H
MOV A,31H
LCALL SQR PC=0225H,當前指針為0228H
mov b,#3 SP=51H
push b
ADD A,R1 SP=52H,52H=03H
MOV R1,A
MOV A,32H
LCALL SQR PC=0231H,當前指針為0234H
pop b SP=52H,B=06H
ADD A,R1 SP=51H,B=03H
MOV 33H,A
ORG 0309H
LOOP:SJMP LOOP
ORG 0409H
SQR: MOVC A,@A+DPTR PC=0409H 第一次調(diào)用:SP=52H,51H=1DH,52H=02H
第二次調(diào)用:SP=53H,52H=28H,53H=02H
第三次調(diào)用:SP=54H,53H=34H,54H=02H
mov b,#6
RET
TABLE: DB 00,01,04,09,16,25,36,49,64,81
END
二、外中斷INT0的響應。
程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H ;/INT0的入口地址
LJMP INT
ORG 0209H
MAIN: MOV SP,#30H
MOV A,#0FEH
SETB EA ;CPU開中斷
SETB EX0 ;允許/INT0中斷
SETB IT0 ;設置INT0的中斷觸發(fā)類型
LOOP: MOV P1,A
LCALL DELAY
RL A ;右移A中的數(shù)據(jù),以實現(xiàn)亮點流動
LJMP LOOP
ORG 0309H
INT: PUSH ACC ;保存現(xiàn)場
MOV A,#00H
MOV R3,#08H ;閃爍8次
LOOP1: MOV P1,A
CPL A ;將A中的內(nèi)容取反,以實現(xiàn)亮滅
LCALL DELAY
DJNZ R3,LOOP1
POP ACC ;恢復現(xiàn)場
RETI
ORG 0409H
DELAY: MOV R0,# 100
D1: MOV R1,#0FFH
D2: MOV R2,#0FFH
D3: DJNZ R2,D3
DJNZ R1,D2
DJNZ R0,D1
RET
END
分析:在單脈沖鍵按下之前,LED處于一個亮點流動的狀態(tài)。采用中斷方式,當按下單脈沖鍵時,LED狀態(tài)改為同時閃爍。閃爍8次再恢復原來的亮點流動。
2、同級別的外中斷INT0和INT1的響應。
程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H ;/INT0的入口地址
LJMP T0INT
ORG 0013H ;/INT1的入口地址
LJMP T1INT
ORG 0209H
MAIN: MOV SP,#30H
MOV A,#0FEH
SETB EA ;CPU開中斷
SETB EX0 ;允許/INT0中斷
SETB IT0 ;設置INT0的中斷觸發(fā)類型
SETB EX1 ;允許/INT1中斷
SETB IT1 ;設置INT1的中斷觸發(fā)類型
;SETB PX1 ;設置/INT1為高優(yōu)先級(將在步驟三中用到)
LOOP: MOV P1,A
LCALL DELAY
RL A ;右移A中的數(shù)據(jù),以實現(xiàn)亮點流動
LJMP LOOP
ORG 0309H
T0INT: PUSH ACC ;保存現(xiàn)場
MOV A,#00H
MOV R3,#08H ;閃爍8次
LOOP1: MOV P1,A
CPL A ;將A中的內(nèi)容取反,以實現(xiàn)亮滅
LCALL DELAY
DJNZ R3,LOOP1
POP ACC ;恢復現(xiàn)場
RETI
ORG 0409H
T1INT: PUSH ACC ;保存現(xiàn)場
MOV A,#55H ;同時亮滅4個
MOV R4,#08H ;閃爍8次
LOOP2: MOV P1,A
CPL A
LCALL DELAY
DJNZ R4,LOOP2
POP ACC ;恢復現(xiàn)場
RETI
ORG 0509H
DELAY: MOV R0,# 100
D1: MOV R1,#0FFH
D2: MOV R2,#0FFH
D3: DJNZ R2,D3
DJNZ R1,D2
DJNZ R0,D1
RET
END
分析:在單脈沖鍵按下之前,LED處于一個亮點流動的狀態(tài)。采用中斷方式,當按下INT0的單脈沖鍵時,LED狀態(tài)改為同時閃爍,閃爍8次再恢復原來的亮點流動;當按下INT1的單脈沖鍵時,LED狀態(tài)改為同時亮滅4個,亮滅8次再恢復原來的亮點流動。當同時按下INT0和INT1的當脈沖鍵時,單片機先響應外中斷INT0,然后再響應外中斷INT1。
3、不同級別的外中斷INT0和INT1的響應。
在步驟二的主程序中加多一條指令:SETB PX1 ;設置/INT1為高優(yōu)先級
分析:在單脈沖鍵按下之前,LED處于一個亮點流動的狀態(tài)。采用中斷方式,當按下INT0的單脈沖鍵時,LED狀態(tài)改為同時閃爍,閃爍8次再恢復原來的亮點流動;如果此時按下INT1的單脈沖鍵時,由于INT1的優(yōu)先級比INT0的優(yōu)先級高,所以CPU將響應高級中斷請求,即LED狀態(tài)改為同時亮滅4個,亮滅8次后,再返回低級中斷服務程序。當同時按下INT0和INT1的單脈沖鍵時,單片機先響應優(yōu)先級高的外中斷INT1,然后再響應優(yōu)先級底的外中斷INT0,最后才回到主程序。
如果將T1INT和T0INT一樣使用R3來作為倒數(shù)器,在軟件中調(diào)試時會出錯。當從高級中斷返回低級中斷時,R3的值會變?yōu)镕F,而不是0—8。所以在程序中使用R3和R4兩個寄存器。
而在實際硬件操作中,很難同時觸發(fā)兩種中斷,不易進行觀察。
評論