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

📄 timmer.c

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