以上是电路图,但是中断无法响应
出现如下的情况,8259一直都在写ICW控制字。
不知道是什么原因
程序如下:
OY0 EQU 0C400H ;片选IOY0对应的端口始地址
IOY1 EQU 0C440H ;片选IOY1对应的端口始地址
IOY2 EQU 0C480H ;片选IOY2对应的端口始地址
IOY3 EQU 0C4C0H ;片选IOY3对应的端口始地址
INTR2 EQU 0AH ;中断类型码
;*****************************************************************
MY8255_A EQU IOY0+00H*4 ;8255的A口地址
MY8255_B EQU IOY0+01H*4 ;8255的B口地址
MY8255_C EQU IOY0+02H*4 ;8255的C口地址
MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址
MY8253_0 EQU IOY2+00H*2 ;8253的A口地址
MY8253_1 EQU IOY2+01H*2 ;8253的B口地址
MY8253_2 EQU IOY2+02H*2 ;8253的C口地址
DATA SEGMENT
TABLE DB 79H,24H,30H,19H,12H,02H,78H,00H,18H ;7段共阴数码表1~9
TES DB ? ;用于保存是否是违规抢答
;CS_B DW ?;保存INTR2原中断处理程序入口段地址变量
;IP_B DW ?;保存INTR2原中断处理程序入口偏移地址的变量
;IM_B DW ?;保存INTR2原中断屏蔽字的变量
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
;8259A初始化
MOV DX,IOY1+00H
MOV AL,13H;初始化8259A的ICW1
OUT DX,AL
MOV DX,IOY1+02H
MOVAL,08H;送中断类型码基值,8259A的ICW2
OUTDX,AL
MOV DX,IOY1+02H
MOVAL,03H;一般中断结束方式,8259A的ICW4
OUTDX,AL
;8255初始化
MOV DX,MY8255_MODE ;初始化8255工作方式
MOV AL,98H ;工作方式0,A口输入,B口输出,C口高4位输入,低4位输出
OUT DX,AL
XOR AL,AL;清0
MOV DX,MY8255_B;B口初始化
OUT DX,AL
MOV DX,MY8255_C ;C口初始化
OUT DX,AL
;8253初始化
MOV DX,MY8253_0;置8253通道0控制字
MOV AL,37H;可读/写,先低后高,方式3,BCD计数
OUT DX,AL
MOV AL,00H
OUT DX,AL
MOV AL,80H
OUT DX,AL;置8253通道0计数初值为8000
MOV DX,MY8253_1 ;置8253通道1控制字
MOV AL,73H;可读/写,先低后高,方式1,BCD计数
OUT DX,AL
MOV AL,00H
OUT DX,AL
MOV AL,75H
OUT DX,AL;置8253通道1计数初值为7500
MOV DX,MY8253_2;置8253通道2控制字
MOV AL,0B7H;可读/写,先低后高,方式3,BCD计数
OUT DX,AL
MOV AL,00H
OUT DX,AL
MOV AL,00H
OUT DX,AL;置8253通道2计数初值为0
;中断设置
CLI
MOV AX,0
MOV ES,AX ;目的地址基址为ES,其值为0
MOV DI,INTR2*4
MOV AX,OFFSET SELECT
MOV ES:[DI],AX;设置当前中断处理程序入口偏移地址
MOV AX,SEG SELECT
MOV ES:[DI+2],AX;设置当前中断处理程序入口段地址
Sti
;主程序
LOPM: MOV DX,MY8255_C
IN AL,DX;读PC5端口
TEST AL,20H;检测开始键
JZ LOP3;开始键未按下即PC5=0,则跳转检测
LOP2: MOV DX,MY8255_C
IN AL,DX;读PC5端口
TEST AL,20H;检测开始键
JNZ LOP2;开始键是否弹起即PC5=0?否,则继续循环
MOV DX,MY8255_B
MOV AL,0FFH;关闭LED显示器
OUT DX,AL;送到B口
MOV DX,MY8255_C
MOV AL,09H;绿灯变亮,启动倒计时
OUT DX,AL;送到C口
MOV TES,0FFH;置违规抢答标志
STI;开中断请求
LOP3:MOV DX,MY8255_C
IN AL,DX;读PC4端口
TEST AL,10H;检测复位键
JZ LOPM;复位键未按下即PC5=0,则跳转检测
LOP4:MOV DX,MY8255_C
IN AL,DX;读PC4端口
TEST AL,10H;检测复位键
JNZ LOP4;复位键是否弹起即PC5=0?否,则继续循环
MOV DX,MY8255_B
MOV AL,0FFH;关闭LED显示
OUT DX,AL
MOV DX,MY8255_C
MOV AL,00H;关闭指示灯显示
OUT DX,AL
MOV TES,00H;清除违规抢答标志
STI
JMP LOPM
;中断程序
SELECT PROC FAR
PUSH AX
PUSH BX
PUSH DX
PUSH DS
CLI;并使本次中断压入堆栈中的IF=0
;(关中断)
MOV DX,MY8255_A ;读A口
IN AL,DX
NOT AL ;将按键信息按位取反
MOV CX,8 ;循环技计数8次
LOP1: SHR AL,1 ;逻辑右循
MOV AX,CX ;获取按键选环
LOOPNZ LOP1 ;非0时循环手号
MOV BX,OFFSET TABLE ;查询7段码表格
XLAT ;将选手号转换为7段码
MOV DX,MY8255_B ;写B口
OUT DX,AL ;LED显示
TEST TES,0FFH ;判断违规抢答标志位是否为FFH
JZLOP5
MOV DX,MY8253_2
MOV AL,00H
OUT DX,AL
MOV AL,10H
OUT DX,AL ;抢答成功,扬声器响,频率1KHz
MOV DX,MY8255_C
MOV AL,01H
OUT DX,AL ;黄灯变亮,同时关闭定时器
JMP QUIT
LOP5:MOV DX,MY8255_C
MOV AL,04H
OUT DX,AL ;红灯亮抢答违规
MOV DX,MY8253_2
MOV AL,00H
OUT DX,AL
MOV AL,20H ;违规抢答,扬声器响,频率0.5KHz
OUT DX,AL
QUIT: MOV DX,IOY1+00H
MOV AL,62H
OUT DX,AL ;给8259发中断结束命令,写OCW2
POP DS
POP DX
POP BX
POP AX
IRET
SELECT ENDP
MOV AX,4C0H
INT 21H
CODE ENDS
END START
-
-
-
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>