📄 host.c
字号:
I_Send(uSelIndex);
break;
case 0xD0: //右键, 右翻片子
uSelIndex ++;
if (uSelIndex > 4)
uSelIndex = 1;
TRG = 1;
TRG = 0;
I_Send('P');
Delay(1, 5);
I_Send(uSelIndex);
break;
case 0xB0: //MENU,取消操作
TRG = 1; //静止显示
TRG = 0;
I_Send('A');
Delay(1, 1000);
TRG = 1; //停止闪烁
TRG = 0;
I_Send('N');
KeyFuncIndex = 17; //跳到上一层
KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)(); //执行
return;
case 0x70: //回车,确认操作
TRG = 1; //闪烁显示
TRG = 0;
I_Send('A');
Delay(50, 1000);
//计算数据并保存
Param.PointPos = uSelIndex;
changed = 1;
TRG = 1; //停止闪烁
TRG = 0;
I_Send('N');
KeyFuncIndex = 8; //跳回到2XXXX
KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)(); //执行
return;
default:
break;
}
}
rst_wdog();
}
return;
}
void ALRLX() reentrant //显示报警下限
{
uchar ALR_L[] = {0x38, 0xB6, 0xB6, 0xB6, 0xB6};
GetParamsCode(ALR_L, 1, Param.wALR_L.w);
Hints(ALR_L); //显示
return;
}
void ALRHX() reentrant //显示报警上限
{
uchar ALR_H[] = {0xB6, 0xB6, 0xB6, 0xB6, 0xB6};
GetParamsCode(ALR_H, 1, Param.wALR_H.w);
Hints(ALR_H); //显示
return;
}
void AL_L() reentrant //报警下限输入
{
Hints(AL_LHint); //显示AL.L
return;
}
void AL_H() reentrant //报警上限输出
{
Hints(AL_HHint); //显示AL.H
return;
}
void SetAL_L() reentrant //设置低报警值
{
uchar uKey;
word Value;
word wALR_L = Param.wALR_L.w;
ALRLX();
uKey = GetKeyValue(&Value, wALR_L, 4);
KeyResult(uKey, 22, 23, Value);
return;
}
void SetAL_H() reentrant //设置高报警值
{
uchar uKey;
word Value;
word wALR_H = Param.wALR_H.w;
ALRHX();
uKey = GetKeyValue(&Value, wALR_H, 4);
KeyResult(uKey, 23, 22, Value);
return;
}
void Address() reentrant //提示地址输入
{
Hints(AddrHint);
return;
}
void Baud() reentrant //提示波特率输入
{
Hints(bAudHint);
return;
}
void SetAddress() reentrant //设置地址
{
uchar uKey;
word Value = 0;
byte bAddress = Param. bAddress;
AddrX(); //显示当前值
uKey = GetKeyValue(&Value, bAddress, 3);
KeyResult(uKey, 18, 19, Value);
return;
}
void SetBaud() reentrant //设置波特率
{
uchar KeyValue;
BaudX();
while (1)
{
KeyValue = P2 & 0xF0; //去掉低4位
if (KeyValue != 0xF0)
{
Delay(15, 500);
KeyValue = P2 & 0xF0;
switch (KeyValue)
{
case 0xE0: //左键, 向上翻
Param.BaudIndex ++;
Param.BaudIndex = Param.BaudIndex % 4;
Hints(Bauds[Param.BaudIndex]);
break;
case 0xD0: //右键, 向下翻
Param.BaudIndex --;
Param.BaudIndex = Param.BaudIndex % 4;
Hints(Bauds[Param.BaudIndex]);
break;
case 0xB0: //MENU,取消操作
TRG = 1; //静止显示
TRG = 0;
I_Send('A');
Delay(1, 1000);
TRG = 1; //停止闪烁
TRG = 0;
I_Send('N');
KeyFuncIndex = 19; //跳到上一层
KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)(); //执行
return;
case 0x70: //回车,确认操作
TRG = 1; //静止显示
TRG = 0;
I_Send('A');
//保存波特率
switch (Param.BaudIndex)
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
}
changed = 1;
Delay(50, 1000);
TRG = 1; //停止闪烁
TRG = 0;
I_Send('N');
KeyFuncIndex = 18; //跳到AH.L
KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)(); //执行
return;
default:
break;
}
}
rst_wdog();
}
return;
}
void SetTimer(uchar uIndex) //设置定时器的参数
{
if (uIndex == 0)
{
TH1 = 0xF0; //定时器时间设置1200
PCON = 0x00;
}
if (uIndex == 1)
{
TH1 = 0xF8; //定时器时间设置2400
PCON = 0x00;
}
rst_wdog();
if (uIndex == 2)
{
TH1 = 0xFC; //定时器时间设置4800
PCON = 0x00;
}
if (uIndex == 3)
{
TH1 = 0xFE; //定时器时间设置9600
PCON = 0x00;
}
rst_wdog();
}
void SendData(uchar uNum) //发送串行口数据
{
uchar i, uSum;
rst_wdog();
uSum = 0;
DE = 1;
SBUF = Param.bAddress; //从机地址发回
while (TI != 1)
rst_wdog();
TI = 0;
for (i=0; i<uNum; i++)
{
SBUF = Tarray[i];
uSum += Tarray[i];
while (TI != 1)
rst_wdog();
TI = 0;
rst_wdog();
}
SBUF = uSum;
while (TI == 0)
rst_wdog();
TI = 0;
}
bit ReceiveData(uchar uNum) //接收串行口数据
{
uchar i;
uchar uSum;
DE = 0;
while (1)
{
rst_wdog();
uSum = 0;
for (i=0; i<uNum; i++)
{
while (RI != 1)
rst_wdog();
RI = 0;
Rarray[i] = SBUF;
uSum += Rarray[i];
rst_wdog();
}
while (RI != 1)
rst_wdog();
RI = 0;
if (SBUF == uSum) //校验和相同
{
DE = 1;
SBUF = 0x00;
while (TI == 0)
rst_wdog();
TI = 0;
return 1;
}
else //不同,要求重新接收
{
DE = 1;
SBUF = 0xFF;
while (TI == 0)
rst_wdog();
TI = 0;
return 0;
}
}
}
void ssio(void) interrupt 4
{
uchar uCmd;
RI = 0;
ES = 0; //关串行口中断
//非本机地址,继续监听
if (SBUF != Param.bAddress)
{
ES = 1;
DE = 0; //允许接收
rst_wdog();
return;
}
SM2 = 0; //取消监听状态
/*
DE = 1;
SBUF = Param.bAddress; //从机地址发回
while (TI != 1)
rst_wdog();
TI = 0;
*/
DE = 0;
while (RI != 1)
rst_wdog();
RI = 0;
uCmd = SBUF; //接收命令
//命令分析
if (uCmd == 0x87) //查询数据
{
//准备数据
Tarray[0] = 'I'; //电流符号
Tarray[1] = Param.Current.b[0]; //电流值
Tarray[2] = Param.Current.b[1];
Tarray[3] = Param.PointPos; //小数点
Tarray[4] = '+'; //符号
//发送数据
SendData(5);
}
else if (uCmd == 0x81) //查询倍率
{
//准备倍率
Tarray[0] = Param.wInput.b[0]; //输入
Tarray[1] = Param.wInput.b[1];
Tarray[2] = Param.wOutput.b[0]; //输出
Tarray[3] = Param.wOutput.b[1];
Tarray[4] = Param.PointPos; //小数点
//发送倍率
SendData(5);
}
else if (uCmd == 0x84) //查询报警
{
//准备报警值
Tarray[0] = Param.wALR_H.b[0]; //报警上限
Tarray[1] = Param.wALR_H.b[1];
Tarray[2] = Param.wALR_L.b[0]; //报警下限
Tarray[3] = Param.wALR_L.b[1];
Tarray[4] = Param.bAlert; //报警允许位
//发送报警值
SendData(5);
}
else if (uCmd == 0x80) //设置倍率
{
//接收倍率
if (ReceiveData(5))
{
Param.wInput.b[0] = Rarray[0];
Param.wInput.b[1] = Rarray[1];
Param.wOutput.b[0] = Rarray[2];
Param.wOutput.b[1] = Rarray[3];
Param.PointPos = Rarray[4];
//WriteParams();
//保存输入值到地址8, 输出值到10;
wren_cmd();
page_write(Param.wInput.b[0], Param.wInput.b[1],
Param.wOutput.b[0], Param.wOutput.b[1], 8);
//保存小数点到地址18
wren_cmd();
byte_write(Param.PointPos, 18);
}
}
else if (uCmd == 0x83) //设置波特率
{
//接收波特率
if (ReceiveData(1))
{
Param.BaudIndex = Rarray[0];
SetTimer(Param.BaudIndex);
//WriteParams();
//保存波特率
wren_cmd();
byte_write(Param.BaudIndex, 17);
}
}
else if (uCmd == 0x82) //设置报警值
{
//接收报警值
if (ReceiveData(5))
{
Param.wALR_H.b[0] = Rarray[0];
Param.wALR_H.b[1] = Rarray[1];
Param.wALR_L.b[0] = Rarray[2];
Param.wALR_L.b[1] = Rarray[3];
Param.bAlert = Rarray[4];
//WriteParams();
//保存报警下限到地址12,报警上限到地址14;
wren_cmd();
page_write(Param.wALR_L.b[0], Param.wALR_L.b[1],
Param.wALR_H.b[0], Param.wALR_H.b[1], 12);
//保存报警标志位到地址16
wren_cmd();
byte_write(Param.bAlert, 16);
}
}
else //出错处理
{
DE = 1;
SBUF = 0x80; //命令非法,发状态
while (TI != 1)
rst_wdog();
TI = 0;
}
SM2 = 1;
ES = 1; //恢复监听
DE = 0; //允许接收
}
void main()
{
uchar i, j;
//P2 = INIT_STATE;
wren_cmd();/*写使能子程序*/
wrsr_cmd();/*复位时间位和数据保护位写入状态寄存器*/
RST = 0;
RST = 1;
Delay(1, 10);
RST = 0;
Param.wZero.dw = 0; //零位
Param.wOutput.w = 2000;
Param.wInput.w = 5;
Param.wInCount.dw = 2045; //2453
Param.PointPos = 3;
Param.bAlert = 1;
Param.Password.w = 0;
Param.BaudIndex = 2;
Param.wALR_L.w = 200; //报警下限
Param.wALR_H.w = 1800; //报警上限
Param.bAddress = 65; //地址
JDQL = 1;
JDQH = 1;
//WriteParams();
for (i=0; i<=9; i++)
{
TRG = 1;
TRG = 0;
I_Send('T');
Delay(1, 5);
rst_wdog();
for (j=0; j<5; j++)
{
I_Send(uLEDChar[i]);
rst_wdog();
}
Delay(15, 1000);
rst_wdog();
}
ReadParams();
/*
Display(Param.wZero.dw, Param.PointPos);
Delay(15, 1000);
Display(Param.wOutput.w, Param.PointPos);
Delay(15, 1000);
Display(Param.wInput.w, Param.PointPos);
Delay(15, 1000);
Display(Param.bAlert, Param.PointPos);
Delay(15, 1000);
Display(Param.wInCount.dw, Param.PointPos);
Delay(15, 1000);
Display(Param.wALR_L.w, Param.PointPos);
Delay(15, 1000);
Display(Param.wALR_H.w, Param.PointPos);
Delay(15, 1000);
Display(Param.bAddress, Param.PointPos);
Delay(15, 1000);
Display(Param.Password.w, Param.PointPos);
Delay(15, 1000);
Display(Param.BaudIndex, Param.PointPos);
Delay(15, 1000);
*/
//设置波特率
TMOD = 0x20; //T1定义为模式2
SetTimer(Param.BaudIndex);
SCON = 0xF0; //串行口方式3
TR1 = 1;
ES = 1;
EA = 1;
DE = 0; //允许接收
flag = 1;
while (1)
{
if (flag)
{
uchar KeyValue;
DisplayCurrent();
KeyValue = P2 & 0xF0; //去掉低4位
if (KeyValue == 0xB0)
flag = 0;
}
if (!flag)
GetKeyInput();
rst_wdog();
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -