EGL--延时函数实现文件 DELAY.INC

来源:互联网 发布:广电网络集团 编辑:程序博客网 时间:2024/05/01 13:57

/*
  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;
      }
    }
}


原创粉丝点击