8259a初始化程序怎么写

8259a初始化程序怎么写,第1张

ICW1:00010011

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)

  }

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11076776.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存