📄 user_code.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 + -