8259
1. 掌握8259中断控制器的工作原理。
2. 学习8259的应用编程方法。
3. 掌握8259级联方式的使用方法。
Intel 386EX芯片中集成有中断控制单元(ICU),该单元包含有两个级联中断控制器,一个为主控制器,一个为从控制器。该中断控制单元就功能而言与工业上标准的82C59A是一致的,操作方法也相同。从片的INT连接到主片的IR2信号上构成两片8259的级联。
TD-PITE实验系统中,将主控制器的IR6、IR7以及从控制器的IR1开放出来供实验使用,主片8259的IR4供系统串口使用。8259的内部连接及外部管脚引出如图4.5:
图
4.1列出了中断控制单元的寄存器相关信息。
寄存器 | 口地址 | 功能描述 |
ICW1 ICW1 (只写) | 0020H 00A0H | 初始化命令字1 决定中断请求信号为电平触发还是边沿触发。 |
ICW2 ICW2 (只写) | 0021H 00A1H | 初始化命令字2 包含了8259IR01IR1 |
ICW3 (只写) | 0021H | 初始化命令字3 用于识别从8259IR82598259IR2 |
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所示。
图
2寄存器(ICW2)说明见图4.7所示。
图
3寄存器(ICW3)说明,主片见图4.8,从片见图4.9。
图
图
4寄存器(ICW4)说明见图4.10。
图
1寄存器(OCW1)说明见图4.11。
图
2寄存器(OCW2)说明如图4.12所示。
图
3寄存器(OCW3)说明如图4.13所示。
图
POLL)说明如图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 |
矢量地址 | 20H23H | 24H27H | 28H2BH | 2CH2FH | 30H33H | 34H37H | 38H3BH | 3CH3FH |
说明 | 未开放 | 未开放 | 未开放 | 未开放 | 串口 | 未开放 | 可用 | 可用 |
从片中断序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
功能调用 | 30H | 31H | 32H | 33H | 34H | 35H | 36H | 37H |
矢量地址 | C0HC3H | C4HC7H | C8HCBH | CCHCFH | D0HD3H | D4HD7H | D8HDBH | DCHDFH |
说明 | 未开放 | 可用 | 未开放 | 未开放 | 未开放 | 未开放 | 未开放 | 未开放 |
4.15所示,单次脉冲输出与主片8259的IR7相连,每按动一次单次脉冲,产生一次外部中断,在显示屏上输出一个字符“7”。
图
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”,说明响应了中断。
4.16所示,KK1+连接到主片8259的IR7上,KK2+连接到从片8259的IR1上,当按一次KK1+时,显示屏上显示字符“M7”,按一次KK2+时,显示字符“S1”。编写程序。
图
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 |
入口:AH=01H,AL=数据 功能:写AL中的数据到屏上 |
入口:AH=06H,DS:BX=字串首址,且字串尾用00H填充 功能:显示一字串,直到遇到00H为止 |
入口: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指定缓冲区中并以回车结束 |