新闻  |   论坛  |   博客  |   在线研讨会
8259A中断控制器的C语言编程
0750long | 2009-05-13 15:39:26    阅读:3138   发布文章

8259A中断控制器的C语言编程

 

PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源:

中断源    中断类型号           中断功能

IRQ0      08H        时钟

IRQ1      09H        键盘

IRQ2      0AH              保留

IRQ3      OBH              串行口2

IRQ4      0CH        串行口1

IRQ5      0DH              硬盘

IRQ6      0EH        软盘

IRQ7      0FH        并行打印机

8个中断源的中断请求信号线IRQ0~IRQ7在主机的62线ISA总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。对于PC/AT及286以上微机内又扩展了一片8259中断控制,IRQ2用于两片8259之间级连,对外可以提供16个中断源:

中断源    中断类型号           中断功能

IRQ8      070H             实时时钟

IRQ9      071H             用户中断

IRQ10     072H             保留

IRQ11     O73H             保留

IRQ12     074H             保留

IRQ13     075H             协处理器

IRQ14     076H             硬盘

IRQ15     077H             保留

PCI总线中的中断线只有四根,INTA#、INTB#、INTC#、INTD#,它们需要通过P&P的设置来和某一根中断相连接才能进行中断申请。

 

 

 

 

直接用手动产单脉冲作为中断请求信号

 

程序流程图:

 

#include<dos.h>

#include<stdio.h>

#define cent 0xC000

#define inttype 0x0D

void interrupt myint();

void interrupt(*oldint)();

static int counter="0";

char led[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/*数码管段码*/

 

void interrupt myint()

{

       counter++;

       printf("this is %dth interrupt..\n",counter);

       outportb(0xC400,0x00);

       delay(10000);

       outportb(0xa0,0x20);

       outportb(0x20,0x20);        /* Send EOI */

}

 

main()

{

       int cent0;

       int cent1;

       int cent2;

       int i,j;

       int A;

 

       A=cent+0x68;             /*设置 tpc 卡中9054芯片io口,使能中断*/

       cent0=inport(A);    /*read state*/

       cent0=cent0|0x900;

       outport(A,cent0);

       oldint=getvect(inttype);              /*保存原中断向量*/

           /*save inerrupt vector*/

       disable();

       setvect(inttype,myint);      /*set new vector*/

       cent1=inportb(0x21);

       cent1=cent1&0xdf;

       outportb(0x21,cent1);

       cent2=inportb(0xa1);

       cent2=cent2&0xff;

       outportb(0xa1,cent2);                 /*set interrupt hide code*/

       enable();

       printf("this program will run 10 times and exit..\n");

       printf("enable now.....waiting....\n");

       while(counter<10&&!kbhit())

       {

              for(i=0;i<10;i++)

              {

                     outportb(0xC400,~led[i]);

                     for(j=0;j<300;j++)

                     {

                            delay(1000);

                     }

              }

 

       }

       disable();

       cent1=0xdf;

       cent1=~cent1;

       cent2=inportb(0x21);

       cent2=cent2|cent1;

       outportb(0xa1,cent2);               /*revover interrupt hide code*/

       setvect(inttype,oldint);

       cent0=inportb(A);

       cent0=cent0|0xf7ff;

       outport(A,cent0);            /*设置 tpc 卡中9054芯片io口,关闭中断*/

       printf("done..\n");

}

数码管从一到九反复显示,有中断来时数码管全灭。键盘上有任意键按下或者已经中断了十次就自动退出执行。

而且在计算机屏幕上显示这是第几次中断。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客