📄 host.c
字号:
break;
default:
//KeyFuncIndex = 30;//默认显示电流
//DisplayCurrent();
return;
}
rst_wdog();
KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)(); //执行
}
return;
}
void GetParamsCode(uchar *pChar, uchar begin, word wData) reentrant //段码、显示片选起点、参数
{
uchar i;
if (wData > 0)
{
for (i=4; i>=begin; i--)
{
pChar[i] = uLEDChar[wData % 10];
wData = wData / 10;
rst_wdog();
}
if (Param.PointPos < 5)
pChar[Param.PointPos] |= 0x40;
}
}
void Hints(uchar *pChar) reentrant
{
byte i;
TRG = 1;
TRG = 0;
I_Send('T');
Delay(1, 5);
for (i=0; i<5; i++)
{
I_Send(pChar[4-i]);
rst_wdog();
}
return;
}
//显示测量数据
void DisplayCurrent()
{
uchar i;
dword dwCurrent;
dword Count;
word wOutput, wALR_L, wALR_H;
Count = GetCount();
//计算
wOutput = Param.wOutput.w;
wALR_L = Param.wALR_L.w;
wALR_H = Param.wALR_H.w;
for (i=0; i<4-Param.PointPos; i++)
{
wOutput /= 10;
wALR_L /= 10;
wALR_H /= 10;
rst_wdog();
}
//计算转换量
if (Count >= Param.wZero.dw)
dwCurrent = (Count - Param.wZero.dw) * wOutput * 100 / (Param.wInCount.dw - Param.wZero.dw);
Param.Current.w = dwCurrent / 10;
if ((dwCurrent % 10) > 4) //四舍五入
Param.Current.w ++ ;
rst_wdog();
//报警
if (Param.bAlert)
{
if (Param.Current.w < wALR_L * 10) //低报警
JDQL = 0;
if (Param.Current.w > wALR_L * 12) //低报警回滞
JDQL = 1;
if (Param.Current.w > wALR_H * 10) //高报警
JDQH = 0;
if (Param.Current.w < wALR_H * 8) //高报警回滞
JDQH = 1;
rst_wdog();
}
//显示
Display(Param.Current.w, 3);
//Display(Count, 5);
return;
}
uchar GetKeyValue(word *pValue, word Data, uchar uNum) reentrant
{
uchar KeyValue, i;
uchar CodeIndex[4] = {0, 0, 0 ,0}; //段码下标,依次对应片1, 2, 3, 4
uchar uSelIndex = 4; //片选下标
word Value = 0;
//换算得到当前值的下标
for (i=0; i<uNum; i++)
{
CodeIndex[3-i] = Data % 10 + 1;
Data = Data / 10;
rst_wdog();
}
while (1)
{
KeyValue = P2 & 0xF0; //去掉低4位
if (KeyValue != 0xF0)
{
Delay(10, 500);
KeyValue = P2 & 0xF0;
switch (KeyValue)
{
case 0xE0: //左键, 翻数字
TRG = 1;
TRG = 0;
I_Send('S');
Delay(1, 5);
I_Send(uSelIndex);
I_Send(uLEDChar[CodeIndex[uSelIndex - 1]++]);
CodeIndex[uSelIndex - 1] = CodeIndex[uSelIndex - 1] % 10;
break;
case 0xD0: //右键, 翻片子
uSelIndex ++;
if (uSelIndex > 4)
uSelIndex = 5 - uNum;
TRG = 1;
TRG = 0;
I_Send('S');
Delay(1, 5);
I_Send(uSelIndex + 4);
break;
case 0xB0: //MENU,取消操作
TRG = 1; //停止闪烁
TRG = 0;
I_Send('N');
return 0xB0;
case 0x70: //回车,确认操作
TRG = 1; //静止显示
TRG = 0;
I_Send('A');
//计算数据
for (i=4-uNum; i<4; i++)
Value = Value * 10 + CodeIndex[i] - 1;
*pValue = Value;
changed = 1;
Delay(50, 1000);
TRG = 1; //停止闪烁
TRG = 0;
I_Send('N');
return 0x70;
default:
break;
}
}
rst_wdog();
}
return 0x70;
}
void KeyResult(uchar uKey, uchar uMenu, uchar uEnter, word Value) reentrant
{
dword wInCount;
uchar uKeyValue;
if (uKey == 0xB0) //MENU,取消操作
{
rst_wdog();
KeyFuncIndex = uMenu; //跳到上一层
KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)(); //执行
}
if (uKey == 0x70) //回车,确认操作
{
if (uEnter == 7)
{
//计算输入值并保存
Param.wInput.w = Value;
wInCount = GetCount();
if (wInCount < 14158) //小于标称值20%
{
Hints(In_LHint);
return;
}
if (wInCount > 21236) //大于标称值20%
{
Hints(In_HHint);
return;
}
Param.wInCount.dw = wInCount;
Param.bAlert = 0; //关闭报警
JDQL = 1;
JDQH = 1;
rst_wdog();
}
if (uEnter == 26)
{
Param.wOutput.w = Value;
Param.bAlert = 0; //关闭报警
JDQL = 1;
JDQH = 1;
rst_wdog();
}
if (uEnter == 23)
{
Param.wALR_L.w = Value;
rst_wdog();
}
if (uEnter == 22)
{
if (Value <= Param.wOutput.w)
Param.wALR_H.w = Value;
else
Param.wALR_H.w = Param.wOutput.w;
rst_wdog();
}
if (uEnter == 19)
{
if (Value <256)
Param.bAddress = Value;
rst_wdog();
}
if (uEnter == 4)
{
if ((Param.Password.w == Value) || (Value == 0)) //密码核对
{
uKeyValue = GetKeyValue(&Value, Value, 4);
if (uKeyValue == 0x70)
{
if (Value != 0)
{
Param.Password.w = Value; //设置密码
rst_wdog();
}
}
}
else
{
Hints(ErrorHint);
Delay(30, 1000);
}
}
changed = 1;
KeyFuncIndex = uEnter; //跳到...
KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)(); //执行
}
return;
}
//测量BUSY的量(查询方式)
dword GetCount ()
{
uchar i = 5;
dword Counts[5], AddCount = 0;
WordType Count; //记数值
TMOD = 0x01; //定时器
while (i--)
{
TL0 = 0;
TH0 = 0; //初始化
while (!BUSY);
//开计数器
TR0 = 1;
while (BUSY);
TR0 = 0; //关闭计数器
Count.b[1] = TL0;
Count.b[0] = TH0;
if (Count.w >= 24651)
Counts[i] = Count.w - 24651;
else
i++;
rst_wdog();
}
for(i=0; i<5; i++)
{
AddCount += Counts[i];
rst_wdog();
}
AddCount = AddCount / 10;
return AddCount;
}
void OptionProg() reentrant
{
if (changed && !flag)
{
//提示保存
Hints(SaveHint);
while (1)
{
uchar KeyValue;
KeyValue = P2 & 0xF0; //去掉低4位
if (KeyValue != 0xF0)
{
Delay(10, 500);
KeyValue = P2 & 0xF0;
while ((P2 & 0xF0) != 0xF0)
rst_wdog();
if (KeyValue == 0xB0) //MENU
{
//恢复参数,读芯片
ReadParams(); //读参数
SetTimer(Param.BaudIndex);
break;
}
if (KeyValue == 0x70) //回车
{
uchar uKey, i;
word Value;
word Passward = 0;
for (i=0; i<3; i++)
{
//要求输入密码
Hints(PwdHint);
uKey = GetKeyValue(&Value, Passward, 4);
if (uKey == 0x70)
{
if ((Value == Param.Password.w) || (Value == 0)) //比较密码
{
WriteParams(); //保存参数,写芯片
i = 3;
}
}
else break;
rst_wdog();
}
break;
}
}
rst_wdog();
}
changed = 0;
}
Hints(ProgHint); //显示提示
return;
}
void OptionAYS() reentrant
{
Hints(A_YSHint); //显示提示
return;
}
void OptionIn_Out() reentrant
{
Hints(In_OuHint); //显示提示
return;
}
void OptionALR() reentrant
{
Hints(ALRHint); //显示提示
return;
}
void OptionSecr() reentrant
{
Hints(SecrHint); //显示提示
return;
}
void OptionAdBd() reentrant
{
Hints(Ad_BdHint); //显示提示
return;
}
//显示零点
void AutoZero() reentrant
{
Param.wZero.dw = GetCount(); //得到零
Display(Param.wZero.w[1], 5);
changed = 1;
/*
Delay(25, 1000);
TRG = 1; //闪烁显示
TRG = 0;
I_Send('A');
Delay(25, 1000);
TRG = 1; //静止显示
TRG = 0;
I_Send('N');
*/
return;
}
void InputX() reentrant //显示输入值
{
byte Input[] = {0x06, 0x00, 0x00, 0xB6, 0xB6};
GetParamsCode(Input, 3, Param.wInput.w);
Input[Param.PointPos] &= 0xBF;
Hints(Input); //显示提示
return;
}
void OutputX() reentrant //显示输出值
{
byte Output[] = {0x9B, 0xB6, 0xB6, 0xB6, 0xB6};
GetParamsCode(Output, 1, Param.wOutput.w);
Hints(Output); //显示提示
return;
}
void ALROFF() reentrant //关闭报警
{
Hints(OFFHint); //显示OFF
Param.bAlert = 0;
changed = 1;
return;
}
void ALRON() reentrant //启动报警
{
Hints(ONHint); //显示ON
Param.bAlert = 1;
return;
}
void Passward() reentrant //显示密码输入界面
{
uchar uKeyValue;
word Value;
word Passward = 0;
Hints(PwdHint);
uKeyValue = GetKeyValue(&Value, Passward, 4);
KeyResult(uKeyValue, 4, 4, Value);
return;
}
void AddrX() reentrant //显示当前地址
{
byte AddrFace[] = {0xB7, 0x9E, 0xB6, 0xB6, 0xB6};
GetParamsCode(AddrFace, 2, Param.bAddress);
AddrFace[Param.PointPos] &= 0xBF;
Hints(AddrFace); //显示当前地址
return;
}
void BaudX() reentrant //显示当前波特率
{
Hints(Bauds[Param.BaudIndex]); //显示当前波特率
return;
}
void Inp() reentrant //显示INP
{
Hints(INPHint); //显示INP
return;
}
void Oup() reentrant //显示OUP
{
Hints(OUPHint); //显示OUP
return;
}
void Point() reentrant //提示小数点输入
{
Hints(PoInHint);
return;
}
void SetInput() reentrant //设置输入值
{
uchar uKey;
word Value;
word wInput = Param.wInput.w;
InputX(); //显示当前值
uKey = GetKeyValue(&Value, wInput, 2);
KeyResult(uKey, 14, 7, Value);
return;
}
void SetOutput() reentrant
{
word Value;
uchar uKey;
word wOutput = Param.wOutput.w;
OutputX(); //显示当前值
uKey = GetKeyValue(&Value, wOutput, 4);
KeyResult(uKey, 15, 26, Value);
return;
}
void SetPoint() reentrant //设置小数点
{
uchar KeyValue;
uint Div = 1;
uchar uSelIndex = Param.PointPos; //片选下标
OutputX(); //显示当前值
while (1)
{
KeyValue = P2 & 0xF0; //去掉低4位
if (KeyValue != 0xF0)
{
Delay(15, 500);
KeyValue = P2 & 0xF0;
switch (KeyValue)
{
case 0xE0: //左键, 左翻片子
uSelIndex --;
if (uSelIndex < 1)
uSelIndex = 4;
TRG = 1;
TRG = 0;
I_Send('P');
Delay(1, 5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -