📄 timer.c
字号:
// 以下是有外时钟
#ifdef I2C_RX8025
#else
const unsigned char HowDay[]={
0x31, 0x28, 0x31,
0x30, 0x31, 0x30,
0x31, 0x31, 0x30,
0, 0, 0,
0, 0, 0,
0x31, 0x30, 0x31,
};
#endif
void ClkInit( void )
{
BTCTL =
#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
#elif Second_Div==3
BT_ADLY_250 // 1/8 = 125ms
#elif Second_Div==1
BT_ADLY_500 // 1/8 = 125ms
#else
BT_ADLY_1000
#endif
+ BTFRFQ0; // STK LCD 128Hz
IE2 |= BTIE;
}
void ClkRest( void )
{
SM.Clk.Sec[0]=0x00;
SM.Clk.Min[0]=0x00;
SM.Clk.Hour[0]=0x00;
SM.Clk.Week[0]=6;
SM.Clk.Day[0]=0x05;
SM.Clk.Mon[0]=0x02;
SM.Clk.Year=0x2004;
}
void ClkSys( void ) //
{
unsigned int i;
if (SM.Clk.Sec[0]<0x59) _BCD1INC((unsigned char *)&SM.Clk.Sec[0] );
else
{
SM.Clk.Sec[0]=0;
DM.Tsk.Req.Min=1;
if (SM.Clk.Min[0]<0x59) _BCD1INC((unsigned char *)&SM.Clk.Min[0] );
else
{
SM.Clk.Min[0]=0;
DM.Tsk.Req.Hour=1;
if (SM.Clk.Hour[0]<0x23) _BCD1INC((unsigned char *)&SM.Clk.Hour[0] );
else
{
SM.Clk.Hour[0]=0;
if( SM.Clk.Week[0]>=6 ) SM.Clk.Week[0]=0; // 0100 0000
else SM.Clk.Week[0]++;
i=BCD2Byte(SM.Clk.Year&0xFF);
if (SM.Clk.Day[0]<(((SM.Clk.Mon[0]==2)&&((i&0x03)==0))?0x29:HowDay[SM.Clk.Mon[0]-1]))
_BCD1INC((unsigned char *)&SM.Clk.Day[0] );
else
{
SM.Clk.Day[0]=1;
if (SM.Clk.Mon[0]<0x12) _BCD1INC((unsigned char *)&SM.Clk.Mon[0] );
else
{
SM.Clk.Mon[0]=1;
_BCD1INC((unsigned char *)&SM.Clk.Year );
}
}
}
}
}
SM.ClkChk=ChkSum((unsigned char*)&SM.Clk,sizeof(RTC));
}
void ProcHalf(void)
{
DM.Tsk.Req.Half=0;
#if Second_Counter >= 2
WDTCTL = WDT_ARST_1000; // Clear WDT
#endif
}
const unsigned char TariLed[]=
{
0xff,
~LED_RED_BIT, //~P6LEDRATE2, // 0x10 // P6.4
~LED_YELLOW_BIT, //~P6LEDRATE3, // 0x20 // P6.5
~LED_GREEN_BIT, //~P6LEDRATE4 // 0x40 // P6.6
};
void ProcSec(void)
{
#if Second_Counter >= 2
WDTCTL = WDT_ARST_1000; // Start WDT
#endif
DM.Tsk.Req.Sec=0;
ClkSys();
if(SM.Clk.Sec[0]==0)
{
SM.Cfg.FeeNo[0]=GetFeeNo();
if( SM.Cfg.FeeNo[0]>3 ) SM.Cfg.FeeNo[0]=1;
SM.Cfg.MetStatus[0] &=~0xC0; // 费率状态
SM.Cfg.MetStatus[0] |= SM.Cfg.FeeNo[0]<<6;
SM.Cfg.MetStatus[0]=BATTEST(SM.Cfg.MetStatus[0]); // 电池状态
if( REVP_IN & REVP_BIT )
{
_BCD3INC(&SM.Cfg.IRevAllTmr[0]);
SM.Cfg.MetStatus[0] |= M_DIR; // 电能方向
LCDMEM[0] |= 0x40;
}
else
{
SM.Cfg.MetStatus[0] &=~M_DIR;
LCDMEM[0] &=~0x40;
}
SM.CfgChk=ChkSum((unsigned char*)&SM.Cfg, sizeof(CFGGRP));
SM.E2Flgs |= S_E2CFGGRP;
DM.Tsk.Req.I2C=1;
#ifdef TEMP_COMPENSATE
// 启动温度转换。
DM.Reg.b[0] = 0x00;
SetI2CData(DM.Reg.b,0x9E,0x01,1);
#endif
}
#ifdef TEMP_COMPENSATE
if(SM.Clk.Sec[0]==1)
{
// 让 AD7416 进入掉电模式。
DM.Reg.b[0] = 0x01;
SetI2CData(DM.Reg.b,0x9E,0x01,1);
// 读出温度值,取高10位,再右移2位,得温度的整数度。
GetI2CWord(DM.Reg.w,0x9E,0x00 );
DM.Reg.w[0] >>=6;
// +0x02 的目的,是为了修正C语言中的四舍五入问题。
if(DM.Reg.w[0]&0x200)
SM.Temp=-((0x402-DM.Reg.w[0])>>2); // 负温度
else
SM.Temp =(DM.Reg.w[0]+0x02)>>2;
if(SM.Temp>80) SM.Temp=80;
if(SM.Temp<-40) SM.Temp=-40;
_NOP();
}
// 以下程序为内部软件时钟温度补偿:
// when t=-40, use cofset[0].
SM.cul_t = SM.cul_t + cofset_t[SM.Temp+40];
if(SM.cul_t>=15625)
{
//温度补偿程序。
SM.cul_t -=15625;
DM.Flgs |= F_Temp;
}
#endif
//
//以下一句,可用红、黄、绿指示灯来代替。
LED_COM_OUT |= (LED_RED_BIT | LED_YELLOW_BIT | LED_GREEN_BIT);
LED_COM_OUT &= TariLed[SM.Cfg.FeeNo[0]];
#ifdef DISPLAY_CHANGED
#ifdef OSC_FAULT_DETECT
if ( (SM.Cfg.LcdCtl.Mode&0x03)==0 ) DspCtrl();
#else
if ( SM.Cfg.LcdCtl.Mode==0 ) DspCtrl();
#endif
#else
#ifdef OSC_FAULT_DETECT
if ( (SM.Cfg.LcdCtl.Mode[0]&0x03)==0 ) DspCtrl();
#else
if ( SM.Cfg.LcdCtl.Mode[0]==0 ) DspCtrl();
#endif
#endif
DM.Tsk.Req.Disp=1;
}
void ProcMin(void)
{
DM.Tsk.Req.Min=0;
}
void ProcHour(void)
{
DM.Tsk.Req.Hour=0;
SM.Cfg.MetStatus[0] &=~M_CHKCLK;
if( (SM.Cfg.BillDay[0]==SM.Clk.Hour[0])&&(SM.Cfg.BillDay[1]==SM.Clk.Day[0]))
{
SM.E2Flgs |= S_E2LMONGRP;
DM.Tsk.Req.I2C=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -