?? otimer.c
字號:
extern void Phone_ToneCheck() ;
extern void Check_DXC_Conter() ;
#define OTimer_Macro_MaxLogicTimerNum 8 /*最大邏輯定時器數量*/
#define OTimer_Macro_10msTH /*0x9E*/ 0xDC /*4M晶振,10ms定時器中斷定時值*/
#define OTimer_Macro_10msTL /*0x57*/ 0x17 /*10ms定時器中斷定時值*/
#define OTimerID0 0
#define OTimerID1 1
#define OTimerID2 2
#define OTimerID3 3
#define OTimerID4 4
#define OTimerID5 5
#define OTimerID6 6
#define OTimerID7 7
static uchar OTimer_RD_10msCounter ; //10ms計數器
//static uchar OTimer_RD_100msCounter ; //100ms級計數器
//static uint OTimer_RD_Counter; //秒級系統計數器
static uint OTimer_RD_DelayCounters ; //延時計數器
static uchar OTimer_RD_Status; //邏輯定時器狀態 1:發生了 0:未發生
static uchar OTimer_RD_Enable; //邏輯定時器允許位 1:啟動 0:為啟動
static uchar OTimer_RD_Mode; //邏輯定時器模式 1:重載 0:單次
static uchar OTimer_RD_Interval[OTimer_Macro_MaxLogicTimerNum];//邏輯定時器定時值
static uchar OTimer_RD_DecCounter[OTimer_Macro_MaxLogicTimerNum];
extern void OTel_Rece_DTMF() ;
/************************************************
Name : 定時器初始化.
Date : 10:29PM 03/05/02
*************************************************/
void Sys_TimerInit()
{
ET0 = 0; /* Forbid T0 INT */
TMOD = (TMOD & 0xf0) | 0x01; /*方式1*/
TF0 = 0; /* Reset */
TH0 = OTimer_Macro_10msTH; /* VER 99 */
TL0 = OTimer_Macro_10msTL;
/*重載定時器*/
OTimer_RD_10msCounter = 0;
// OTimer_RD_100msCounter = 0;
OTimer_RD_Status = 0;
OTimer_RD_Enable = 0;
EA = 1 ; /* CPU Open INT */
ET0 = 1; /* Permit T0 INT */
PT0 = 0; /* Lower Priority */
TR0 = 1; /* Start T0 */
// OTimer_RD_Counter = 0xffff ;
return ;
}
/************************************************
Name : Sys_TimerReqire
Describ : 邏輯定時器申請. 定時誤差為1個TICK.
*************************************************/
uchar Sys_TimerReqire(uchar OTimerID, uchar Interval, uchar Mode)
{
uchar temp_ret;
ET0 = 0; /* Forbid */
temp_ret = 0x01;
/*申請空余定時器*/
if(OTimerID > OTimerID7)
{
ET0 = 1;
return (ERROR);
}
if (Interval == 0) /* 立即執行 */
{
OTimer_RD_Status |= (temp_ret << OTimerID);
ET0 = 1;
return (OK);
}
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);
ET0 = 1;
return (OK);
}
void OTimer_RP_Interrupt() interrupt 1 using 2
{
uchar i,temp_ret;
TH0 = OTimer_Macro_10msTH;//10ms定時
TL0 = OTimer_Macro_10msTL;
OTimer_RD_10msCounter ++;
OTimer_RD_DelayCounters ++;
Phone_ToneCheck() ;
Check_DXC_Conter() ;
OTel_Rece_DTMF() ;
display_Line() ;
if (OTimer_RD_10msCounter != 10) return;
OTimer_RD_10msCounter = 0;
// OTimer_RD_100msCounter ++ ;
// if (OTimer_RD_100msCounter == 10)
// {
// OTimer_RD_100msCounter = 0;
// OTimer_RD_Counter ++ ; /*秒級系統計數器*/
// }
/*每100ms做以下工作*/
temp_ret = 1;
for(i = 0; i < 8; i++)
{
if(((OTimer_RD_Enable >> i) & 1) == 1)
{
OTimer_RD_DecCounter[i] --;
if(OTimer_RD_DecCounter[i] == 0) //定時到
{
OTimer_RD_Status |= (temp_ret << i);
if(((OTimer_RD_Mode >> i) & 1) == 1) //重載定時器
{
OTimer_RD_DecCounter[i] = OTimer_RD_Interval[i];
}
else //釋放定時器
{
OTimer_RD_Enable &= ((temp_ret << i) ^ 0xFF);
}
}
}
}
}
/************************************************
Name : 釋放定時器.
Describ : 釋放指定邏輯定時器.
*************************************************/
void Sys_TimerRelease(uchar OTimerID)
{
uchar temp_ret ;
ET0 = 0 ;
temp_ret = 0x01;
if(OTimerID > OTimerID7)
{
ET0 = 1;
return;
}
OTimer_RD_Enable &= ((temp_ret << OTimerID) ^ 0xFF);
OTimer_RD_Status &= ((temp_ret << OTimerID) ^ 0xFF);
ET0 = 1 ;
return ;
}
/**********************************
邏輯定時器查詢
輸入:無
輸出:邏輯定時器號
**********************************/
uchar Analyse_OTimerID()
{
uchar i,temp_buffer;
uchar temp_ret;
temp_ret = 1;
temp_buffer = OTimer_RD_Status;
for(i = 0; i < 8; i++)
{
if((temp_buffer & 1) == 1)
break;
temp_buffer >>= 1;
}
if(i < 8)
OTimer_RD_Status &= ((temp_ret << i) ^ 0xFF);
return(i);
}
/*************************************************
Name :延時程序。
Describ :最長延時65s
Input :無
Output :無
*************************************************/
void delay(uint DelayTime)
{
ET0 = 0;
DelayTime /= 10; /* VER 99 */
OTimer_RD_DelayCounters = 0;
ET0 = 1;
while (OTimer_RD_DelayCounters < DelayTime)
{
IDLE;
}
}
/************************************************
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 + -