📄 otimer.c
字号:
//#define OTimer_Macro_10msTH (65536 - (11059200 / 12) / 900) / 256 //定时450HZ
//#define OTimer_Macro_10msTL (65536 - (11059200 / 12) / 900) % 256 //定时450HZ
#define OTimer_Macro_10msTH 0xf8//0xFC //定时450HZ
#define OTimer_Macro_10msTL 0x00//0x00 //定时450HZ
/*
#define OTIMER_MEM_SEL idata
#define OTimer_Macro_MaxLogicTimerNum 4 //最大逻辑定时器数量//
#define OTimerID0 0
#define OTimerID1 1
#define OTimerID2 2
#define OTimerID3 3
#define OTimerID4 4
#define OTimerID5 5
#define OTimerID6 6
#define OTimerID7 7
uchar OTIMER_MEM_SEL OTimer_RD_1msCounter ; //1ms计数器
uchar OTIMER_MEM_SEL OTimer_RD_Status; //逻辑定时器状态 1:发生了 0:未发生
uchar OTIMER_MEM_SEL OTimer_RD_Enable; //逻辑定时器允许位 1:启动 0:为启动
uchar OTIMER_MEM_SEL OTimer_RD_Mode; //逻辑定时器模式 1:重载 0:单次
uchar OTIMER_MEM_SEL OTimer_RD_Interval[OTimer_Macro_MaxLogicTimerNum]; //逻辑定时器定时值
uchar OTIMER_MEM_SEL OTimer_RD_DecCounter[OTimer_Macro_MaxLogicTimerNum];
*/
/************************************************
Name : 定时器初始化.
Date : 10:29PM 03/05/02
*************************************************/
void Sys_TimerInit()
{
ET1 = 0; /* Forbid T0 INT */
TMOD = (TMOD & 0x0f) | 0x10; /*方式1*/
TF1 = 0; /* Reset */
TH1 = OTimer_Macro_10msTH; /* VER 99 */
TL1 = OTimer_Macro_10msTL;
/* OTimer_RD_1msCounter = 0 ;
OTimer_RD_Status = 0;
OTimer_RD_Enable = 0;
OTimer_RD_Mode = 0 ;
*/
ET1 = 1; // Permit T0 INT //
PT1 = 0; // Lower Priority //
TR1 = 1; // Start T0 /
return ;
}
void OTimer_Interrupt()
{
// uchar i,temp ;
TH1 = OTimer_Macro_10msTH;//1.1ms定时
TL1 = OTimer_Macro_10msTL;
/*
if(Sign_Music_flag == 1)
SWMUISC = !SWMUISC ;
Check_Mode_Conter() ;
Phone_ToneCheck() ;
OTimer_RD_1msCounter++ ;
if(OTimer_RD_1msCounter >= 90) //100ms 定时到
{
OTimer_RD_1msCounter = 0 ;
temp = 1;
for(i = 0; i < 4; i++)
{
if(((OTimer_RD_Enable >> i) & 1) == 1)
{
OTimer_RD_DecCounter[i] --;
if(OTimer_RD_DecCounter[i] == 0) //定时到
{
OTimer_RD_Status |= (temp << i);
if(((OTimer_RD_Mode >> i) & 1) == 1) //重载定时器
{
OTimer_RD_DecCounter[i] = OTimer_RD_Interval[i];
}
else //释放定时器
{
OTimer_RD_Enable &= ((temp << i) ^ 0xFF);
}
}
}
}
}*/
}
/************************************************
Name : Sys_TimerReqire
Describ : 逻辑定时器申请. 定时误差为1个TICK.
*************************************************
uchar Sys_TimerReqire(uchar OTimerID, uchar Interval, uchar Mode)
{
uchar temp_ret;
temp_ret = 0x01;
//申请空余定时器/
if(OTimerID > OTimerID4)
{
return (FALSE) ;
}
if (Interval == 0) // 立即执行
{
OTimer_RD_Status |= (temp_ret << OTimerID);
return (TRUE) ;
}
OTimer_RD_Interval[OTimerID] = Interval;
OTimer_RD_DecCounter[OTimerID] = Interval;
OTimer_RD_Enable |= (temp_ret << OTimerID);
OTimer_RD_Status &= ((temp_ret << OTimerID) ^ 0xFF);
if(Mode == 0)
OTimer_RD_Mode &= ((temp_ret << OTimerID) ^ 0xFF);
else
OTimer_RD_Mode |= (temp_ret << OTimerID);
return (TRUE) ;
}
*/
/************************************************
Name : 释放定时器.
Describ : 释放指定逻辑定时器.
************************************************
void Sys_TimerRelease(uchar OTimerID)
{
uchar temp_ret ;
temp_ret = 0x01;
if(OTimerID > OTimerID4)
{
return;
}
OTimer_RD_Enable &= ((temp_ret << OTimerID) ^ 0xFF);
OTimer_RD_Status &= ((temp_ret << OTimerID) ^ 0xFF);
return ;
}
*/
/**********************************
逻辑定时器查询
输入:无
输出:逻辑定时器号
**********************************
uchar Analyse_OTimerID()
{
uchar i,temp_buffer;
uchar temp_ret;
temp_ret = 1;
temp_buffer = OTimer_RD_Status;
for(i = 0; i < 4; i++)
{
if((temp_buffer & 1) == 1)
break;
temp_buffer >>= 1;
}
if(i < 8)
OTimer_RD_Status &= ((temp_ret << i) ^ 0xFF);
return(i);
}
*/
/************************************************
Name : 清除定时器.
Describ : 清除所有逻辑定时器. (不建议使用)
Input : 无
Output : 无
************************************************
void Sys_TimerClear()
{
OTimer_RD_Enable = 0;
OTimer_RD_Status = 0;
}
void time(uint delaytime)
{
while(--delaytime) ;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -