ICW2:10000000
ICW3:不需要
ICW4:00010011
ICW1写入200H端口地址
ICW2和ICW4写入201H端口地址
初始化编程为:
MOV AL,13H
OUT 200H,AL 设置ICW1(边沿触发,单片,需要ICW4)
MOV AL,80H
OUT 201H,AL 设置ICW2(中断类型号)
MOV AL.13H
OUT 201H,AL 设置ICW4(特殊全嵌套,非缓冲,自动中断结束)
望采纳祝你生活愉快。
中断控制器8259A的初始化尤为复杂,他的控制字、方式字相对于8253 8255要多。就给你一道例题吧。
某微机系统使用主、从两片8259A管理中断,从片中断请求INT与主片的IR2连接。设主片工作于特殊完全嵌套、非缓冲和非自动结束方式,中断类型号为40H,端口地址为20H和21H。从片工作于完全嵌套、非缓冲和非自动结束方式,中断类型号为70H,端口地址为80H和81H。试编写主片和从片的初始化程序。
根据题意,写出ICW1, ICW2, ICW3和ICW4的格式,按图6.21的顺序写入。编写初始化程序如下:
主片8259A的初始化程序如下:MOV AL, 00010001B 级联, 边沿触发, 需要写ICW4
OUT 20H, AL 写ICW1
MOV AL, 01000000B 中断类型号40H
OUT 21H, AL 写ICW2
MOV AL, 00000100B 主片的IR2引脚接从片
OUT 21H, AL 写ICW3
MOV AL, 00010001B 特殊完全嵌套、非缓冲、自动结束
OUT 21H, AL 写ICW4
从片8259A初始化程序如下:
MOV AL, 00010001B 级联, 边沿触发, 需要写ICW4
OUT 80H, AL 写ICW1
MOV AL, 01110000B 中断类型号70H
OUT 81H, AL 写ICW2
MOV AL, 00000010B 接主片的IR2引脚
OUT 81H, AL 写ICW3
MOV AL, 00000001B 完全嵌套、非缓冲、非自动结束
OUT 81H, AL 写ICW4
建议楼主多看看课本,理解里面控制字方式字的格式,多看看例题。
下面是初始化8259A的代码:void init_8259A(byte master_vector,byte slave_vector){
outportb (PORT_8259A_M, 0x11)
outportb (PORT_8259A_S, 0x11)
outportb (PORT_8259A_M+1, master_vector)
outportb (PORT_8259A_S+1, slave_vector)
outportb (PORT_8259A_M+1, 1<<2)
outportb (PORT_8259A_S+1, 2)
outportb (PORT_8259A_M+1, 1)
outportb (PORT_8259A_S+1, 1)
}在介绍完初始化这几个命令后,我们开始介绍如何通过OCW对8259A进行 *** 作。OCW1:该命令用来屏蔽所设定的中断请求。其 *** 作方式是,向你要屏蔽的中断请求所在的8259A发送一个 *** 作控制字。需要屏蔽哪个中断请求就将该字上相应的位置1即可。实例代码如下:#define PORT_INT_MASK_M 0x21
#definePORT_INT_MASK_S 0xA1void mask_IRQ(byte IRQ)
{
byte mask if(IRQ >15)
return if(IRQ <8)
{
mask = inportb(PORT_INT_MASK_M)
mask |= 1 <<IRQ
outportb(PORT_INT_MASK_M, mask)
}
else
{
mask = inportb(PORT_INT_MASK_S)
mask |= 1 <<(IRQ-8)
outportb(PORT_INT_MASK_S, mask)
}
}void unmask_IRQ(byte IRQ)
{
byte mask if(IRQ >15)
return if(IRQ <8)
{
mask = inportb(PORT_INT_MASK_M)
mask &= !(1 <<IRQ)
outportb(PORT_INT_MASK_M, mask)
}
else
{
mask = inportb(PORT_INT_MASK_S)
mask &= !(1 <<(IRQ-8))
outportb(PORT_INT_MASK_S, mask)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)