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

2009-5-8 21:51 4744 8 8 分类: MCU/ 嵌入式

PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。IBMPCPC/XT机内有一片8259中断控制器对外可以提供8个中断源:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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


IRQ0      08H        时钟


IRQ1      09H        键盘


IRQ2      0AH              保留


IRQ3      OBH              串行口2


IRQ4      0CH        串行口1


IRQ5      0DH              硬盘


IRQ6      0EH        软盘


IRQ7      0FH        并行打印机


8个中断源的中断请求信号线IRQ0IRQ7在主机的62线ISA总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。对于PC/AT286以上微机内又扩展了一片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的设置来和某一根中断相连接才能进行中断申请。


 


 


 


 


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


 


程序流程图:


89870af6-5355-4527-a289-c9e0a228920b.JPG


 


#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);


                     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");


}


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


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


 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条