我不能说出原因,但给你一个我写过的程序,供你参考.
// Interupt.cpp: implementation of the Interupt class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
void (__interrupt __far *old_vect)();
void __interrupt __far TimerNormal(); //常规处理
#define IRQ3 0x0b
#define OR3 0x08 //_ _ _ _ 1 _ _ _
#define AND3 0xf7 //_ _ _ _ 0 _ _
#define BASE 0x200 //板卡地址
void set_timer_interrupt() ;
int data,min;
void SubNormal(void);
void OpenInterupt(void);
void CloseInterupt(void);
void SetInterupt(void);
void IniInterupt(void);
void SetTimer(void);
/**
* 常规处理
*/
void __interrupt __far TimerNormal()
{
_disable(); //关CPU中断
SubNormal();
outp(0x20,0x20); //8259中断
_enable(); //开CPU中断
}
void SubNormal(void)
{
static bool n;
if(n)
{
outp(0x201, 0);
outp(0x202, 0);
outp(0x203, 0);
outp(0x204, 0);
n = false;
}
else
{
outp(0x201, 0xff);
outp(0x202, 0xff);
outp(0x203, 0xff);
outp(0x204, 1);
n = true;
}
data++;
min = data/50;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/**
* 开中断
*
*/
void OpenInterupt(void) //开中断
{
_enable();//开CPU中断
}
/**
* 关中断
*
*/
void CloseInterupt(void)
{
unsigned char a;
_dos_setvect(IRQ3,old_vect);//恢复原有中断
a = inp(0x21);
a = a | OR3; //8259 IR3中断
outp(0x21,a);
}
/**
* 设置中断
*
*/
void SetInterupt(void)
{
IniInterupt(); //中断初始化
SetTimer(); //定时器
OpenInterupt(); //开中断
}
/**
* 中断初始化
*
*/
void IniInterupt(void)
{
unsigned char a;
old_vect = _dos_getvect(IRQ3); //保存当前中断向量 中断
_disable(); //关CPU中断
_dos_setvect( IRQ3,TimerNormal); //设置中断向量
a = inp(0x21); //8259 IR5中断
a = a & AND3;
outp(0x21,a); //开中断5
}
/**
* 设置定时器20ms
*
*/
void SetTimer(void)
{
outp(BASE+0x7,0xb6); // counter2 mode 3
outp(BASE+0x6,0xd0); // cycle is 1ms
outp(BASE+0x6,0x7); // c1=2000=0x7d0;
outp(BASE+0x7,0x76); // counter1 mode 3
outp(BASE+0x5,0x14); // cycle is 20ms
outp(BASE+0x5,0x00); // c2=20=0x014
}
void main()
{
SetInterupt();
data=0;
for(;;)
{
SubNormal();
printf("data==+==%d====%d\n",data,min);
}
}