8259中断控制实验
1. 掌握8259中断控制器的工作原理。
2. 学习8259的应用编程方法。
3. 掌握8259级联方式的使用方法。
PC机一台,TD-PITE实验装置一套。
1. 中断控制器8259简介
在Intel 386EX芯片中集成有中断控制单元(ICU),该单元包含有两个级联中断控制器,一个为主控制器,一个为从控制器。该中断控制单元就功能而言与工业上标准的82C59A是一致的,操作方法也相同。从片的INT连接到主片的IR2信号上构成两片8259的级联。
在TD-PITE实验系统中,将主控制器的IR6、IR7以及从控制器的IR1开放出来供实验使用,主片8259的IR4供系统串口使用。8259的内部连接及外部管脚引出如图4.5:
图4.5 8259内部连续及外部管脚引出图
表4.1列出了中断控制单元的寄存器相关信息。
表4.1 ICU寄存器列表
寄存器 |
口地址 |
功能描述 |
ICW1(主) ICW1(从) (只写) |
0020H 00A0H |
初始化命令字1: 决定中断请求信号为电平触发还是边沿触发。 |
ICW2(主) ICW2(从) (只写) |
0021H 00A1H |
初始化命令字2: 包含了8259的基址中断向量号,基址中断向量是IR0的向量号,基址加1就是IR1的向量号,依此类推。 |
ICW3(主) (只写) |
0021H |
初始化命令字3: 用于识别从8259设备连接到主控制器的IR信号,内部的从8259连接到主8259的IR2信号上。 |
ICW3(从) (只写) |
00A1H |
初始化命令字3: 表明内部从控制器级联到主片的IR2信号上。 |
ICW4(主) ICW4(从) (只写) |
0021H 00A1H |
初始化命令字4: 选择特殊全嵌套或全嵌套模式,使能中断自动结束方式。 |
OCW1(主) OCW1(从) (读/写) |
0021H 00A1H |
操作命令字1: 中断屏蔽操作寄存器,可屏蔽相应的中断信号。 |
OCW2(主) OCW2(从) (只写) |
0020H 00A0H |
操作命令字2: 改变中断优先级和发送中断结束命令。 |
OCW3(主) OCW3(从) (只写) |
0020H 00A0H |
操作命令字3: 使能特殊屏蔽方式,设置中断查询方式,允许读出中断请求寄存器和当前中断服务寄存器。 |
IRR(主) IRR(从) (只读) |
0020H 00A0H |
中断请求: 指出挂起的中断请求。 |
ISR(主) ISR(从) (只读) |
0020H 00A0H |
当前中断服务: 指出当前正在被服务的中断请求。 |
POLL(主)
POLL(从) (只读) |
0020H 0021H 00A0H 00A1H |
查询状态字: 表明连接到8259上的设备是否需要服务,如果有中断请求,该字表明当前优先级最高的中断请求。 |
初始化命令字1寄存器(ICW1)说明见图4.6所示。
图4.6 初始化命令字1寄存器
初始化命令字2寄存器(ICW2)说明见图4.7所示。
图4.7 初始化命令字2寄存器
初始化命令字3寄存器(ICW3)说明,主片见图4.8,从片见图4.9。
图4.8 主片初始化命令字3寄存器
图4.9 从片初始化命令字3寄存器
初始化命令字4寄存器(ICW4)说明见图4.10。
图4.10 初始化命令字4寄存器
操作命令字1寄存器(OCW1)说明见图4.11。
图4.11 操作命令字1寄存器
操作命令字2寄存器(OCW2)说明如图4.12所示。
图4.12 操作命令字2寄存器
操作命令字3寄存器(OCW3)说明如图4.13所示。
图4.13 操作命令字3寄存器
查询状态字(POLL)说明如图4.14所示。
图4.14 程序状态字寄存器
在对8259进行编程时,首先必须进行初始化。一般先使用CLI指令将所有的可屏蔽中断禁止,然后写入初始化命令字。8259有一个状态机控制对寄存器的访问,不正确的初始化顺序会造成异常初始化。在初始化主片8259时,写入初始化命令字的顺序是:ICW1、ICW2、ICW3、然后是ICW4,初始化从片8259的顺序与初始化主片8259的顺序是相同的。
系统启动时,主片8259已被初始化,且4号中断源(IR4)提供给与PC联机的串口通信使用,其它中断源被屏蔽。中断矢量地址与中断号之间的关系如下表所示:
主片中断序号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
功能调用 |
08H |
09H |
0AH |
0BH |
0CH |
0DH |
0EH |
0FH |
矢量地址 |
20H~23H |
24H~27H |
28H~2BH |
2CH~2FH |
30H~33H |
34H~37H |
38H~3BH |
3CH~3FH |
说明 |
未开放 |
未开放 |
未开放 |
未开放 |
串口 |
未开放 |
可用 |
可用 |
从片中断序号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
功能调用 |
30H |
31H |
32H |
33H |
34H |
35H |
36H |
37H |
矢量地址 |
C0H~C3H |
C4H~C7H |
C8H~CBH |
CCH~CFH |
D0H~D3H |
D4H~D7H |
D8H~DBH |
DCH~DFH |
说明 |
未开放 |
可用 |
未开放 |
未开放 |
未开放 |
未开放 |
未开放 |
未开放 |
2. 8259单中断实验
实验接线图如图4.15所示,单次脉冲输出与主片8259的IR7相连,每按动一次单次脉冲,产生一次外部中断,在显示屏上输出一个字符“7”。
图4.15 8259单中断实验接线图
实验程序清单(INT1.ASM)
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: PUSH DS
MOV AX, 0000H
MOV DS, AX
MOV AX, OFFSET MIR7 ;取中断入口地址
MOV SI, 003CH ;中断矢量地址
MOV [SI], AX ;填IRQ7的偏移矢量
MOV AX, CS ;段地址
MOV SI, 003EH
MOV [SI], AX ;填IRQ7的段地址矢量
CLI ;中断屏蔽clear interrupt
POP DS
;初始化主片8259
MOV AL, 11H ;0001 0001 级联,边沿触发,要ICW4
OUT 20H, AL ;ICW1
MOV AL, 08H ;0000 1000 中断类型号从8开始
OUT 21H, AL ;ICW2
MOV AL, 04H ;0000 0100
OUT 21H, AL ;ICW3
MOV AL, 01H ;0000 0001 非缓冲方式,8086/8088配置
OUT 21H, AL ;ICW4
MOV AL, 6FH ;OCW1 0110 1111 IR7,IR4引脚的中断开放
OUT 21H, AL
STI ;恢复中断 set interrupt
AA1: NOP ;空指令
JMP AA1 ;无限循环
MIR7: STI
CALL DELAY ;延时
MOV AX, 0037H ;37H
INT 10H ;显示字符7
MOV AX, 0020H
INT 10H
MOV AL, 20H
OUT 20H, AL ;中断结束命令
IRET
DELAY: PUSH CX
MOV CX, 0F00H
AA0: PUSH AX
POP AX
LOOP AA0
POP CX
RET
CODE ENDS
END START
实验步骤
(1)按图4.15连接实验线路。
(2)编写实验程序,经编译、链接无误后装入系统。
(3)运行程序,重复按单次脉冲开关KK1+,显示屏会显示字符“7”,说明响应了中断。
3. 8259级联实验
实验接线图如图4.16所示,KK1+连接到主片8259的IR7上,KK2+连接到从片8259的IR1上,当按一次KK1+时,显示屏上显示字符“M7”,按一次KK2+时,显示字符“S1”。编写程序。
图4.16 8259级联实验
实验程序清单(INTCAS1.ASM)
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: PUSH DS
MOV AX, 0000H
MOV DS, AX
MOV AX, OFFSET MIR7 ;取中断入口地址
MOV SI, 003CH ;中断矢量地址
MOV [SI], AX ;填IRQ7的偏移矢量
MOV AX, CS ;段地址
MOV SI, 003EH
MOV [SI], AX ;填IRQ7的段地址矢量
MOV AX, OFFSET SIR1 ;取STR1的偏移地址
MOV SI, 00C4H
MOV [SI], AX
MOV AX, CS
MOV SI, 00C6H
MOV [SI], AX
CLI
POP DS
;初始化主片8259
MOV AL, 11H ;0001 0001 级联,边沿触发,要ICW4
OUT 20H, AL ;ICW1
MOV AL, 08H ;0000 1000 中断类型号从8开始
OUT 21H, AL ;ICW2
MOV AL, 04H ;0000 0100
OUT 21H, AL ;ICW3
MOV AL, 01H ;0000 0001 非缓冲方式,8086/8088配置
OUT 21H, AL ;ICW4
;初始化从片8259
MOV AL, 11H ;0001 0001 级联,边沿触发,要ICW4
OUT 0A0H, AL ;ICW1
MOV AL, 30H ;0011 0000 终端类型号从30H开始
OUT 0A1H, AL ;ICW2
MOV AL, 02H ;0000 0010 通过IR1引脚连接主片
OUT 0A1H, AL ;ICW3
MOV AL, 01H ;0000 0001 非缓冲方式,8086/8088配置
OUT 0A1H, AL ;ICW4
MOV AL, 0FDH
OUT 0A1H,AL ;OCW1 = 1111 1101 允许IR1中断请求
MOV AL, 6BH ;0110 1011
OUT 21H, AL ;主8259 OCW1
STI
AA1: NOP
JMP AA1
MIR7: CALL DELAY
MOV AX, 014DH
INT 10H ;M
MOV AX, 0037H
INT 10H ;显示字符7
MOV AX, 0020H
INT 10H
MOV AL, 20H
OUT 20H, AL ;中断结束命令
IRET
SIR1: CALL DELAY ;延时
MOV AX, 0053H
INT 10H ;S
MOV AX, 0031H
INT 10H ;显示字符1
MOV AX, 0020H
INT 10H
MOV AL, 20H
OUT 0A0H, AL
OUT 20H, AL
IRET
DELAY: PUSH CX
MOV CX, 0F00H
AA0: PUSH AX
POP AX
LOOP AA0
POP CX
RET
CODE ENDS
END START
实验步骤
(1)按图4.16连接实验线路。
(2)输入程序,编译、链接无误后装入系统。
(3)运行程序,按动KK1+或KK2+,观察实验结果,验证实验程序的正确性。
(4)若同时按下KK1+和KK2+,观察实验结果,解释实验现象。
附表 输入/输出接口编址
|
信号线 |
编址空间 |
主片8259 |
|
20H、21H |
从片8259 |
|
A0H、A1H |
扩展I/O接口 |
IOY0 |
0600H~063FH |
IOY1 |
0640H~067FH |
|
IOY2 |
0680H~06BFH |
|
IOY3 |
06C0H~06FFH |
附表 INT 10H 使用说明
入口:AH=01H,AL=数据 功能:写AL中的数据到屏上 |
入口:AH=06H,DS:BX=字串首址,且字串尾用00H填充 功能:显示一字串,直到遇到00H为止 |
附表 INT 21H使用说明
入口:AH=00H或AH=4CH 功能:程序终止 |
入口:AH=01H 功能:读键盘输入到AL中并回显 |
入口:AH=02H,DL=数据 功能:写DL中的数据到显示屏 |
入口:AH=08H 功能:读键盘输入到AL中无回显 |
入口:AH=09H,DS:DX=字符串首地址,字符串以 '$' 结束 功能:显示字符串,直到遇到 '$' 为止 |
入口:AH=0AH,DS:DX=缓冲区首地址,(DS:DX)=缓冲区最大字符数, (DS:DX+1)=实际输入字符数,(DS:DX+2)=输入字符串起始地址 功能:读键盘输入的字符串到DS:DX指定缓冲区中并以回车结束 |