?? 單相復費率.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 + -