📄 timmer.c
字号:
// tb3ic = 0;
// tb3s = 0;
// tb4mr = 0;
// tb4 = 0;
// tb4ic = 0;
// tb4s = 0;
// tb5mr = 0;
// tb5 = 0;
// tb5ic = 0;
// tb5s = 0;
//-- UART
ps0_3 = 0;
u0mr = 0x0;
u0c0 = 0x0;
u0brg = 0;
s0tic = 0;
s0ric = 0;
u0c1 = 0;
u0irs = 0;
u0rrm = 0;
ps0_7 = 0;
u1mr = 0x00;
u1c0 = 0x0;
u1brg = 0;
s1tic = 0x0;
s1ric = 0x0;
u1c1 = 0;
u1irs = 0;
u1rrm = 0;
// uart 2
ps1_0 = 0;
psl1_0 = 0;
ps1_2 = 0;
psl1_2 = 0;
psc_0 = 0;
u2mr = 0;
u2c0 = 0;
u2brg = 0;
u2c1 = 0;
// uart 3
prc2 = 1;
ps3_2 = 0;
prc2 = 1;
ps3_1 = 0;
pu27 = 0;
u3mr = 0;
u3c0 = 0;
u3brg = 0;
s3tic = 0;
s3ric = 0;
u3c1 = 0;
prc2 = 1;
ps3_6 = 0;
prc2 = 1;
ps3_7 = 0;
prc2 = 1;
pd9_5 = 0;
prc2 = 1;
ps3_5 = 0;
u4mr = 0x0;
u4c0 = 0x0;
u4brg = 0;
s4tic = 0x0;
u4c1 = 0x0;
u4irs = 0;
u4rrm = 0;
asm("mov.b #02h,0ah");
asm("mov.b #00h,04h"); // set processer mode 1 :single-chip mode
asm("mov.b #00h,0ah");
pd0 = 0xff;
p0 = 0;
pd1 = 0xff;
// p1 = 0;
// p1 = 0x1f; // 关闭打印机片选,电源.
p1 = 0x00;
pd2 = 0xff;
p2 = 0;
pd3 = 0xff;
p3 = 0;
pd4 = 0x00;
p4 = 0x00;
// p4 = 0x40;
// pd4 = 0x4f;
pd5 = 0x5f;
p5 = 0x00;
pd6 = 0xff;
p6 = 0;
pd7 = 0xff;
p7 = 0;
pd8_0 = 1;
pd8_1 = 1; // Drawer driver (low enable)
pd8_2 = 0;
pd8_3 = 1;
pd8_4 = 1;
p8_0 = 0;
p8_1 = 1;
// p8_1 = 1;
p8_3 = 0;
p8_4 = 0;
prc2 = 1;
pd9 = 0xff; // p93/p94 为Fm电源控制.
p9 = 0;
// pd10 = 0xfe; // P10_1 连接在电池端.
// p10 = 0;
pd10 = 0xff; // P10_1 连接在电池端.
p10 = 1;
adst = 0;
vcut = 0;
pd11 = 0x1f;
p11 = 0;
pd12 = 0xff; // Wind P12_6 HIGH Level Valid
p12 = 0;
pd13 = 0xff;
p13 = 0;
pd14 = 0xff; // Buzzer P14_0 HIGH Level Valid
p14 = 0;
pd15 = 0xff;
p15 = 0;
pur0 = 0;
pur1 = 0;
pur2 = 0;
pur3 = 0;
pur4 = 0;
prc0 = 1;
cm03 = 0; // set Xcin-Xcout low driver
cm07 = 1; // set Xc use for system clk
cm05 = 1; // stop main clk
prc0 = 0;
// when all job is finished, enable the Timer A1 interrupt
asm("ldc #2700H,intb");
asm("fset i");
ta1ic = 7;
ta1s = 1;
// set normal start falg -- only for ESD
PWRDWN_RESET_FLAG = 0x12563478;
// 2秒后(等待电源全部关闭),重新设置部分引脚,避免漏电.
powerOnCount = 0;
for (i=0; i<4; i++)
{
if (p8_2)
powerOnCount++;
// wdts = 0xff;
asm("wait");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
// 如果在打印时电源电压下降导致掉电中断,则等待2秒后自动复位.
if ((p8_2 == 0) || (powerOnCount < 3))
{
powerOnCount = 0;
}
// p1 = 0x00;
p8_1 = 0;
while (1)
{
// wdts = 0xff;
// need check External Power Level (can check it in INT)
// if (powerOnCount > 2)
// 如果两次连续检测到PFO信号,则复位.
// if ((powerOnCount >= 1) && p8_2)
// {
// // check program area data whether right // Single Chip mode can't
//// if ((*(byte *)0xffffff == 0x00) && (*(byte *)0xfffffe == 0xfc))
// {
// // save ta1 timer count
// ta1s = 0;
// asm("fclr i");
// SOFT_TA1 += 512 - ta1 + 270;
//// SOFT_TA1 += 512 - ta1;
// if (SOFT_TA1 >= 1024)
// {
// if (SOFT_SECOND < 59)
// {
// SOFT_SECOND += 1;
// SOFT_TA1 -= 1024;
// }
// }
//
// pd4 = 0; // input mode
// pd5 = 0;
// asm("mov.b #02h,0ah");
// asm("mov.b #03h,04h"); // set processer mode 1 :microchip mode
// asm("mov.b #03h,05h"); // set processer mode 2 :mode 3
// asm("mov.b #00h,0ah");
//
// // External Power on, calculate soft RTC, then soft reset MCU
// prc1 = 1;
// pm03 = 1;
// prc1 = 0;
// }
// //*(byte *)0xffffff = 0x00;
// }
// if (p8_2)
// powerOnCount++;
// else
// powerOnCount = 0;
asm("wait");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
/******************************************************************************
* Describe: check Date & time whether need change timer to winter or summer
* Input : void
* Output: void
* return: WIN_TO_SUM means winter time changed to summer time,
* SUM_TO_WIN means summer time changed to winter time
* 0 means no change happened.
* Caution: after print illegal receipt, need clear TIME_CHANG_FLAG to Zero.
******************************************************************************/
byte ChkWinSumTime(void)
{
// return TIME_CHANG_FLAG;
}
/******************************************************************************
* Describe: Timer A1 (Soft Real-Time-Clocker Timer) ISR
* Input : void
* Output: void
* return: void
******************************************************************************/
void RtcTimer(void)
{
SOFT_TIME_CNT++;
if (SOFT_TIME_CNT % 2 == 0)
{
if (++SOFT_SECOND > 59)
{
SOFT_SECOND = 0;
if (++SOFT_MINUTE > 59)
{
SOFT_MINUTE = 0;
SOFT_HOUR++;
if ((SOFT_MONTH == 3) && (SOFT_HOUR == 3)) // summer or winter time judge
{
if ((SOFT_WEEK == 7) && (SOFT_DAY > 24))
{
if (WIN_SUM_FLAG == WIN_TIME)
{
SOFT_HOUR = 4; // put forward 60 seconds (1 hour)
WIN_SUM_FLAG = SUM_TIME;
// need start print one illegal receipt
// TIME_CHANG_FLAG = WIN_TO_SUM;
}
}
}
else if ((SOFT_MONTH == 10) && (SOFT_HOUR == 4))
{
if ((SOFT_WEEK == 7) && (SOFT_DAY > 24))
{
if (WIN_SUM_FLAG == SUM_TIME)
{
SOFT_HOUR = 3; // put forward 60 seconds (1 hour)
WIN_SUM_FLAG = WIN_TIME;
// need start print one illegal receipt
// TIME_CHANG_FLAG = SUM_TO_WIN;
}
}
}
else if (SOFT_HOUR >= 24)
{
SOFT_HOUR = 0;
if (++SOFT_WEEK > 7)
{
SOFT_WEEK = 1;
}
// Get Next Day
if ((((SOFT_YEAR+2000)%400) == 0) || (((SOFT_YEAR+2000)%100)!=0 && ((SOFT_YEAR+2000)%4)==0))
*(SOFT_day_of_month + 1) = 29;
else
*(SOFT_day_of_month + 1) = 28;
if (SOFT_DAY == *(SOFT_day_of_month + SOFT_MONTH - 1))
{
if (SOFT_MONTH == 12)
{
SOFT_MONTH = 1;
SOFT_YEAR++;
}
else
{
SOFT_MONTH++;
}
SOFT_DAY = 1;
}
else
{
SOFT_DAY++;
}
}
}
}
}
}
/******************************************************************************
* Describe:Power Down ISR
* Input : void
* Output: void
* return: void
******************************************************************************/
void PwrDownISR(void)
{
// -------->>> try to not reset MCU, enter PowerDown mode directly
asm("jsr.a 1F00h");
// --------<<< try to not reset MCU, enter PowerDown mode directly
/*
// set power down flag
PWRDWN_RESET_FLAG = 0X55AA55AA;
// deal soft rtc
SOFT_TA1 += 512 - ta1;
if (SOFT_TA1 >= 1024)
{
if (SOFT_SECOND < 59)
{
SOFT_SECOND += 1;
SOFT_TA1 -= 1024;
}
}
// soft reset mcu
prc1 = 1;
pm03 = 1;
prc1 = 0;
while (1);
*/
}
/******************************************************************************
* Describe: Power Down Deal: When Power down, first enter Power down ISR, set
* PowerDownFlag to 0x55aa55aa, and soft reset MCU. after reset, detect
* PowerDownFlag whether valid, enable sub clocker and Timer A1, clear
* PowerDownFlag and enter routine location in internal Ram.
* Input : void
* Output: void
* return: void
******************************************************************************/
void PwrDwnDeal(void)
{
byte i;
// open sub clocker (32.768k)
prc0 = 1;
cm04 = 1; // enable Xc
for (i=0; i<100; i++); // wait Xc stable
prc0 = 0;
// set timer A1 work mode
ta1mr = 0xc0; // fc32, disable gate, timer mode
// set timer A1 initial value
ta1 = (0.5 / 1) * 1024 - 1;
// enable timer A1 downflow interrupt
ta1ic = 0x04;
ta1s = 1; // Start timer A1
PWRDWN_RESET_FLAG = 0;
asm("jsr.a 1F00h");
while (1);
}
/******************************************************************************
* Describe: system delay
* Input : delay time * 1ms
* Output: void
* return: void
******************************************************************************/
void Wait(word time)
{
disint();
g_sysCount = time;
enint();
while (g_sysCount>=5);
}
// Used for the power off switch to the internal SRAM area for RTC.
byte esd_Start_Flag;
#define ABNORMAL_START 1
#define NORMAL_START 0
void Power_Dwn_Chk(void)
{
CHR i;
if (PWRDWN_RESET_FLAG == 0X55AA55AA)
{
PwrDwnDeal();
}
if (PWRDWN_RESET_FLAG != 0x12563478)
{
esd_Start_Flag = ABNORMAL_START;
}
else
{
esd_Start_Flag = NORMAL_START;
}
PWRDWN_RESET_FLAG = 0;
}
const CHR dayofmonth[MONTH]=
{
31,28,31,30,31,30,31,31,30,31,30,31
};
const byte weekDate[] = {
// 1, 2, 3, 5, 6, 7, 1, 3, 4, 5, // from 1990
6, 1, 2, 3, 4, 6, 7, 1, 2, 4,
5, 6, 7, 2, 3, 4, 5, 7, 1, 2,
3, 5, 6, 7, 1, 3, 4, 5, 6, 1,
2, 3, 4, 6, 7, 1, 2, 4, 5, 6,
7, 2, 3, 4, 5, 7, 1, 2, 3, 5,
6, 7, 1, 3, 4, 5, 6, 1, 2, 3,
4, 6, 7, 1, 2, 4, 5, 6, 7, 2,
3, 4, 5, 7, 1, 2, 3, 5, 6, 7,
1, 3, 4, 5, 6, 1, 2, 3, 4, 6,
7, 1, 2, 4, 5, 6, 7, 2, 3, 4
}; // from 2000 year to 2099 year. every year first day(1.1)'s week
/*********************************************************
* Get the next date *
* Input : date----the current date. *
* Return: date----the next date. *
**********************************************************/
DATE GetNextDate(DATE tdate)
{
if ((leapyear(tdate.Year) == TRUE) && (tdate.Month == 2))
{
if (tdate.Day >= 29)
{
if (tdate.Month == 12)
{
tdate.Month = 1;
tdate.Year ++;
if(tdate.Year >= 100)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -