📄 timer.c
字号:
#include "TypeDef.h"
#include "System.h"
#include "AT78E58BP.H"
#include "Timer.h"
#include <stdlib.h>
#include <intrins.h>
//------------------------------------------------------------------------------
//Comm Public:公有通用函数与成员
//------------------------------------------------------------------------------
uchar Reload_TH0;
uchar Reload_TL0;
//------------------------------------------------------------------------------
//Comm Private:私有函数和成员
//------------------------------------------------------------------------------
st_TimerHandle *TimerListHeader;
Uchar CreatedUserTimer;
idata TProcess TimerEventBuf[MaxTimerEvent];
idata uchar TEvent_Head;
idata uchar TEvent_Trail;
//------------------------------------------------------------------------------
//函数实现部分
//------------------------------------------------------------------------------
//功 能:定时器0中断入口函数
//返回值:
//参 数:
//------------------------------------------------------------------------------
void Timer0_Event(void) interrupt 1 //using 3
{
register st_TimerHandle *Point;
TF0=0;
Point=TimerListHeader;
while(Point!=NULL)
{
if(Point->Opened)
{
if(Point->EventCount==0)
{
TimerEventBuf[TEvent_Head]=Point->ProcAddr;
if((TEvent_Head+1)%MaxTimerEvent!=TEvent_Trail)
TEvent_Head=(TEvent_Head+1)%MaxTimerEvent;
Point->EventCount=Point->InitCount;
}else Point->EventCount--;
};//end if
Point=Point->NextTimer;
};//end while
TH0=Reload_TH0;
TL0=Reload_TL0;
}
//------------------------------------------------------
void InitSysTimer0(Uchar IntTimer)
{
register Uchar i;
TimerListHeader=0x00;
CreatedUserTimer=0x00;
for(i=0;i<MaxTimerEvent;i++) TimerEventBuf[i]=NULL;
TMOD_Map=(TMOD_Map&Time1_MOD)|Time0_InitMOD;
SetTMOD(TMOD_Map);
ET0=false;
TR0=false;
/*if(IntTimer==TimeInt_5ms)
{
TH0=TM16_5ms_H;
TL0=TM16_5ms_L;
Reload_TH0=TM16_5ms_H;
Reload_TL0=TM16_5ms_L;
};//end if
if(IntTimer==TimeInt_10ms)
{
TH0=TM16_10ms_H;
TL0=TM16_10ms_L;
Reload_TH0=TM16_10ms_H;
Reload_TL0=TM16_10ms_L;
};//end if*/
if(IntTimer==TimeInt_10ms)
{
TH0=TM16_10ms_H;
TL0=TM16_10ms_L;
Reload_TH0=TM16_10ms_H;
Reload_TL0=TM16_10ms_L;
};//end if
}
//------------------------------------------------------
bool OpenSysTimer0(void)
{
ET0=true;
TR0=true;
return ET0&&TR0;
}
//------------------------------------------------------
/*bool CloseSysTimer0(void)
{
ET0=false;
TR0=false;
return ET0||TR0;
}*/
//------------------------------------------------------
bool OpenUserTimer(st_TimerHandle *HandleID)
{
HandleID->Opened=true;
HandleID->EventCount=HandleID->InitCount;
return (bool)HandleID->Opened;
}
//------------------------------------------------------
/*bool CloseUserTimer(st_TimerHandle *HandleID)
{
HandleID->Opened=false;
HandleID->EventCount=0;
return (bool)HandleID->Opened;
}*/
//------------------------------------------------------
bool InstallUserTimer(st_TimerHandle * HandleID,Uint Interval)
{
register st_TimerHandle *Point;
if(CreatedUserTimer>=MaxUserTimerCount) return false;
if(TimerListHeader!=NULL)
{
Point=TimerListHeader;
while(Point->NextTimer!=NULL) Point=Point->NextTimer;
Point->NextTimer=HandleID;
}else TimerListHeader=HandleID; //end if
HandleID->Opened=false;
HandleID->InitCount=Interval;
HandleID->EventCount=0;
HandleID->NextTimer=NULL;
HandleID->ProcAddr=NULL;
CreatedUserTimer++;
return true;
}
//------------------------------------------------------
/*bool UnInstallUserTimer(st_TimerHandle * HandleID)
{
st_TimerHandle *PrecPoint;
st_TimerHandle *FindPoint;
bool Result=false;
PrecPoint=NULL;
FindPoint=TimerListHeader;
while(FindPoint!=NULL)
{
if(FindPoint==HandleID) break;
PrecPoint=FindPoint;
FindPoint=FindPoint->NextTimer;
};//end if
if(FindPoint!=NULL)
{
if(PrecPoint!=NULL)
{
PrecPoint->NextTimer=FindPoint->NextTimer;
FindPoint->NextTimer=NULL;
}else TimerListHeader=FindPoint->NextTimer;
Result=true;
CreatedUserTimer--;
};//end if
return Result;
}*/
//------------------------------------------------------
void SetTimerProc(st_TimerHandle * HandleID,TProcess Addr)
{
HandleID->ProcAddr=Addr;
}
//------------------------------------------------------------
void TimerWork(void)
{
register TProcess Process=NULL;
if(TEvent_Trail!=TEvent_Head)
{
Process=TimerEventBuf[TEvent_Trail];
TEvent_Trail=(TEvent_Trail+1)%MaxTimerEvent;
};//end if
if(Process!=NULL) Process();
}
//-------------------------------------------------------------
/*bool GetTimerOpened(st_TimerHandle * HandleID)
{
return (bool)HandleID->Opened;
}
//-------------------------------------------------------------*/
/*void SetTimerInterval(st_TimerHandle * HandleID,uint Interval)
{
HandleID->EventCount=Interval;
HandleID->InitCount=Interval;
}
//------------------------------------------------------------------------------
void Delay_10_uS(void)
{
//char i=;
//char i=20;
// while(i--);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}*/
//------------------------------------------------------------------------------
void ms_delay( uint n_milisecond)
{
uchar i;
while(n_milisecond--)
{
//i=37;
i=74;
while(i--);
};//end if
}
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -