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

📄 user_code.c

📁 用KEIL开发的出租车计费系统
💻 C
字号:
/**********************************************************
  
                   		User Code
  
   File Name:       user_code.c
   Author:			Lin Qian
   Created:			2008/04/24
   Modified:		No
   Revision: 		1.0
  
***********************************************************/

#define __USER_CODE
#include "INC\\main.h"
#undef __USER_CODE


// 延时X毫秒 ******************************
#if DelayXms_en
void DelayXms (uint count)
{
	uint i,j;

	for( i=0; i<count; i++)
		for( j=0; j<120; j++);
}
#endif

// 用户初始化 ******************************
#if UserInit_en
void UserInit (void)
{
	//--- 全局变量赋初值 ---
	SysStatus = IDLE;			// 当前系统状态: 空闲
	lastSysStatus = IDLE;		// 前一系统状态: 空闲
	
	MenuMode = MENU_MAIN;		// 当前画面模式: 主画面
	lastMenuMode = MENU_MAIN;	// 前一画面模式: 主画面
	holdMenu = 0;		// 画面维持计数: 0
	PopMenu_en = 0;		// 弹出画面允许: Off

	LoadRTC();		// 读取EEPROM中的实时时钟
	LoadPrice();	// 读取EEPROM中的单价

	Reset();	// 重置里程数、总价和停车计费, 载入主画面

	SpeedCal();		// 计算速度
}
#endif

// 系统状态响应 ******************************
#if System_en
void System (void)
{
	static uchar SysStatus_check = IDLE;	// 检测系统状态更改

	if( SysStatus_check == SysStatus )		// 若系统状态无改变, 直接返回
	{
		return;
	}
	else	// 若系统状态发生改变, 则存储新的系统状态
	{
		SysStatus_check = SysStatus;

		// 存储系统状态
		x24c02_Write(X24C02_0, EEPROM_SYSTEM_STATUS, SysStatus);
		DelayXms(5);
		x24c02_Write(X24C02_0, EEPROM_LAST_SYSTEM_STATUS, lastSysStatus);
		DelayXms(5);
	}
	
	// 根据系统状态选择操作 [注: 此段程序只在系统状态发生改变时才调用]
	switch( SysStatus )
	{
		case IDLE:	// 空闲
			RunIndicator = LED_OFF;	// 运行指示灯灭
			break;
		
		case RUN:	// 运行
			RunIndicator = LED_ON;	// 运行指示灯亮
			break;

		default:	break;
	}
}
#endif

// 费用计算 ******************************
#if CostCal_en
void CostCal (void)
// 功能: 计算总价(单位: 0.1元)
{
	if( SysStatus == IDLE )		// 若系统处于空闲态, 直接返回
		return;

	Total = START_PRICE;		// 起步价

	if( Dist > START_MILES )	// 超出起步里程计费
		Total += (Dist-START_MILES) * UnitPrice / 10;

	if( StopMin >= 1 )		// 途中停车计费
		Total += (StopHour * 60 + StopMin - 1) * STOP_PRICE;
}
#endif

// 速度计算 ******************************
#if SpeedCal_en
void SpeedCal (void)
{
	//--- 换算速度值 ---
	Speed = DistIn500ms * 72;	// 计算速度 (单位: 0.1km/h)
	DistIn500ms = 0;

	//--- 更新速度显示缓冲区内容 ---
		// 小数点后第一位
	DispBuf[LED_DIGIT_LENGTH-1] = Speed % 10;
	Speed /= 10;
		
		// 个位
	DispBuf[LED_DIGIT_LENGTH-2] = Speed % 10;
	Speed /= 10;
		
		// 十位, 非零才显示
	if( Speed )
	{
		DispBuf[LED_DIGIT_LENGTH-3] = Speed % 10;
		Speed /= 10;
	}
	else
		DispBuf[LED_DIGIT_LENGTH-3] = 18;
		
		// 百位, 非零才显示
	if( Speed )
		DispBuf[LED_DIGIT_LENGTH-4] = Speed % 10;
	else
		DispBuf[LED_DIGIT_LENGTH-4] = 18;
}
#endif

// 选择单价 ******************************
#if SelectUnitPrice_en
void SelectUnitPrice (void)
// 功能: 根据实时时钟选择单价.
{
	static uint lastUnitPrice = 0;	// 上一次的单价

	if( ClockHour >= 6  &&  ClockHour < 18 )	// 根据时间段选择单价
		UnitPrice = DayPrice;		// 白天单价
	else
		UnitPrice = NightPrice;		// 夜晚单价

	if( lastUnitPrice != UnitPrice )	// 若价格发生变动, 则刷新单价
	{
		lastUnitPrice = UnitPrice;
		ShowUnitPrice();		// 刷新单价
	}
}
#endif

// 停车计时 ******************************
#if StopTimer_en
void StopTimer (void)
{
// --- 变量定义 ---
	static uint lastSec=0;		// 上一秒时刻
	static uint lastDist=0;		// 上一次里程数
	uchar Sec;	// 当前秒时刻

// --- Operation ---
	if( SysStatus != RUN )	// 若系统不处于运行状态, 则不进行停车计时
		return;

	Sec = (uchar)Cnt1s;		// 取当前时间

	if( lastSec != Sec )
	{
		lastSec = Sec;

	//注: 设在1s内收不到一个中断, 则视为停车, 进行停车计时.
		if( Dist != lastDist )
		// 若汽车仍在行走, 则直接返回
		{
			lastDist = Dist;
			return;
		}

		StopSec++;		// 停车计时秒累加. [注: 此操作的前提是本函数在<1s的时间内被再次调用.]

		if( StopSec == 60 )	// 满一分钟处理
		{
			StopSec = 0;	// 停车计时秒清零
			StopMin++;		// 停车计时分累加
		
			if( StopMin == 60 )		// 满一小时处理
			{
				StopMin = 0;	// 停车计时分清零
				StopHour = (StopHour + 1) % 24;		// 停车计时时累加
			
				// 当在主画面时, 刷新停车计时Hour显示
				if( MenuMode == MENU_MAIN )
				{
					IntToStr(StopHour, &TempBuffer[0], 2, RESERVE0);
					LCD_GotoXY(6,3);
					LCD_Print(&TempBuffer[0]);
				}
			}

			// 当在主画面时, 刷新停车计时Min显示
			if( MenuMode == MENU_MAIN )
			{
				IntToStr(StopMin, &TempBuffer[0], 2, RESERVE0);
				LCD_GotoXY(9,3);
				LCD_Print(&TempBuffer[0]);
			}
		}

		// 当在主画面时, 刷新停车计时Sec显示
		if( MenuMode == MENU_MAIN )
		{
			IntToStr(StopSec, &TempBuffer[0], 2, RESERVE0);
			LCD_GotoXY(12,3);
			LCD_Print(&TempBuffer[0]);
		}
	}
}
#endif

// 计费启动 ******************************
#if Start_en
void Start (void)
// 功能: 在系统处于主画面时启动计费.
{
	if( MenuMode == MENU_MAIN )		// 只在主画面下运行本操作
	{
		SysStatus = RUN;
	}
}
#endif

// 计费停止 ******************************
#if Stop_en
// 功能: 在系统处于主画面时停止计费.
void Stop (void)
{
	if( MenuMode == MENU_MAIN )		// 只在主画面下运行本操作
	{
		SysStatus = IDLE;
	}
}
#endif

// 复位 ******************************
#if Reset_en
void Reset (void)
// 功能: 重置计费变量(里程数、总价和停车计费), 刷新主画面.
{
	if( MenuMode == MENU_MAIN )		// 本操作只在主画面下执行
	{
		Dist = 0;	// 里程数清零
		Total = 0;	// 总价清零
	
		//--- 停车计时复位 ---
		StopSec = 0;
		StopMin = 0;
		StopHour = 0;

		LoadMenu_Main();	// 装载主画面
	}
}
#endif

// (用户函数定义) ******************************
#if _en

#endif

//************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -