📄 timmer.c
字号:
tdate.Year -= 100; /* same as the year data from 6355 */
}
}
else
{
tdate.Month ++;
}
tdate.Day = 1;
}
else
{
tdate.Day++;
}
}
else if (tdate.Day >= dayofmonth[tdate.Month-1])
{
if (tdate.Month == 12)
{
tdate.Month = 1;
tdate.Year ++;
if(tdate.Year >= 100)
{
tdate.Year -= 100; /* same as the year data from 6355 */
}
}
else
{
tdate.Month ++;
}
tdate.Day = 1;
}
else
{
tdate.Day ++;
}
return tdate;
}
/********************************************************
* Function:Compare two dates and return the result. *
* Argument:date1,date2-----the two dates to be compared *
* Return: 0 ------date1 > date2 *
* 1 ------date1 = date2 *
* 2 ------date1 < date2 *
*********************************************************/
CHR CompDate(DATE date1,DATE date2)
{
CHR y1, y2;
y1 = date1.Year;
y2 = date2.Year;
if ( y1 < y2 ) return (2);
if ( ( y2 == y1 ) && (date2.Month > date1.Month) )
return (2);
if ( ( y2 == y1 ) && (date2.Month == date1.Month)
&& (date2.Day > date1.Day) )
return (2);
if ( ( y2 == y1 ) && (date2.Month == date1.Month)
&& (date2.Day == date1.Day) )
return (1);
return ( 0 );
}
///////////////////////////////////////////////////////////////////////////////
// Descript: set system week bases date
// In Param: date
///////////////////////////////////////////////////////////////////////////////
void Rtc_SetWeek(DATE tDate)
{
byte week;
DATE date;
DATE newDate;
word dayCnt = 0;
byte winSumTime = 0;
if (IsDay(tDate.Year, tDate.Month, tDate.Day) != OK)
return ;
date.Year = tDate.Year;
date.Month = 1;
date.Day = 1;
week = weekDate[date.Year];
newDate.Year = tDate.Year;
newDate.Month = tDate.Month;
newDate.Day = tDate.Day;
if (CompDate(date, newDate) == 1)
{
// week = 1;
}
else
{
while (CompDate(date, newDate) != 1)
{
date = GetNextDate(date);
dayCnt++;
}
week = (week + dayCnt) % 7;
if (week == 0)
week = 7;
}
SOFT_WEEK = week;
}
/******************************************************************************
* Describe: set winter or summer time flag when modify system date or time
* and clear time chang flag.
* Input : new Date :***** newDate is hex format , not BCD format
* Output: void
* return: void
******************************************************************************/
void SetTimeFlag(DATE newDate)
{
DATE startDate, endDate;
byte i;
byte startWeek, endWeek;
word j;
// get two critical Date
startDate.Year = newDate.Year;
startDate.Month = 3;
startDate.Day = 25;
endDate.Year = newDate.Year;
endDate.Month = 10;
endDate.Day = 25;
startWeek = weekDate[newDate.Year] + (83 % 7);
endWeek = weekDate[newDate.Year] + (297 % 7);
if (leapyear(newDate.Year))
{
startWeek += 1;
endWeek += 1;
}
startWeek %= 7;
if (startWeek == 0)
{
startWeek = 7;
}
for (i=0; i<7; i++)
{
if (startWeek == 7)
{
break;
}
startDate = GetNextDate(startDate);
startWeek = (startWeek + 1) % 7;
if (startWeek == 0)
{
startWeek = 7;
}
}
endWeek %= 7;
if (endWeek == 0)
{
endWeek = 7;
}
for (i=0; i<7; i++)
{
if (endWeek == 7)
{
break;
}
endDate = GetNextDate(endDate);
endWeek = (endWeek + 1) % 7;
if (endWeek == 0)
{
endWeek = 7;
}
}
// compare with above critical date
if (CompDate(newDate, startDate) == 1) // if date equal, continue compare time
{
if (SOFT_HOUR >= 3)
{
WIN_SUM_FLAG = SUM_TIME;
}
else
{
WIN_SUM_FLAG = WIN_TIME;
}
}
else if (CompDate(newDate, endDate) == 1)
{
if (SOFT_HOUR >= 3)
{
WIN_SUM_FLAG = WIN_TIME;
}
else
{
WIN_SUM_FLAG = SUM_TIME;
}
}
else if ((CompDate(newDate, startDate) == 0) && (CompDate(newDate, endDate) == 2))
{
WIN_SUM_FLAG = SUM_TIME;
}
else
{
WIN_SUM_FLAG = WIN_TIME;
}
}
///////////////////////////////////////////////////////////////////////////////
// Descript: test SetTimeFlag() and Rtc_SetWeek() function whether ok.
// Return: true/false
///////////////////////////////////////////////////////////////////////////////
bool Rtc_TestWeekAndTime(void)
{
const DATE testWeekAndTime[] = {
{28,3,4}, {31,10,4},
{27,3,5}, {30,10,5},
{26,3,6}, {29,10,6},
{25,3,7}, {28,10,7},
{30,3,8}, {26,10,8},
{29,3,9}, {25,10,9},
{28,3,10},{31,10,10},
};
byte year;
DATE date;
byte winterSummerFlag;
DATE bkDate;
TIME bkTime;
byte bkWeek;
bool result = true;
bkTime.Hour = GetHour();
bkTime.Minute = GetMinute();
bkTime.Sec = GetSecond();
bkWeek = SOFT_WEEK;
// Uart_PortSet(PORT1, 0, 1, 0);
for (year=4; year<11; year++)
{
// winter time --> summer time
date = testWeekAndTime[(year-4)*2];
// Uart_WriteByte(PORT1, date.Year);
// Uart_WriteByte(PORT1, date.Month);
// Uart_WriteByte(PORT1, date.Day);
Rtc_SetWeek(date);
if (SOFT_WEEK != 7)
{
result = false;
break;
}
SOFT_HOUR = 2;
SOFT_MINUTE = 0;
SetTimeFlag(date);
if (WIN_SUM_FLAG != WIN_TIME)
{
result = false;
break;
}
// summer time --> winter time
date = testWeekAndTime[(year-4)*2+1];
// Uart_WriteByte(PORT1, date.Year);
// Uart_WriteByte(PORT1, date.Month);
// Uart_WriteByte(PORT1, date.Day);
Rtc_SetWeek(date);
if (SOFT_WEEK != 7)
{
result = false;
break;
}
SOFT_HOUR = 2;
SOFT_MINUTE = 0;
SetTimeFlag(date);
if (WIN_SUM_FLAG != SUM_TIME)
{
result = false;
break;
}
}
SOFT_HOUR = bkTime.Hour;
SOFT_MINUTE = bkTime.Minute;
SOFT_SECOND = bkTime.Sec;
SOFT_WEEK = bkWeek;
return result;
}
#define BATTERY_VOLTAGE_AD ad0
#define BATTERY_VOLTAGE (BATTERY_VOLTAGE_AD * 5000L / 255) // mV voltage
///////////////////////////////////////////////////////////////////////////////
// Descript: Check battery lower than 3.0V
// Return: true/false
///////////////////////////////////////////////////////////////////////////////
bool ChkBatteryLow(void)
{
#define BATTERY_VOLTAGE_LOW (2700 + 300) // 2700mV,初始化时电压上升约400mv.
if (BATTERY_VOLTAGE <= BATTERY_VOLTAGE_LOW)
{
Wait(5);
if (BATTERY_VOLTAGE <= BATTERY_VOLTAGE_LOW)
{
return true;
}
}
return false;
}
///////////////////////////////////////////////////////////////////////////////
// 将电池短路至地时,AD值在(02~05)之间. 开路时(即断开电池),则AD值始终为0xff.
// 采用以下值判断: AD < 10(短路); AD > 250(断路)
// 需间隔50us连续三次检测结果相同.
///////////////////////////////////////////////////////////////////////////////
bool ChkBatteryAbnormal(void)
{
byte adValue;
byte i;
adValue = BATTERY_VOLTAGE_AD;
// 电池开路或短路.
if ((adValue < 10) || (250 < adValue))
{
for (i=0; i<50; i++);
adValue = BATTERY_VOLTAGE_AD;
if ((adValue < 10) || (250 < adValue))
{
for (i=0; i<50; i++);
adValue = BATTERY_VOLTAGE_AD;
if ((adValue < 10) || (250 < adValue))
{
return true;
}
}
}
return false;
}
///////////////////////////////////////////////////////////////////////////////
// 将电池短路至地时,AD值在(02~05)之间. 开路时(即断开电池),则AD值始终为0xff.
// 采用以下值判断: AD < 10(短路); AD > 250(断路)
// 需间隔50us连续三次检测结果相同.
///////////////////////////////////////////////////////////////////////////////
void Sys_ChkBatteryAbnormal(void)
{
if (ChkBatteryAbnormal() == true)
{
bellcnt = 0xff;
OpenBuzzer();
Clr_Dsp_Data();
disp_Char_Str("BATTERY---", 0);
// 关闭键盘扫描,禁止用户继续操作.
ta3s = 0;
key_fd = 0; // 关闭走纸.
}
}
///////////////////////////////////////////////////////////////////////////////
// Descript: check battery lower and deal
///////////////////////////////////////////////////////////////////////////////
void Sys_ChkBatteryLow(void)
{
if ((ChkBatteryLow() == true) && (CMOS_Legl_Chk() == OK))
{
byte userPressKeyTime = 0;
Clr_Dsp_Data();
disp_Char_Str("BATTERY LO", 0);
bellcnt = 0xff;
while (userPressKeyTime < 3)
{
if (Key_Poll_Chk())
{
if (GetKey() == KD_SUBTTL)
{
userPressKeyTime++;
bellcnt = 30;
}
}
}
}
}
void MainSramWaitPFO(void)
{
word timeCnt = 0;
word i;
//;set main clock division
//; 00 --- 16
//; 0e --- 14
//; 0c --- 12
//; 0a --- 10
//; 08 --- 8
//; 06 --- 6
//; 04 --- 4
//; 02 --- 2
//; 12 --- 1
// asm("mov.b #01h,0ah");
// asm("mov.b #08h,0ch"); // ; main clock division register
// asm("mov.b #0h,0ah");
for (i=0; i<0x300; i++); // about 1ms
// p7_5 = 1;
prc0 = 1;
cm07 = 1; // set Xc use for system clk
prc0 = 0;
while (1)
{
for (i=0; i<3; i++); // about 1ms
if (p8_2)
break;
if (timeCnt++ > 80) // 80 * 1.8ms
{
asm("jsr.a 1F00h");
}
}
prc0 = 1;
cm07 = 0; // set Xin use for system clk
prc0 = 0;
// asm("mov.b #01h,0ah");
// asm("mov.b #12h,0ch"); // ; main clock division register
// asm("mov.b #0h,0ah");
/*
byte i;
// 2秒后(等待电源全部关闭),重新设置部分引脚,避免漏电.
for (i=0; i<4; i++)
{
if (p8_2)
return;
wdts = 0xff;
asm("wait");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
if (p8_2)
return;
asm("jsr.a 1F00h");
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -