📄 单相复费率.c
字号:
SeriesSendFg=1;
}
else
{
SeriesSendFg=0;
CmdParseFg=0;
}
}
//命令解析
void CmdParse(void)
{
unsigned char data CheckSum;
unsigned char data i,j,k;
unsigned char data IdRight;
j=0x40;
//判断是否有未发送数据
if(TimeSendFg)
{
//if(ComTimeA>=1)
//{
SeriesSend();
TimeSendFg=0;
//}
}
else
{
//数据解析标志是否有效
if(CmdParseFg)
{
DataDeal();
CmdParseFg=0;
CheckSum=0;
//数据校验
for(i=0;i<(ComDataBuf[9]+10);i++)
{
CheckSum=CheckSum+ComDataBuf[i];
}
//校验和是否相等--如果相等开始校验地址
if(CheckSum==ComDataBuf[ComDataBuf][9]+10])
{
for(i=0;i<6;i++)
{
k=IicByteRead(0xa0,j);
if(ComDataBuf[1+i]==k)
{
IdRight=0x55;
}
else
{
IdRight=0x00;
break;
}
j++;
}
//地址如果正确(非广播命令)开始解析命令
if(IdRight==0x55)
{
switch(ComDataBuf[8])
{
case 0x01 :
switch(ComDataBuf[11])
{
case 0x90:
switch(ComDataBuf[10])
{
case 0x1f: //读当前有功电量集合
for(i=0;i<4;i++)
{
IIcBuf[i]=SumPulseData[i];
}
for(i=4;i<8;i++)
{
IIcBuf[i]=FengPulseData[i-4];
}
for(i=8;i<12;i++)
{
IIcBuf[i]=PingPulseData[i-8];
}
for(i=12;i<16;i++)
{
IIcBuf[i]=GuPulseData[i-12];
}
CmdPick(0,0,0,0,IIcBuf,16,0,1);
break;
case 0x20: //读反向总电量
CmdPick(0x00,0x00,0x00,0,ReversePulseData,4,0,1);
break;
}
break;
case 0xb0:
switch(ComDataBuf[10])
{
case 0x20: //读最后一次反向启始时间
CmdPick(0xa0,0x38,4,0,0,0,1,0);
break;
case 0x21: //读反向累积总时间
CmdPick(0x00,0x00,0x00,0,ReverseTime,3,0,0);
break;
}
break;
case 0xb2:
switch(ComDataBuf[10])
{
case 0x10: //读最近一次编程时间
CmdPick(0xa0,0x3c,4,0,0,0,1,0);
break;
case 0x12: //读编程次数
CmdPick(0xa0,0x68,2,0,0,0,1,0);
break;
}
break;
case 0xc0:
switch(ComDataBuf[10])
{
case 0x10: //读当前日期
CmdPick(0,0,0,0,DaysBuf,4,0,0);
break;
case 0x11: //读当前时间
CmdPick(0,0,0,0,TimeBuf,3,0,0);
break;
case 0x20: //读电表运行状态字
CmdPick(0xa0,0x65,1,0,0,0,1,0);
break;
case 0x30: //读电表脉冲常数
CmdPick(0xa0,0x6d,3,0,0,0,1,0);
break;
case 0x32: //读电表表号
CmdPick(0xa0,0x46,0x06,0,0,0,1,0);
break;
case 0x33: //读电表地址
CmdPick(0xa0,0x40,0x06,0,0,0,1,0);
break;
}
break;
case 0xc1:
switch(ComDataBuf[10])
{
case 0x17://读自动抄表日期
CmdPick(0xa0,0x60,0x02,0,0,0,1,0);
break;
}
case 0xc3:
switch(ComDataBuf[10])
{
case 0x17://读电表时段
CmdPick(0xa0,0x60,0x02,0,0,0,1,0);
break;
}
break;
case 0xD1: //读取12个月历史累积电量
for(i=0x20;i<0x2c;i++)
{
if(ComDataBuf[10]==i)
{
ToDay(ComDataBuf[10]);
CmdPick(0xa2,IIcByteStar,16,0,0,0,1,0);
}
}
}
break;
case 0x04: //写操作
if(KeyFg1)
{
switch(ComDataBuf[10])
{
case 0x10: //写日期
//
CmdSave(0x64,16,0x03,4,1);
break;
case 0x11: //写时间
CmdSave(0x64,16,0x00,3,1);
break;
case 0x15: //显示设置
CmdSave(0xa0,16,0x62,3,0);
break;
case 0x17: //写自动抄表日
CmdSave(0xa0,16,0x60,2,0);
break;
case 0x19: //设置底度
//电度清零
CmdSave(0xa0,16,0x00,16,0);//总电量清零
break;
case 0x32: //设置表编号
CmdSave(0xa0,16,0x46,6,0);//
break;
case 0x33: //设置表地址
CmdSave(0xa0,16,0x40,6,0);//
break;
case 0x3f: //设置时段
CmdSave(0xa0,16,0x80,ComDataBuf[9]-6,0);//
break;
default:
break;
}
}
else
{
switch(ComDataBuf[10])
{
case 0x11: //写时间
TimeChk(ComDataBuf[16],ComDataBuf[17]);
if(TimeOk);
{
CmdSave(0x64,16,0x00,3,1);
TimeOk=0;
}
break;
}
}
break;
case 0x0f: //修改编程密码
if(ComDataBuf[14]==0x01)
{
CmdSave(0xa0,15,0x4c,4,0);//修改编程密码
}
else if(ComDataBuf[14]==0x00)
{
CmdSave(0xa0,15,0x50,4,0);//修改清令密码
}
break;
case 0x1f: //电表总清零
if(ComDataBuf[9]==0x04)
{
ClerData();
}
break;
}
TimeSendFg=1;
}
//否则判断是否是广播命令
else
{
IdRight=0;
for(i=0;i<6;i++)
{
if(ComDataBuf[1+i]==0x99)
{
IdRight=0x55;
}
else
{
IdRight=0x00;
break;
}
j++;
}
//如果是广播命令开始解析
if(IdRight==0x55)
{
switch(ComDataBuf[8])
{
case 0x08: //广播校时
CmdSave(0x64,15,0x00,3,1);//设置时间
break;
case 0x0a: //广播地址
CmdSave(0x64,15,0x00,3,1);//设置时间
break;
}
TimeSendFg=1;
}
else
{
ClerBuf();
SendOverFg=1;
}
CmdParseFg=0;
}
}
else
{
CmdParseFg=0;
}
}
}
}
使用LPC932制作的一款电表---LcdParse
#include <REG932.H>
#include <define.h>
#include <Stdio.h>
#include <Intrins.h>
void LcdFull(unsigned char DataOne,unsigned char DataTwo,unsigned char DataThree,unsigned char DataFour)
{
unsigned char data i,j,k;
unsigned char idata DataBufA[4],DataBufB[4];
unsigned char code Digit[12]={
0xBE, //0
0x06, //1
0x7C, //2
0x5E, //3
0xC6, //4
0xDA, //5
0xFA, //6
0x0E, //7
0xFE, //8
0xDE, //9
0xf8, //a--E
0x40, //b--_
};
DataBufA[0]=DataOne;
DataBufA[1]=DataTwo;
DataBufA[2]=DataThree;
DataBufA[3]=DataFour;
if(BataMoveFg)
{
for(i=0;i<4;i++)//
{
k=DataBufA[i];
j=DataBufA[i+1];
k=k&0x0f;
k=k<<4;
j=j>>4;
j=j&0x0f;
DataBufB[i]=k|j;
}
}
for(i=0;i<3;i++)
{
k=DataBufB[i] & 0xf0;
k=k>>4;
LcdShowBuf[i+i]=Digit[k];
k=DataBufB[i] & 0x0f;
LcdShowBuf[i+i+1]=Digit[k];
}
}
void LcdDisplayData(unsigned char DataOne,unsigned char DataTwo,unsigned char DataThree,unsigned char DataFour,unsigned char DataFive,unsigned char DataSix,unsigned char DataSeven)
{
unsigned char data i;
LcdShowBuf[6]=DataFive;
LcdShowBuf[7]=DataSix;
switch(DataSeven)
{
case 0x00 : //没有小数点的显示/
LcdFull(DataOne,DataTwo,DataThree,DataFour);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -