/*时间中断定义*/
# define TIMER 0x1c
int t=0;
void interrupt(*oldhandler)();
void interrupt newhandler() /*定义新的时间中断处理函数*/
{
t++;
oldhandler();
}
/*设置时间中断*/
void SetTimer(void interrupt(*IntProc)())
{
oldhandler=getvect(TIMER); /*保存原中断调用函数*/
disable(); /*禁止*/
setvect(TIMER,IntProc); /*设置新的时间中断处理函数*/
enable(); /*开启*/
}
/*时间中断结束*/
void KillTimer()
{
disable(); /*禁止中断*/
setvect(TIMER,oldhandler); /*还原时间中断*/
enable(); /*允许中断*/
}
有点难理解 我再转贴篇文章
为了能够计算打字的时间并同时在屏幕上显示出来,比较好的办法就是修改中断服务程序。
在BIOS(基本输入输出系统)中的第0x1c号中断是一个时钟中断,它每秒钟产生18.2次的中断。该中断实际上不起什么作用,它是一个只有一条中断返回语句的空中断。在程序执行中,将第0x1c号中断的地址向量指向另外编写的一个中断处理程序(函数):
void far interrupt handler(void)。
方法是:setvect(0x1c,handler)。
在修改0x1c的中断向量之前,还必须将原来的中断向量保存起来。以便在程序结束时恢复原来的中断向量,否则即使程序运行结束了计时也不会停下来。因此程序中设置了一个函数指针用来保存原来的中断向量:
interrupt far (*oldhandler)(void)。
使用语句oldhandler=getvect(0x1c)把原来的中断向量保存在oldhandler中。要恢复原来的中断向量,用setvect(0x1c,oldhandler)即可完成,同时也起到停止计时的作用。
在下面的中断处理程序中,sj是时钟中断累加器,每产生一次时钟中断,sj便加1,当达到18次时,表示时间经过了1秒钟,则秒数增加1。实际上因为BIOS每秒钟产生18.2次的中断,5秒钟便产生91次中断,而前面的方法5秒钟产生90次中断,显然这种方法有误差,因此程序中设置了一个计数器count,当count达到5时让sj累加19次才进1秒。
void far interrupt handler(void)
{char sec[3]="0",min[3]="0",temp[3];
sj++; /*时钟中断次数累加器加1*/
if (sj>=18) /*时钟中断次数达到18次,即时间经过了1秒钟*/
{count++; /*计数器加1*/
Second++; /*秒数增加1秒*/
if (Second>=60) /*若秒数达到60,则秒复位为0,而分增加1*/
{Second=0;
Minute++;
}
if (Minute<10)
{itoa(Minute,temp,10); strcat(min,temp);}
else
itoa(Minute,min,10);
if (Second<10)
{itoa(Second,temp,10); s
trcat(sec,temp);}
else
itoa(Second,sec,10);
WriteString(24,72,0x70,min,2); /*在第24行72列显示分钟 */
WriteString(24,74,0x70,":",1);
WriteString(24,75,0x70,sec,2); /*显示秒钟 */
if (count==5) /*若计数器达到5,让sj延长1次中断*/
{count=0;sj=-1;}
else
sj=0;
}
}
[此贴子已经被作者于2004-12-15 22:46:06编辑过]