rudolf
驱动小牛
驱动小牛
  • 注册日期2002-10-09
  • 最后登录2006-04-25
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:2077回复:2

我的第100贴,献给double斑竹。C语言硬件中断。

楼主#
更多 发布于:2002-11-21 15:06
那天double斑竹在做宣传,我也来看了看,但一想,人家刚开张总不好灌水吧,所以就没吱声,结果double老大就说我.....
现在就把我这两天研究硬件中断的代码贴出来好了。
(虽然和数字电路无关但还是希望double老大笑纳)
(另外本代码的到了其他几个板块网友的支持,在这里说声谢谢!:))

 #include <conio.h>
 #include <dos.h>
 #include <bios.h>
 #include <stdio.h>

#define INTR 0x73    // IRQ11
/*IRQ对应关系:
  IRQ0  0x08
  ....
  IRQ3  0x0b
  ....
  IRQ7  0x0f
  IRQ8  0x70
  ....
  IRQ15 0x77
*/
#ifdef __cplusplus
#define __CPPARGS ...
#else
    #define __CPPARGS
#endif
void interrupt ( *OldIrq)(__CPPARGS);
void interrupt NewIrq(__CPPARGS);
unsigned long int Counter=0;
char flag=0;

void main()
{
int temp;

clrscr();                          //清屏
/*中断初始化*/
OldIrq = getvect(INTR);            //保存环境变量
setvect(INTR,NewIrq);              //设定中断
temp = inportb(0x21) & 0xFB;       //打开主片IRQ2  即11111011  0为允许,1为禁止
        outportb(0x21, temp);              
        temp = inportb(0xA1) & 0xF7;       //打开从片IRQ11 即11110111  0为允许,1为禁止
        outportb(0xA1, temp);
/*显示结果*/
printf(\"Begin(%i): \\n\",INTR);
while(bioskey(1)==0){              //若有键按下则推出
 if(flag==1&&(Counter%1000==0)){  //若接收到新的中断则打印提示
    printf(\" %lu\",Counter);       //打印提示
    flag=0;                       //中断标志置0
 }
}
printf(\"LUCKEY!\");
/*关闭中断*/
setvect(INTR, OldIrq);            //恢复原中断向量
temp = inportb(0x21) | ~(0xFB);   //关主片IRQ2
outportb(0x21, temp);
temp = inportb(0xA1) | ~(0xF7);   //关从片IRQ11
outportb(0xA1, temp);
}

/*中断调用程序*/
void interrupt NewIrq(__CPPARGS)
{
    disable();                            //关中断
    Counter++;                            //计数器加一
    outportb(0xA0,0x20);                  //硬件中断结束
    outportb(0x20,0x20);                  //硬件中断结束
    enable();                             //开中断
    flag=1;                               //中断标志置1
}

//说明:若使用非硬件中断则不需要对0x21、0xA1两个地址进行操作,修改INTR值即可。

霍霍,忘了编程环境:
OS:dos6.22 win98se2 win2kp
TOOL:BC31
:cool::o:cool: :D

[编辑 -  11/21/02 by  rudolf]
靠天靠地靠父母,不如靠自己。
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-21 15:19
支持!
生命驱动,活力无限!
double
论坛版主
论坛版主
  • 注册日期2002-03-30
  • 最后登录2015-05-05
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-21 16:53
非常感谢rudolf兄的第一百贴,我深感荣幸。同时我也希望大家不要被数字电路基础这个名字束缚着,其实只要大家志同道合,什么贴子都可以网上贴吗。大家一起来探讨。再次感谢,rudolf兄的支持和帮助。
轻轻的我来了 带给你欢乐 悄悄的我走了 带走你忧愁
游客

返回顶部