📄 timer.c
字号:
//**********************************************************************
// Clock Start
//**********************************************************************
void ClkStart( void )
{
//BTCTL = BTDIV+BTIP2+BTIP1;
/*#if Second_Div==63
+ BT_ADLY_16 // 1/64 = 16ms
#elif Second_Div==31
+ BT_ADLY_32 // 1/32 = 32ms
#elif Second_Div==15
+ BT_ADLY_64 // 1/16 = 64ms
#elif Second_Div==7
+ BT_ADLY_125 // 1/8 = 125ms
#endif
+ BTFRFQ0; // STK LCD 128Hz*/
// 设置中断频率为 0.5s, 液晶时钟原32分频 */
BTCTL = BT_fLCD_DIV32 | BT_fCLK2_DIV64 | BT_fCLK2_ACLK_DIV256;
// 1s 中断使能 */
IE2 |= BTIE;
}
//**********************************************************************
// Turn Clk (BCD) to Clk0 (binary)
//**********************************************************************
void ClkBcd_ClkHex( void )
{
SM.ClkHex.Sec[0] = BCD2Byte(SM.ClkBcd.Sec[0]);
SM.ClkHex.Min[0] = BCD2Byte(SM.ClkBcd.Min[0]);
SM.ClkHex.Hour[0] = BCD2Byte(SM.ClkBcd.Hour[0]);
SM.ClkHex.Day[0] = BCD2Byte(SM.ClkBcd.Day[0]);
SM.ClkHex.Mon[0] = BCD2Byte(SM.ClkBcd.Mon[0]);
SM.ClkHex.Year[0] = BCD2Byte(SM.ClkBcd.Year[0]);
SM.ClkHex.Week[0] = SM.ClkBcd.Week[0] & 7;
SM.ClkHexChk = ChkSum( (unsigned char*)&SM.ClkHex, sizeof(CLKDEF) );
}
//**********************************************************************
// Turn ClkHex (binary) to ClkBcd (BCD)
//**********************************************************************
void ClkHex_ClkBcd( void )
{
SM.ClkBcd.Sec[0] = Byte2BCD(SM.ClkHex.Sec[0]);
SM.ClkBcd.Min[0] = Byte2BCD(SM.ClkHex.Min[0]);
SM.ClkBcd.Hour[0] = Byte2BCD(SM.ClkHex.Hour[0]);
SM.ClkBcd.Day[0] = Byte2BCD(SM.ClkHex.Day[0]);
SM.ClkBcd.Mon[0] = Byte2BCD(SM.ClkHex.Mon[0]);
SM.ClkBcd.Year[0] = Byte2BCD(SM.ClkHex.Year[0]);
//if( SM.ClkBcd.Sec[0]==0 ) SM.ClkBcd.Week[0] = GetWeek();
SM.ClkBcdChk = ChkSum( (unsigned char*)&SM.ClkBcd, sizeof(CLKDEF) );
}
//**********************************************************************
// Turn YYMMDD to GmDay
//**********************************************************************
unsigned int GetGmDay( unsigned char* Addr )
{
unsigned int Tmp,Mon,Year;
Tmp=BCD2Byte(*Addr);
Addr++;
Mon=BCD2Byte(*Addr);
Addr++;
Year=BCD2Byte(*Addr);
Tmp+=DayTab[Mon]+Year*365+(Year>>2)+1;
if( (Year&0x03)==0 && Mon<=2 ) Tmp--;
return Tmp;
}
//**********************************************************************
// Get the Week of Today
//**********************************************************************
char GetWeek( void )
{
unsigned int Tmp;
Tmp=GetGmDay(SM.ClkBcd.Day)+5;
return( Tmp%7 );
}
//**********************************************************************
// Clock Initialize
//**********************************************************************
void ClkBcdInit( void )
{
SM.ClkBcd.Sec[0]= 0x00;
SM.ClkBcd.Min[0]= 0x10;
SM.ClkBcd.Hour[0]=0x04;
SM.ClkBcd.Day[0]= 0x05;
SM.ClkBcd.Mon[0]= 0x02;
SM.ClkBcd.Year[0]=0x04;
SM.ClkBcd.Year[1]=0x20;
SM.ClkBcd.Week[0]=0x04;
//SM.ClkBcd.Week[0]=GetWeek();
SM.ClkBcdChk=ChkSum((unsigned char*)&SM.ClkBcd, sizeof(CLKDEF));
ClkBcd_ClkHex();
}
//**********************************************************************
// Clock Check
//**********************************************************************
void ClkCheck( void )
{
if( SM.ClkHexChk==ChkSum( (unsigned char*)&SM.ClkHex, sizeof(CLKDEF) ) )
{
ClkHex_ClkBcd();
}
else if( SM.ClkBcdChk==ChkSum( (unsigned char*)&SM.ClkBcd, sizeof(CLKDEF) ) )
{
ClkBcd_ClkHex();
}
else
{
ClkBcdInit();
}
//SM.FeeNo=GetFeeNo();
}
/*void Sec_xDiv( void )
{
if ( DM.bt_int<Second_Div ) DM.bt_int++;
else
{
DM.ClkFlg |= F_Sec;
DM.bt_int=0;
}
}*/
void ClkSys( void ) //
{
SM.ClkHex.Sec[0]++;
if (SM.ClkHex.Sec[0] > 59)
{
SM.ClkHex.Sec[0]=0;
SystemEventFlag |= SYSTEM_MINUTE_FLAG;
SM.ClkHex.Min[0]++;
if (SM.ClkHex.Min[0] > 59)
{
SM.ClkHex.Min[0]=0;
SystemEventFlag |= SYSTEM_HOUR_FLAG;
SM.ClkHex.Hour[0]++;
if (SM.ClkHex.Hour[0] > 23)
{
SM.ClkHex.Hour[0]=0;
SystemEventFlag |= SYSTEM_DAY_FLAG;
SM.ClkHex.Week[0]++;
SM.ClkHex.Day[0]++;
switch(SM.ClkHex.Mon[0])
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: if(SM.ClkHex.Day[0]>31){SM.ClkHex.Day[0]=1;SM.ClkHex.Mon[0]++;}break;
case 4:
case 6:
case 9:
case 11: if(SM.ClkHex.Day[0]>30){SM.ClkHex.Day[0]=1;SM.ClkHex.Mon[0]++;}break;
case 2: {
if(SM.ClkHexLeap)
{
if(SM.ClkHex.Day[0]>29){SM.ClkHex.Day[0]=1;SM.ClkHex.Mon[0]++;}
}
else
{
if(SM.ClkHex.Day[0]>28)
{SM.ClkHex.Day[0]=1;SM.ClkHex.Mon[0]++;}
}
}break;
}
if (SM.ClkHex.Mon[0] > 12)
{
SM.ClkHex.Mon[0]=1;
SM.ClkHex.Year[0]++;
if((SM.ClkHex.Year[0]%4==0 && SM.ClkHex.Year[0]%100) || SM.ClkHex.Year[0]%400 == 0)
SM.ClkHexLeap = 1;
else SM.ClkHexLeap = 0;
}
if (SM.ClkHex.Week[0] > 6) SM.ClkHex.Week[0]=0;
}
}
}
SM.ClkHexChk=ChkSum( (unsigned char*)&SM.ClkHex,sizeof(CLKDEF) );
ClkHex_ClkBcd();
}
//char ComClkChk( char *rByte ) // if timer error, return !0.
signed char ComClkChk( unsigned char *rByte )
{
if (rByte[0]>0x59) return -1;
else
{
if (rByte[1]>0x59) return -1;
else
{
if (rByte[2]>0x32) return -1;
else
{
//////////////////////////////////////
// ------- rByte[3] is week --------//
if ((rByte[4]>0x31)||(rByte[4]== 0)) return -1;
{
if ((rByte[5] > 0x12)||(rByte[4]== 0)) return -1;
else if(rByte[6]>0x99) return -1;
}
}
}
}
return 0;
}
void Time_Compensate(void)
{
long temp =0;
temp = DM.iTempSample*1.83108263;
temp = temp - SM.Cfg.EspPar.iTempSampleOffset;
temp = temp/132;
temp = temp -273;
DM.iTemperature = temp;
if(DM.iTemperature<0)
{
DM.iTemperature = -DM.iTemperature;
MeterRunState |= TEMP_FLAG;
}
else
{
MeterRunState &= ~TEMP_FLAG;
}
Word2BCD1(DM.ubTemperature,DM.iTemperature);
//temp = DM.iTempSample - DM.iTempSampleOffset;
//temp = ((((float)temp)/32768.0) * 640.0 - 343.349)/1.257 + 0.5 ; // 加0.5,四舍五入
//DM.iTemperature = (int)temp; // 此时已经是一个摄氏温度值, 用于LCD显示
temp -= 25;
temp = temp*temp*35*CORRECT_TIME;
temp = -temp;
// 晶体的基本偏差,也就是在常温时25摄氏度时,晶体偏差
// 为了方便处理,在程序中,我们对偏差,包括温度引起的和基本偏差,都放大1000倍
temp += CRYSTAL_BASE_CORRECTION;
if (temp >= 0)
{
SM.lTimeErrAcc += temp;
if (SM.lTimeErrAcc >= 1000000000)
{
SM.lTimeErrAcc -= 1000000000;
/* 累计偏差已达到1秒,我们需要跳过一秒 */
MeterRunState |= SKIP_A_SECOND;
}
}
else
{
SM.lTimeErrAcc += temp;
if (SM.lTimeErrAcc <= -1000000000)
{
SM.lTimeErrAcc += 1000000000;
/* 累计偏差已达到1秒,我们需要额外增加一秒 */
//rtc_bumper();
}
}
SystemEventFlag &= ~SYSTEM_TEMP_COMPENSATE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -