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
#include
#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");
}
数码管从一到九反复显示,有中断来时数码管全灭。键盘上有任意键按下或者已经中断了十次就自动退出执行。
而且在计算机屏幕上显示这是第几次中断。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。