/*
DELAY.INC
*/
void InitTimer() /* 初始化整个延时系统,结束必须要调用EndTimer */
{
int i;
if( IsInit ) return;
disable();
old_int8=getvect(0x8);
setvect(0x8,new_int8); /* 安装时钟中断,以保证精确的延时 */
enable();
for( i=0;i<MAXTIMERS;TICKS[i].id=-1,TICKS[i].timeout=0,TICKS[i].ticks=0,i++ );
IsInit=1;
}
int CreateTimer(UINT dida,UINT id) /* 创建一个要求延时请求的例子 */
{ /* did滴达数;id这个例子的ID,ID 必须为一个整数,用来识别不同的例子 */
int i;
for( i=0;i<MAXTIMERS;i++ )
if( TICKS[i].id==-1 && IsInit ){
TICKS[i].id=id; TICKS[i].delayticks=dida; TICKS[i].timeout=0; return(OK);}
return(ERROR); /* 未创建成功,原因为例子已满 */
}
int CheckTimeOut(UINT id) /* 在主程序中调用,用来判断id的例子延时到来否 */
{
int i;
for( i=0;i<MAXTIMERS;i++)
if( TICKS[i].id==id )
if( TICKS[i].timeout ){ TICKS[i].timeout=0; return(OK); }
return(ERROR);
}
void Delay(UINT dida) /* 一段用来代替delay函数的代码,延时以dida为单位 */
{
TICKS[MAXTIMERS-1].id=1;
TICKS[MAXTIMERS-1].delayticks=dida;
TICKS[MAXTIMERS-1].ticks=0;
TICKS[MAXTIMERS-1].timeout=0;
while( !TICKS[MAXTIMERS-1].timeout );
TICKS[MAXTIMERS-1].id=-1;
TICKS[MAXTIMERS-1].timeout=0;
}
void ReleaseTimer(UINT id) /* 当要求的例子不用时,应释放,以节省资源 */
{
int i;
for( i=0;i<MAXTIMERS;i++ )
if( TICKS[i].id==id ){ TICKS[i].id=-1; break; }
}
void EndTimer() /* 当完成延时后应调用,否则在程序退出后,系统死机 */
{
if( !IsInit ) return;
disable();
setvect(0x8,old_int8);
enable();
IsInit=0;
}
void interrupt new_int8() /* 时钟中断,中断级别0 */
{ int i;
(*old_int8)();
for(i=0;i<MAXTIMERS;i++){
if( TICKS[i].id>=0 ) TICKS[i].ticks++;
if( TICKS[i].ticks>=TICKS[i].delayticks ){
TICKS[i].timeout=1;
TICKS[i].ticks=0;
}
}
}