OUT DX,AL ;写入ICW1
MOV DX,211H ;DX指向奇地址端口 MOV AL,60H ;
OUT DX,AL ;写入ICW2 MOV AL, 0AH
OUT DX,AL ;写入ICW4 2、8259的操作命令字OCW1~OCW3
8259A有三个操作命令字OCW1~OCW3,程序员可以使用这三个命令字在应用程序里随时改变8259A的工作方式,而且设置时,次序可以随意。但是对端口地址有严格要求,即OCW1必须写入奇端口地址,OCW2和OCW3必须写入偶端口地址。 ①OCW1的格式及含义—中断屏蔽字(IMR) 某一位为“1”时,对应这一位的中断请求受到屏蔽。为“0”时开放该位中断。
如OCW1=08H,则IR3管脚上的中断请求被屏蔽. ② OCW2的格式及含义—设置优先级循环方式和中断结束方式
③OCW3-特殊屏蔽方式和查询方式操作字 功能:●设定特殊屏蔽方式; ●设置中断查询方式;
●设置对8259寄存器的读出。 8259A初始化 MOV AL, 13H ;写ICW1,单片,边沿触发,要ICW4 OUT 20H,AL
MOV AL,8 ;写ICW2,中断类型号从8开始 OUT 21H,AL
MOV AL,0DH ;写ICW4,缓冲工作方式,8088/8086配置 OUT 21H,AL
MOV AL,0 ;写OCW1,允许IR0~IR7全部8级中断请求 OUT 21H,AL
Intel 8259A的应用举例
1. 中断接口的设计
将单片8259A接入8088系统中,设计其端口地址为FFF0H和FFF1H,其具体连接如下图所
36
示。8259A由于只有一根地址线,因此它在系统中只占用两个端口地址。8259A内部的7个命令寄存器和3个状态寄存器的寻址是将这两个端口地址结合操作命令、特定数据位、严格的写入次序等来实现对8259A内部 寄存器的寻址,如下表所示。
37
2. 中断程序的编写
当把8259A接入系统后,就需要编写该接口的中断程序。中断程序由两个部分组成:中断接口的初始化程序和中断处理程序。
1) 初始化中断控制器8259A
初始化包括两个方面,一是初始化8259A的初始状态,二是完成中断向量表的设置
(1) 初始化8259A。由于8259A的ICW有严格的写入次序,因此,编程时必须根据其规定的初始化顺序对四个ICW进行初始化操作。 其初始化程序如下:
MOV DX,0FFF0H ;8259A口地址,A0=0
MOV AL,13H ;初始化字“00010011”送ICW1 OUT DX,AL ;单片,边沿触发,需要ICW4 MOV DX,0FFF1H ;8259A口地址,A0=1
MOV AL,0F8H ;初始化字“11111000”送ICW2 OUT DX,AL ;设置起始中断向量码(IRO)为F8H MOV AL,03H ;初始化字“00000011”送ICW4
OUT DX,AL ;8086/8088模式,AEOI,非缓冲,一般全嵌套方式
(2) 设置中断向量。
对IBM-PC/XT机,是在计算机启动过程中将中断向量表写入内存的。对用户自行设计的中断接口,当初始化完成后,需要人为设置中断向量表,以使设计的中断向量与相应的中断处理程序建立连接。这样,当CPU响应这些中断源的中断请求时,便能根据中断向量找到相应的处理程序,进行相应的中断服务。
假设8个中断源对应的中断处理程序在内存中存放的地址标号为PROG0(IR0)、PROG1(IR1)、PROG2(IR2)、…、
PROG7(IR7),则中断向量表的设置程序如下:
INT_IRO: MOV AX,0 ;设置IR0对应的中断向量表
MOV DS,AX ;段地址设定在内存的最底端
MOV SI,3E0H ;IR0的中断向量(F8H)对应的内存地址“4*F8” MOV AX,OFFSET PROG0 ;取得IR0中断处理程序的偏移地址 MOV [SI],AX ;偏移地址写入中断向量对应的“4*F8”地址处 MOV AX,SEG PROG0 ;取得IR0中断处理程序的段地址
MOV [SI+2],AX ;段地址写入中断向量对应的“4*F8+2”地址处
如果设置IR1对应的中断向量表,根据ICW2,IR1对应的中断向量为F9H,只要将上述程序的F8H换为F9H,PROG0换为PROG1,即可完成IR1对应中断向量表的设置。
当然,用户也可以利用DOS的25H功能调用来设置中断向量表,其调用方法为:
功能号→AH 中断向量→AL
中断处理程序段地址→DS 中断处理程序偏移地址→DX
38
INT 21H
assume cs:code
code segment public org 100h start: mov cx,0 start1: cli
mov dx,04a0h
mov ax,13h
out dx,ax ;ICW1, ICW4 NEEDED mov dx,04a2h mov ax,80h
out dx,ax ;ICW2 中断类型80h mov ax,01
out dx,ax ;ICW4 mov ax,00h
out dx,ax ;OCW1, 开放所有中断 mov ax,0
39
mov ds,ax
mov si,200h ;初始化中断向量表 mov ax,offset hint mov ds:[si],ax add si,2
mov ds:[si],100h mov ax,0
;jmp start sti waiting:
cmp ax,55h nop nop nop nop nop nop nop nop
jne waiting ;没发生中断,则等待 nop nop
mov dx,04b0h xor cx,0ffh mov ax,cx
out dx,ax ;LED灯亮灭一次 jmp start1 nop
40