?? 彩燈實驗.asm
字號:
; 中斷方式控制彩燈點亮程序
STACK1 SEGMENT STACK
DW 200 DUP(?)
STACK1 ENDS
DATA SEGMENT
MESG1 DB 'Press SW3 one time to invoke interrupt one time,and to light one of LEDs',0ah,0dh
DB 'Exit with q/Q',0ah,0dh,'$'
LEDDATA DB 01H,02H,04H,08H,10H,20H,40H,80H
NUM DW(0)
INT0A_OFF DW(?)
INT0A_SEG DW(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET MESG1
INT 21h ;顯示提示信息
MOV DX,303H ;初始化8255
MOV AL,83H
OUT DX,AL
MOV DX,300H ;LED燈熄滅
MOV AL,00H
OUT DX,AL
MOV AX,3572H ;獲取原中斷向量
INT 21H
MOV INT0A_OFF,BX ;保存原中斷向量
MOV BX,ES
MOV INT0A_SEG,BX
CLI ;關(guān)中斷
MOV AX,2572H
MOV DX,SEG LEDLIGHT ;設(shè)置新的中斷向量
PUSH DS
MOV DS,DX
MOV DX,OFFSET LEDLIGHT
INT 21H
POP DS
STI ;開中斷
IN AL,0A1H ;打開IRQ10
AND AL,0FBH
OUT 0A1H,AL
IN AL,21H ;打開IRQ2
AND AL,0FBH
OUT 21H,AL
L1:
MOV AH,0BH ;檢查是否有’Q’或’q’鍵按下
INT 21H
INC AL
JNZ NEXT0 ; 若無鍵按下,則程序往下執(zhí)行
MOV AH,08H ;如有’Q’或’q’鍵按下,則程序退出
INT 21H
CMP AL,'q'
JZ EXIT
CMP AL,'Q'
JZ EXIT
NEXT0:
MOV DX,302H ;查PC2是否為0
IN AL,DX
AND AL,04H
JNZ L1
MOV DX,303H ;按下SW3,則PC4=1申請中斷
MOV AL,09H
OUT DX,AL
PUSH CX
MOV CX,100
WT: LOOP WT
POP CX
MOV DX,303H ;置PC4=0
MOV AL,08H
OUT DX,AL
JMP L1
EXIT:
MOV AX,2572H ;恢復(fù)中斷向量
MOV DX,INT0A_SEG
PUSH DS
MOV DS,DX
MOV DX,INT0A_OFF
INT 21H
POP DS
IN AL,0A1H ;屏蔽IRQ10
OR AL,04H
OUT 0A1H,AL
IN AL,21H ;屏蔽IRQ2
OR AL,04H
OUT 21H,AL
MOV AX,4C00H ;程序退出
INT 21H
LEDLIGHT PROC FAR ;中斷服務(wù)程序
PUSH SI
PUSH AX
PUSH DX
CLI ;關(guān)中斷
MOV SI,OFFSET LEDDATA
ADD SI,NUM
MOV AL,[SI]
MOV DX,300H
OUT DX,AL ;點亮LED
INC NUM
CMP NUM,08H
JNE NEXT
MOV NUM,00H
NEXT :
MOV AL,62H ;發(fā)中斷結(jié)束命令
MOV DX,0A0H
OUT DX,AL ;向從片8259發(fā)EOI命令
OUT 020H,AL ;向主片8259發(fā)EOI命令
STI ;開中斷
POP DX
POP AX
POP SI
IRET
LEDLIGHT ENDP
CODE ENDS
END START
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -