📄 zdjjc.c
字号:
#include "zdjjc.h"
void Delay(uint time, uint time2)
{
uint data i, j;
for (i=0; i<time; i++)
for (j=0; j<time2; j++);
return;
}
uint InitBaud () //设置波特率
{
uint Baud;
switch (BaudIndex)
{
case 0:
Baud = 1200;
RCAP2H = 0xFE;
RCAP2L = 0xE0;
break;
case 1:
Baud = 2400;
RCAP2H = 0xFF;
RCAP2L = 0x70;
break;
case 2:
Baud = 4800;
RCAP2H = 0xFF;
RCAP2L = 0xB8;
break;
case 3:
Baud = 9600;
RCAP2H = 0xFF;
RCAP2L = 0xDC;
break;
case 4:
Baud = 19200;
RCAP2H = 0xFF;
RCAP2L = 0xEE;
break;
}
return Baud;
}
void ReStoreData (uchar data RecordIndex) reentrant
{
uchar data RecordBuf[11];
C24GetBuf (RECORD_ROOT+RecordIndex*32, RecordBuf, 11);
//初始化各变量
RunLength.b[0] = RecordBuf[0];
RunLength.b[1] = RecordBuf[1];
RunTime.b[0] = RecordBuf[2];
RunTime.b[1] = RecordBuf[3];
DebugLength.b[1] = RecordBuf[4];
DebugLength.b[1] = RecordBuf[5];
DebugTime.b[0] = RecordBuf[6];
DebugTime.b[1] = RecordBuf[7];
PulseCheat.b[0] = RecordBuf[8];
PulseCheat.b[1] = RecordBuf[9];
C24GetBuf (RECORD_ROOT+RecordIndex*32+11, RecordBuf, 11);
curMotorStopCount = RecordBuf[0];
curMotorStopTimeLength.b[0] = RecordBuf[1];
curMotorStopTimeLength.b[1] = RecordBuf[2];
JingCutCount = RecordBuf[3];
JingCutTime = RecordBuf[4];
WeiCutCount = RecordBuf[5];
WeiCutTime = RecordBuf[6];
DiCutCount = RecordBuf[7];
DiCutTime = RecordBuf[8];
JuanCutCount = RecordBuf[9];
JuanCutTime = RecordBuf[10];
}
void LocateGroupIndex (uchar uYear, uchar uMonth, uchar uDate, uchar uHour, uchar uMin)
{
uchar idata TimeGroup[17], uTempIndex;
C24GetBuf (GROUP_TIME, TimeGroup, 17);
GroupCount = TimeGroup[16]; //定班数
//比较时间,得到班号
for (;;)
{
uTempIndex = GroupIndex * 4;
if (uHour > TimeGroup[uTempIndex] &&
uHour < TimeGroup[uTempIndex+2])
break;
else if (uHour == TimeGroup[uTempIndex+2])
{
if (uMin < TimeGroup[uTempIndex+3])
break;
}
else if (uHour == TimeGroup[uTempIndex])
{
if (uMin >= TimeGroup[uTempIndex+1])
break;
}
GroupIndex ++;
GroupIndex %= GroupCount;
}
C24GetBuf (RECORD_INDEX, &RecordIndex, 1); //读到上一次记录位置
//读上一次记录
C24GetBuf (RECORD_ROOT+RecordIndex*32+22, TimeGroup, 8);
//比较日期
if (TimeGroup[7] == uYear &&
TimeGroup[5] == uMonth &&
TimeGroup[4] == uDate)
{
//比较班时间
if (uHour > TimeGroup[0] &&
uHour < TimeGroup[2])
{
ReStoreData (RecordIndex);
return;
}
else if (uHour == TimeGroup[2])
{
if (uMin < TimeGroup[3])
{
ReStoreData (RecordIndex);
return;
}
}
else if (uHour == TimeGroup[0])
{
if (uMin >= TimeGroup[1])
{
ReStoreData (RecordIndex);
return;
}
}
}
ClearAllData ();
displayBuf[6] = 0x08;
RecordIndex ++; //本次记录位置加1
RecordIndex %= RECORDCOUNT;
C24SetBuf (RECORD_INDEX, &RecordIndex, 1); //更新记录索引号
}
void GetEEPromData ()
{
uchar idata Buffer[7];
C24GetBuf (TERM_H, Buffer, 7);
PulseTerm.b[0] = Buffer[0]; //得到正常脉冲周期
PulseTerm.b[1] = Buffer[1];
uKValue.b[0] = Buffer[2]; //K值
uKValue.b[1] = Buffer[3];
RunStatus = Buffer[4]^1; //本机状态
motorStatus = Buffer[4]^0; //电机转动状态
BaudIndex = Buffer[5]; //波特率选择
Address = Buffer[6]; //通信地址
}
void ChangeGroup (uchar uHour, uchar uMin)
{
uchar idata TimeGroup[4];
C24GetBuf (GROUP_TIME+GroupIndex*4, TimeGroup, 4);
//比较时间
if ((uHour > TimeGroup[0]) && (uHour < TimeGroup[2]))
return;
else if (uHour == TimeGroup[0])
{
if (uMin >= TimeGroup[1])
return;
}
else if (uHour == TimeGroup[2])
{
if (uMin < TimeGroup[3])
return;
}
//保存当前数据
SaveCurrData ();
//数据清零,换下一班
ClearAllData ();
GroupIndex ++;
GroupIndex %= GroupCount;
RecordIndex ++;
RecordIndex %= RECORDCOUNT;
C24SetBuf (RECORD_INDEX, &RecordIndex, 1); //更新记录索引号
}
void ClearAllData (void) //所有当前记录变量清0
{
uPulseInc = 0;
RunLength.w = 0;
RunTime.w = 0;
DebugLength.w = 0;
DebugTime.w = 0;
curMotorStopCount = 0;
curMotorStopTimeLength.w = 0;
PulseCheat.w = 0;
JingCutCount = 0;
JingCutTime = 0;
WeiCutCount = 0;
WeiCutTime = 0;
DiCutCount = 0;
DiCutTime = 0;
JuanCutCount = 0;
JuanCutTime = 0;
}
void InitParam ()
{
uchar idata TimeBuf[7];
//初始化各引脚
DAT_595 = HIGH;
CLK_595 = HIGH;
STB_595 = HIGH;
EN_SEND = FALSE;//使能接收数据
MOTOR = HIGH;
//初始化定时器0,1
TMOD = 0x11;
//定时器0,方式1,用于伪脉冲检测
TH0 = TH0_VAL;
TL0 = TL0_VAL;
TR0 = TRUE;
ET0 = FALSE;
//定时器1,方式1,用于显示
TH1 = TH1_VAL;
TL1 = TL1_VAL;
TR1 = TRUE;
ET1 = TRUE;
//初始化定时器2,用于通信
T2CON = 0x30;
TR2 = TRUE;
ET2 = TRUE;
PS = TRUE;
SCON = 0x50; //8位
ES = TRUE; //中断允许位
//初始化外中断0
IT0 = TRUE; //边沿触发方式
EX0 = TRUE;
//初始化外中断1
IT1 = TRUE; //边沿触发方式
EX1 = FALSE;
PX1 = TRUE; //外部中断1优先级最高
if (!RstStatus)
{
//初始化各变量
curKey = NO_KEY;
KeyFlag = FALSE;
RecOver = FALSE;
TrasOver = FALSE;
IsReceive = FALSE;
UartLength = 255;
Address = 255;
Rindex = 0;
Tindex = 0;
TimeStatus = FALSE;
JingStatus = JING_PIN;
WeiStatus = WEI_PIN;
DiStatus = DIXI_PIN;
JuanStatus = JUAN_PIN;
v_Get1302 (TimeBuf);
C24SetBuf (START_TIME, TimeBuf, 7);
displayBuf[6] = 0x00;
//显示年月日
displayBuf[5] = SEVEN_BLK1[TimeBuf[3] & 0x0F];
displayBuf[4] = SEVEN_BLK1[(TimeBuf[3]>>4) & 0x0F];
displayBuf[3] = SEVEN_BLK1[TimeBuf[4] & 0x0F];
displayBuf[2] = SEVEN_BLK1[(TimeBuf[4]>>4) & 0x0F];
displayBuf[1] = SEVEN_BLK1[TimeBuf[6] & 0x0F];
displayBuf[0] = SEVEN_BLK1[(TimeBuf[6]>>4) & 0x0F];
}
//开中断
EA = TRUE;
GetEEPromData ();
InitBaud();
Delay (100, 350);
if (!RstStatus)
{
//显示时分秒
displayBuf[5] = SEVEN_BLK1[TimeBuf[0] & 0x0F];
displayBuf[4] = SEVEN_BLK1[(TimeBuf[0]>>4) & 0x0F];
displayBuf[3] = SEVEN_BLK1[TimeBuf[1] & 0x0F];
displayBuf[2] = SEVEN_BLK1[(TimeBuf[1]>>4) & 0x0F];
displayBuf[1] = SEVEN_BLK1[TimeBuf[2] & 0x0F];
displayBuf[0] = SEVEN_BLK1[(TimeBuf[2]>>4) & 0x0F];
LocateGroupIndex (TimeBuf[6], TimeBuf[4], TimeBuf[3], TimeBuf[2] ,TimeBuf[1]); //在此确定班号
Delay (100, 350);
}
EX1 = TRUE; //开始脉冲记数
}
void IntToLED (uint uData, uchar uPos, bit bIsDot) //数据转换到LED
{
uchar i;
for (i=uPos; i>0; i--)
{
displayBuf[i] = SEVEN_BLK1[uData % 10];
uData /= 10;
}
//对高位0消影
while (++i < uPos)
{
if (displayBuf[i] == SEVEN_BLK1[0])
{
displayBuf[i] = 0x00;
}
else break;
}
if (bIsDot)
displayBuf[4] |= 0x80;
}
void KBSendData (word data595)
{
uchar data i;
word data mid;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
for (i=0; i<16; i++)
{
mid = 0x8000 >> i;
if (data595 & mid)
DAT_595 = HIGH;
else
DAT_595 = LOW;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
CLK_595 = LOW;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
CLK_595 = HIGH;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
STB_595 = LOW;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
STB_595 = HIGH;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
DAT_595 = HIGH; //数据线保持高电平
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
void Display ()
{
uchar data kbIndex;
word data595;
//计算显示数据
data595 = (0x0001 << displayIndex) + (displayBuf[displayIndex] << 8);
//蜂鸣器
if (buzzState == TRUE)
data595 |= 0x0080;
KBSendData (data595);
//判断键盘
kbIndex = displayIndex - 2;
if (kbIndex < KBI_COUNT)
{
if (KB_DATA == LOW)
{
/*
if (KeyCount == 0)
{
FirstKey = kbIndex;
}
else if (kbIndex == FirstKey)
{
}
*/
//KeyCount ++;
//if (KeyCount == KEYDELAY)
{
curKey = kbIndex;
//hasKey = FALSE;
KeyFlag = TRUE;
//KeyCount = 0;
}
}
}
//计算下一次显示下标
displayIndex ++;
displayIndex = displayIndex % DISPLAY_BUF_LEN;
}
void IntKey () interrupt 0
{
//关闭显示
word data595 = 0x0000;
KBSendData (data595);
SaveCurrData ();
//进入掉电模式
PCON = 0x02;
}
void OnPulseTerm (void) interrupt 1
{
if (RunStatus)
{
PulseAct ++;
}
else
{
PulseTotal ++;
}
TH0 = TH0_VAL;
TL0 = TL0_VAL;
}
void IntPulse () interrupt 2
{
ET0 = FALSE;
if (!RunStatus)
{
PulseCount ++;
displayBuf[6] = 0x00;
if (PulseCount == TERM_COUNT)
{
displayBuf[6] = 0x02;
PulseTerm.w = PulseTotal / 16;
PulseTerm.w = PulseTerm.w * 9;
PulseTerm.w /= 10;
PulseCount = 0;
PulseTotal = 0;
C24SetBuf (TERM_H, PulseTerm.b, 2);
}
uDebugPulse ++;
if (uKValue.w != 0)
{
if (uDebugPulse < uKValue.w)
{
displayBuf[5] = SEVEN_BLK1[uDebugPulse * 10 / uKValue.w];
}
else
{ DebugLength.w ++;
uDebugPulse = 0;
displayBuf[5] = SEVEN_BLK1[0];
}
}
IntToLED (DebugLength.w, 4, TRUE);
}
else
{
if (PulseAct != 0)
{
if (PulseAct > PulseTerm.w)
{
uPulseInc ++;
if (uKValue.w != 0)
{
if (uPulseInc < uKValue.w)
{
displayBuf[5] = SEVEN_BLK1[uPulseInc * 10 / uKValue.w];
}
else
{ RunLength.w ++;
uPulseInc = 0;
displayBuf[5] = SEVEN_BLK1[0];
}
}
PulseAct = 0;
displayBuf[6] &= 0x7F;
}
else
{
PulseCheat.w ++;
buzzState = TRUE;
displayBuf[6] |= 0x80;
}
}
displayBuf[6] = 0x01;
IntToLED (RunLength.w, 4, TRUE);
}
//显示
displayBuf[0] = SEVEN_BLK1[GroupIndex];
ET0 = TRUE;
}
void LEDShow (void) interrupt 3
{
GroupSaveCount ++;
if (RunStatus)
{
//主电机停机监测
if (!MOTOR)
{
motorStatus = FALSE;
buzzState = FALSE;
}
else
{
if (motorStatus == FALSE)
{
motorStatus = TRUE;
curMotorStopCount ++;
}
buzzState = TRUE;
}
}
Display ();
TH1 = TH1_VAL;
TL1 = TL1_VAL;
}
void SetBaud ()
{
uint Baud;
while (TRUE)
{
Baud = InitBaud ();
//显示当前波特率
displayBuf[0] = SEVEN_BLK1[11];
IntToLED (Baud, 5, FALSE);
Delay (200, 200);
switch (curKey)
{
case 0: //加
BaudIndex ++;
BaudIndex = BaudIndex % 5;
break;
case 1: //减
BaudIndex --;
BaudIndex = BaudIndex % 5;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -