📄 aexp14.asm
字号:
;*---------------------------------------------------------*
;* Aexp14.asm 中断控制器8259应用实验-中断方式控制彩灯点亮 *
;* 中断方式控制彩灯点亮程序source file *
;* 运行步骤:1.将PC4和IRQ10两个跳接开关分别联上 *
;* 2.按下1次SW3,申请1次中断,使LED灯点亮1次 *
;* Copyright (c) 2002 by HUST *
;*---------------------------------------------------------*
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 ;关中断
MOV AX,2572H
MOV DX,SEG LEDLIGHT ;设置新的中断向量
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 ; 若无键按下,则程序往下执行
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 ;恢复中断向量
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 ;中断服务程序
PUSH SI
PUSH AX
PUSH DX
CLI ;关中断
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 ;发中断结束命令
MOV DX,0A0H
OUT DX,AL ;向从片8259发EOI命令
OUT 020H,AL ;向主片8259发EOI命令
STI ;开中断
POP DX
POP AX
POP SI
IRET
LEDLIGHT ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -