heartwind
驱动牛犊
驱动牛犊
  • 注册日期2007-01-13
  • 最后登录2009-09-06
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2067回复:0

清各位帮忙看看这个并口中断程序!

楼主#
更多 发布于:2007-01-13 19:45
  下面是我写的一个并口中断程序,觉得没有什么问题,但就是不能产生中断。

我是用并口的/ack口作为中断(好像也只能用它)输入的。但是不知道有没有比较简便的产生中断信号的方法。

希望各位大侠帮忙解决。


#include <bios.h>
#include <dos.h>
#define DATA 0x378     /*并口基地址*/
#define STATUS DATA+1
#define CONTROL DATA+2
#define TRUE 1
#define FALSE 0

void open_isr(void);  /*安装中断*/
void clos_isr(void);  /*卸载中断*/
void int_proc(void);
void interrupt far intserv(void); /*中断处理子程序*/
int intlev=0x0f;
void interrupt far (*oldfunc)();   /*用于存放旧的中断入口地址*/
int int_ocr=FALSE;
int main(void)
{
    open_isr();
    outportb(CONTROL,inportb(CONTROL)|0x10);
    while(1) /*死循环等待中断*/
    {
        if(int_ocr)
        {int_ocr=FALSE;
        printf("IRQ Occured!");
        break;
        }

    }
    clos_isr();
    return(0);
}

void interrupt far intserv(void)
{
    disable();

    int_proc();
    int_ocr=TRUE;

    enable();
}

void open_isr(void)
{
    unsigned char int_mask;
    disable();
    oldfunc=getvect(intlev);
    setvect(intlev,intserv);
    int_mask=inportb(0x21);
    outportb(0x21,int_mask&~0x80);
    enable();
}

void clos_isr(void)
{
    int int_mask;
    disable();
    setvect(intlev,oldfunc);
    int_mask=inportb(0x21)|0x80;
    outportb(0x21,int_mask);
    enable();
}

void int_proc(void)
{
    outportb(0x20,0x20);
}

最新喜欢:

wingmanwingma...
游客

返回顶部