⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timmer.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
📖 第 1 页 / 共 3 页
字号:
//	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 + -