大家好:本人是个初学编程的菜鸟,最近想编个俄罗斯方块的游戏,但是不知道时间中断改如何定义,我原先用delay()函数,但是速度太快了,10000毫秒也快的惊人,请教一个各位大虾改如何实现这个问题!
/*时间中断定义*/ # 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编辑过]