📄 ddcjc.c
字号:
#include "DDCJC.h"
void Delay(uint time1, uint time2)
{
uint data i, j;
for (i=0; i<time1; i++)
for (j=0; j<time2; j++);
return;
}
void ClearAllData (void)
{
PulseCount = 0;
DisPulse = 0;
Distance = 0;
PerTime = 0;
KilDistance = 0;
Distance = 0;
uLength = 0;
//Rev = 0;
Rate = 0;
OldRate = 0;
Voltage = 0;
Current = 0;
MaxRate = 0;
RateVoltage = 0;
RateCurrent = 0;
MinVoltage = 0;
MaxCurrent = 0;
StartTime = 0;
DispPause = 0;
bPause = FALSE;
bPauseOver = FALSE;
//Uindex = 0;
bDistAlarm = FALSE; //里程报警
bRateAlarm = FALSE; //速度报警
bVoltAlarm = FALSE; //电压报警
bCurrAlarm = FALSE; //电流报警
bStartTime = FALSE;
bStartFlag = FALSE;
bSaved = FALSE;
}
/*
uchar BCDToBin (uchar uBCD)
{
return ((uBCD & 0xF0) >> 4) * 10 + (uBCD & 0x0F);
}
uchar BinToBCD (uchar uBin)
{
return (((uBin/10)<<4) + (uBin%10));
}
*/
uchar GetYear (uchar uBCD) //得到年份
{
return (uBCD & 0xC0) >> 6;
}
uchar GetDate (uchar uBCD) //得到日期
{
return uBCD & 0x3F;
}
/*
uchar GetWeekday (uchar uBCD) //得到星期
{
return (uBCD & 0xE0) >> 5;
}
*/
uchar GetMonth (uchar uBCD) //得到月份
{
return uBCD & 0x1F;
}
void ReadParam () //读各设置的参数
{
WordType idata Convert;
Get8583Data (DIS_ALARM, UartBuf, 18);
//里程
Convert.b[0] = UartBuf[0];
Convert.b[1] = UartBuf[1];
OptDistance = Convert.w;
OptKilDis = OptDistance / 100;
OptDis = (OptDistance % 100) * 10;
//车速
Convert.b[0] = UartBuf[2];
Convert.b[1] = UartBuf[3];
OptRate = Convert.w;
//电流
Convert.b[0] = UartBuf[4];
Convert.b[1] = UartBuf[5];
OptCurrent = Convert.w;
//电压
Convert.b[0] = UartBuf[6];
Convert.b[1] = UartBuf[7];
OptVoltage = Convert.w;
//轮子直径
BikeIndex = UartBuf[8];
GetBike ();
//N值
Convert.b[0] = UartBuf[9];
Convert.b[1] = UartBuf[10];
NValue = Convert.w;
//后轮直径
Convert.b[0] = UartBuf[11];
Convert.b[1] = UartBuf[12];
Dia = Convert.w;
//记录编号
Convert.b[0] = UartBuf[13];
Convert.b[1] = UartBuf[14];
RecordIndex = Convert.w;
//模式设置
ModeIndex = UartBuf[15];
CheckStatus = END_STATUS;
//打印设置
PrinterIndex = UartBuf[16];
//电池容量
Battery = UartBuf[17];
}
void DispMode() //显示模式
{
switch (ModeIndex)
{
case 0:
DispBuf[8] = 0x07;
/*
START_LED = FALSE;
UNDER_LED = FALSE;
OVER_LED = FALSE;
*/
break;
case 1:
DispBuf[8] = 0x05;
/*
START_LED = FALSE;
UNDER_LED = TRUE;
OVER_LED = FALSE;
*/
break;
case 2:
DispBuf[8] = 0x03;
/*
START_LED = FALSE;
UNDER_LED = FALSE;
OVER_LED = TRUE;
*/
break;
case 3:
DispBuf[8] = 0x01;
/*
START_LED = FALSE;
UNDER_LED = TRUE;
OVER_LED = TRUE;
*/
break;
default:
DispBuf[8] = 0x00;
/*
START_LED = TRUE; //熄灯
UNDER_LED = TRUE;
OVER_LED = TRUE;
*/
break;
}
}
void WriteParam () //写参数设置
{
WordType idata Convert;
//里程
Convert.w = OptDistance;
UartBuf[0] = Convert.b[0];
UartBuf[1] = Convert.b[1];
//车速
Convert.w = OptRate;
UartBuf[2] = Convert.b[0];
UartBuf[3] = Convert.b[1];
//电流
Convert.w = OptCurrent;
UartBuf[4] = Convert.b[0];
UartBuf[5] = Convert.b[1];
//电压
Convert.w = OptVoltage;
UartBuf[6] = Convert.b[0];
UartBuf[7] = Convert.b[1];
//轮子直径
UartBuf[8] = BikeIndex;
//N值
Convert.w = NValue;
UartBuf[9] = Convert.b[0];
UartBuf[10] = Convert.b[1];
//滚筒直径
Convert.w = Dia;
UartBuf[11] = Convert.b[0];
UartBuf[12] = Convert.b[1];
//记录编号
Convert.w = RecordIndex;
UartBuf[13] = Convert.b[0];
UartBuf[14] = Convert.b[1];
//模式设置
UartBuf[15] = ModeIndex;
//打印设置
UartBuf[16] = PrinterIndex;
//电池容量
UartBuf[17] = Battery;
Set8583Data (DIS_ALARM, UartBuf, 18);
}
void SaveRecord ()
{
WordType idata Convert;
//记录编号
Convert.w = RecordIndex;
UartBuf[0] = Convert.b[0];
UartBuf[1] = Convert.b[1];
//车速
Convert.w = Rate;
UartBuf[2] = Convert.b[0];
UartBuf[3] = Convert.b[1];
//后轮转速
//Convert.w = Rev;
//UartBuf[4] = Convert.b[0];
//UartBuf[5] = Convert.b[1];
//电压
Convert.w = Voltage;
UartBuf[6] = Convert.b[0];
UartBuf[7] = Convert.b[1];
//电流
Convert.w = Current;
UartBuf[8] = Convert.b[0];
UartBuf[9] = Convert.b[1];
//里程
Convert.w = KilDistance;
UartBuf[10] = Convert.b[0];
UartBuf[11] = Convert.b[1];
Convert.w = Distance;
UartBuf[12] = Convert.b[0];
UartBuf[13] = Convert.b[1];
//启动时间
Convert.w = StartTime;
UartBuf[14] = Convert.b[0];
UartBuf[15] = Convert.b[1];
//Set8583Data (RECORD, UartBuf, 16);
}
void GetBike () //轮子直径
{
switch (BikeIndex)
{
case 0:
Bike = 406; //16英寸
break;
case 1:
Bike = 457; //18英寸
break;
case 2:
Bike = 508; //20英寸
break;
case 3:
Bike = 559; //22英寸
break;
case 4:
Bike = 610; //24英寸
break;
}
}
void InitSys ()
{
//uchar uBaseYear = 4;
//初始化各引脚
TRIP_PIN =FALSE;
DAT_595 = HIGH;
CLK_595 = HIGH;
STB_595 = HIGH;
SEL_595 = HIGH;
ClearAllData ();
ReadParam ();
//初始化定时器0,1
TMOD = 0x11;
//定时器0,方式1
TH0 = TH0_VAL;
TL0 = TH0_VAL;
TR0 = TRUE;
ET0 = FALSE;
//定时器1,方式1,用于显示
TH1 = TH1_VAL;
TL1 = TL1_VAL;
TR1 = TRUE;
ET1 = TRUE;
IsOption = FALSE;
/*
//初始化外中断0
IT0 = TRUE; //边沿触发方式
EX0 = TRUE;
*/
//初始化外中断1
IT1 = TRUE; //边沿触发方式
PX1 = TRUE;
EX1 = FALSE;
//初始化系统时钟
//Init8583 (PCF8583_CTR, 0x00);
//NValue = NVALUE;
Wheel = GetWheel ();
DisplaySysTime ();
EA = TRUE;
//测试DA
I2CSend (MAX517_ADDR, 0x00, 0x80);
//Delay (500, 255);
}
void ClearLED () //清除屏幕
{
uchar i;
for (i=0; i<18; i++)
DispBuf[i] = 0;
}
uint GetWheel () //得到轮子周长
{
uint Temp;
Temp = PI * (dword)Dia / 100;
if ((PI * (dword)Dia % 100) > 44)
Temp = Temp + 1;
return Temp;
}
void DisplaySysTime () //显示系统时间
{
uchar cTemp, cBaseYear;
//显示
Get8583Data(BASE_YEAR, &cBaseYear, 1);
Get8583Data (HUNSEC, UartBuf, 6);
cTemp = GetYear (UartBuf[4]) + cBaseYear*4; //年
DispBuf[0] = LED_CODE[2];
DispBuf[1] = LED_CODE[0];
DispBuf[2] = LED_CODE[(cTemp>>4) & 0x0F];
DispBuf[3] = LED_CODE[ cTemp & 0x0F];
cTemp = GetMonth (UartBuf[5]); //月
DispBuf[4] = LED_CODE[cTemp>>4 & 0x0F];
DispBuf[5] = LED_CODE[cTemp & 0x0F];
cTemp = GetDate (UartBuf[4]); //日
DispBuf[6] = LED_CODE[cTemp>>4 & 0x0F];
DispBuf[7] = LED_CODE[cTemp & 0x0F];
DispBuf[9] = 0x00;
DispBuf[10] = LED_CODE[UartBuf[3]>>4 & 0x0F]; //时
DispBuf[11] = LED_CODE[UartBuf[3] & 0x0F];
DispBuf[12] = 0x00;
DispBuf[13] = LED_CODE[UartBuf[2]>>4 & 0x0F]; //分
DispBuf[14] = LED_CODE[UartBuf[2] & 0x0F];
DispBuf[15] = LED_CODE[UartBuf[1]>>4 & 0x0F]; //秒
DispBuf[16] = LED_CODE[UartBuf[1] & 0x0F];
DispBuf[17] = 0x00;
}
void WriteDateTime()
{
uchar uYear;
//计算BCD码
UartBuf[0] = (UartBuf[16] << 4) | UartBuf[17]; //秒
UartBuf[1] = (UartBuf[14] << 4) | UartBuf[15]; //分
UartBuf[2] = (UartBuf[12] << 4) | UartBuf[13]; //时
uYear = UartBuf[5] * 10 + UartBuf[6];
UartBuf[3] = ((uYear%4)<<6) | (UartBuf[10] << 4) | UartBuf[11]; //年日
UartBuf[4] = (UartBuf[7] << 4) | UartBuf[9]; //月
Set8583Byte (PCF8583_CTR, 0x80);
Set8583Data (SECOND, UartBuf, 5); //写日期时间
Set8583Byte (PCF8583_CTR, 0x00);
Set8583Byte (BASE_YEAR, uYear/4);
Set8583Byte (CMP_YEAR, uYear%4);
}
uint GetResult (uchar uLen)
{
uint Data = 0;
uchar i;
for (i=uLen; i<4; i++)
Data = Data * 10 + CodeIndex[i];
return Data;
}
void InitCodeIndex (uint Data)
{
uchar i;
for (i=0; i<4; i++)
{
CodeIndex[3-i] = Data % 10;
Data = Data / 10;
}
DataIndex = CodeIndex[0];
}
uchar ReadKey () //读键盘
{
//WordType idata Convert;
switch (~P2)
{
case 0x01: //设置
bDispTime = FALSE;
IsOption = TRUE;
ShiftIndex = 4;
ClearLED ();
DispBuf[0] = LED_CODE[10];
DispBuf[1] = LED_CODE[16];
DispBuf[2] = LED_CODE[OptIndex];
IsShine = TRUE;
switch (OptIndex)
{
case 0:
//显示当前记录编号
IntToLED (RecordIndex, 3, 3, FALSE, FALSE, 4);
InitCodeIndex(RecordIndex);
break;
case 1:
//计算当前记录编号
RecordIndex = GetResult(0);
//记录编号
//Convert.w = RecordIndex;
//Set8583Data (RCORDINDEX, Convert.b, 2);
WriteParam ();
DispBuf[7] = LED_CODE[ModeIndex];
break;
case 2:
//保存模式
//Set8583Byte (MODE_INDEX, ModeIndex);
WriteParam ();
IntToLED (OptDistance, 3, 2, TRUE, FALSE, 4); //显示
//换算得到当前值的下标
InitCodeIndex (OptDistance);
break;
case 3:
//计算设置行程
OptDistance = GetResult(0);
OptKilDis = OptDistance / 100;
OptDis = (OptDistance % 100) * 10;
//里程
//Convert.w = OptDistance;
//Set8583Data (DIS_ALARM, Convert.b, 2);
WriteParam ();
ShiftIndex ++;
IntToLED (OptRate, 2, 1, TRUE, FALSE, 5);
//换算得到当前值的下标
InitCodeIndex(OptRate);
break;
case 4:
//计算报警速度
OptRate = GetResult(1);
//车速
//Convert.w = OptRate;
//Set8583Data (RATE_ALARM, Convert.b, 2);
WriteParam ();
IntToLED (OptVoltage, 3, 1, TRUE, FALSE, 4);
//换算得到当前值的下标
InitCodeIndex(OptVoltage);
break;
case 5:
//计算欠压电压
OptVoltage = GetResult(0);
//电压
//Convert.w = OptVoltage;
//Set8583Data (VOL_ALARM, Convert.b, 2);
WriteParam ();
ShiftIndex ++;
IntToLED (OptCurrent, 2, 1, TRUE, FALSE, 5);
//换算得到当前值的下标
InitCodeIndex(OptCurrent);
break;
case 6:
//计算过载电流
OptCurrent = GetResult(1);
//电流
//Convert.w = OptCurrent;
//Set8583Data (CURR_ALARM, Convert.b, 2);
WriteParam ();
//打印模式
DispBuf[7] = LED_CODE[PrinterIndex];
break;
case 7:
//保存打印模式
//Set8583Byte (PRINT_INDEX, PrinterIndex);
WriteParam ();
ShiftIndex = 6;
//电池容量
IntToLED (Battery, 1, 1, FALSE, FALSE, 6);
//换算得到当前值的下标
InitCodeIndex(Battery);
break;
case 8:
Battery = GetResult(2);
//保存电池容量
//Set8583Byte (BATTERY, Battery);
WriteParam ();
//显示当前N
IntToLED (NValue, 3, 3, FALSE, FALSE, 4);
//换算得到当前值的下标
InitCodeIndex(NValue);
break;
case 9:
//计算N值
NValue = GetResult(0);
//N值
//Convert.w = NValue;
//Set8583Data (N_VALUE, Convert.b, 2);
WriteParam ();
ShiftIndex ++;
//显示滚筒直径
IntToLED (Dia, 2, 2, FALSE, FALSE, 5);
//换算得到当前值的下标
InitCodeIndex(Dia);
break;
case 10:
//计算滚筒直径
Dia = GetResult(1);
//滚筒直径
//Convert.w = Dia;
//Set8583Data (WHEEL_DIA, Convert.b, 2);
WriteParam ();
Wheel = GetWheel ();
IntToLED (DIA_SEL[BikeIndex], 3, 3, FALSE, TRUE, 4);
break;
case 11:
//保存轮子直径
//Set8583Byte (BIKE_DIA, BikeIndex);
WriteParam ();
//显示时间
ShiftIndex ++;
GetDateTime ();
break;
case 12:
//保存日期
WriteDateTime();
//保存其他参数
//WriteParam ();
break;
default:
//退出设置
return ~P2;
}
OptIndex ++;
OptIndex %= 13;
break;
case 0x02: //置数
bDispTime = FALSE;
if (IsOption)
{
switch (OptIndex)
{
case 1:
case 3:
case 4:
case 5:
case 6:
case 8:
case 9:
case 10:
DataIndex ++;
DataIndex %= 10;
DispBuf[ShiftIndex] = LED_CODE[DataIndex] | (DispBuf[ShiftIndex] & 0x80);
CodeIndex[ShiftIndex - 4] = DataIndex;
break;
case 7:
PrinterIndex ++;
PrinterIndex %= 2;
DispBuf[7] = LED_CODE[PrinterIndex];
break;
case 2:
ModeIndex ++;
ModeIndex %= 4;
DispBuf[7] = LED_CODE[ModeIndex];
DispMode();
break;
case 11:
BikeIndex ++;
BikeIndex %= 5;
DispBuf[6] = LED_CODE[DIA_SEL[BikeIndex]/10];
DispBuf[7] = LED_CODE[DIA_SEL[BikeIndex]%10];
GetBike ();
break;
case 12:
DataIndex ++;
DataIndex %= 10;
DispBuf[ShiftIndex] = LED_CODE[DataIndex] | (DispBuf[ShiftIndex] & 0x80);
UartBuf[ShiftIndex] = DataIndex;
break;
}
}
break;
case 0x04: //移位
bDispTime = FALSE;
if (IsOption)
{
if (OptIndex != 7 &&
OptIndex != 2 &&
OptIndex != 11&&
OptIndex != 0)
{
IsShine = TRUE;
ShiftIndex ++;
switch(OptIndex)
{
case 1:
case 3:
case 5:
case 9:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -