判断中断c语言程序设计,8259A中断控制器的C语言编程

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的设置来和某一根中断相连接才能进行中断申请。

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

程序流程图:

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

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

}

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值