阅读:2077回复:2
我的第100贴,献给double斑竹。C语言硬件中断。
那天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] |
|
|
沙发#
发布于:2002-11-21 15:19
支持!
|
|
|
板凳#
发布于:2002-11-21 16:53
非常感谢rudolf兄的第一百贴,我深感荣幸。同时我也希望大家不要被数字电路基础这个名字束缚着,其实只要大家志同道合,什么贴子都可以网上贴吗。大家一起来探讨。再次感谢,rudolf兄的支持和帮助。
|
|
|