打印

使用430制作的水表---数据处理&转换

[复制链接]
1195|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雁舞白沙|  楼主 | 2012-2-28 09:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#i nclude <GLOBAL.h>
#i nclude <stdlib.h>
#i nclude <stdbool.h>
#i nclude <msp430x41x.h>
//--------------------------------------------------------------------------------------------------------------------------数据转换区
//-----***-unsigned char HexToBcd(unsigned char InByte)-***-----//
//---功能描述:单字HEXTOBCD。
//---输入条件:InByte
//---输出项目:RetByte
unsigned char HexToBcd(unsigned char InByte)
{
    unsigned char i,RetByte;
    i=0;
    while(InByte>=0x0a)
    {
            InByte=InByte-0x0a;
            i++;
    }
    RetByte=16*i+InByte;
    return RetByte;
}
//-----***-unsigned char BcdToHex(unsigned char InByte)-***-----//
//---功能描述:单字BcdToHex。
//---输入条件:InByte
//---输出项目:RetByte
unsigned char BcdToHex(unsigned char InByte)
{
unsigned char i,j,RetByte;
i=InByte & 0xf0;
j=InByte & 0x0f;
RetByte=10*(i>>4)+j;
return RetByte;
}
//-----***-unsigned long BcdToLong(unsigned char *DataDptr,unsigned char dataLend)-***-----//
//---功能描述:多字节BCD数据转换位Long类型。
//---输入条件:*DataDptr->指定数组的首地址,DataLend->需要转换的数据长度
//---输出项目:RetData
unsigned long BcdToLong(unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char i,j,k;
    unsigned long l,RetData;
    RetData=BcdToHex(*DataDptr);
    for(i=1;i<DataLend;i++)
    {
         k=i*2;
         DataDptr++;
         l=BcdToHex(*DataDptr);
         for(j=0;j<k;j++)  
         {
            l=l*10;
         }
         RetData=RetData+l;
    }
    return RetData;
}
//-----***-unsigned long HexToLong(unsigned char *DataDptr,unsigned char DataLend)-***-----//
//---功能描述:多字节Hex数据转换位Long类型。
//---输入条件:*DataDptr->指定数组的首地址,DataLend->需要转换的数据长度
//---输出项目:RetData
unsigned long HexToLong(unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char i;
    unsigned long j,RetData;
    j=0;
    RetData=0;
    for(i=DataLend;i>0;i--)
    {
         j=*DataDptr;
         j=j<<((i-1)*8);
         RetData=RetData+j;
         DataDptr++;
    }
    return RetData;
}
//-----***-void LongToBcd(unsigned char *DataDptr,unsigned long LongData)-***-----//
//---功能描述:Long数据转换为4字节的BCD数据。
//---输入条件:LongData->Long数据
//---输出项目:*DataDptr->指定数组的首地址
void LongToBcd(unsigned char *DataDptr,unsigned long LongData)
{
    unsigned char i;
    unsigned long Data;
    Data=LongData;
    for(i=0;i<4;i++)
    {      
        if(i<3)
        {
            *DataDptr=Data%100;
            Data=Data/100;
            *DataDptr=HexToBcd(*DataDptr);
        }
        else
        {
            *DataDptr=Data;
            *DataDptr=HexToBcd(*DataDptr);
        }
        DataDptr++;
    }
}
//-----***-void LongToHex(unsigned char *DataDptr,unsigned long LongData)-***-----//
//---功能描述:Long数据转换为4字节的hex数据。
//---输入条件:LongData->Long数据
//---输出项目:*DataDptr->指定数组的首地址
void LongToHex(unsigned char *DataDptr,unsigned long LongData)
{
    unsigned char i;
    unsigned long Data;
    Data=LongData;
    for(i=4;i>0;i--)
    {      
        Data=LongData;
        *DataDptr=Data>>((i-1)*8);;
        DataDptr++;
    }
}
//--------------------------------------------------------------------------------------------------------------------------数据校验区
//-----***-bool ChkCardAdd(void)-***-----//
//---功能描述:比对卡地址数据是否等于表地址数据
//---输入条件:
//---输出项目:CardSnOk
bool ChkCardAdd(void)
{
    bool CardSnOk;
    unsigned char i;
    CardSnOk=1;
    RamCopy(&GloBuf[1],&MeterNum[1],3);
    RamCopy(&GloBuf[4],&ChongZhi[2],2);
    for(i=1;i<6;i++)
    {
        if(CardBuf[i]!=GloBuf[i])
        {
            CardSnOk=0;
            break;
        }
    }
    return CardSnOk;
}
//-----***-bool DataChk(unsigned char *DataOneDptr,unsigned char *DataTwoDptr,unsigned char DataLend)-***-----//
//---功能描述:比对两组数据是否相同
//---输入条件:*DataOneDptr-->指定数组A的首地址,*DataTwoDptr-->指定数组A的首地址,DataLend-->需要比对的长度
//---输出项目:ChkSt
bool DataChk(unsigned char *DataOneDptr,unsigned char *DataTwoDptr,unsigned char DataLend)
{
    bool ChkOk;
    unsigned char i;
    ChkOk=1;
    for(i=0;i<DataLend;i++)
    {
        if(*DataOneDptr!=*DataTwoDptr)
        {
            ChkOk=0;
            break;
        }
        else
        {
            DataOneDptr++;
            DataTwoDptr++;
        }
    }
    return ChkOk;
}
//-----***-bool DataXorChk(unsigned char *DataDptr,unsigned char DataLend)-***-----//
//---功能描述:数据异或校验
//---输入条件:*DataDptr-->指定数组的首地址,DataLend-->需要校验的数据长度
//---输出项目:ChkOk
bool DataXorChk(unsigned char *DataDptr,unsigned char DataLend)
{
    bool ChkOk;
    unsigned char i,j,k;
    unsigned char DataOne,DataTwo;
   
    CardChkData=0;
    DataOne=*DataDptr;
    DataTwo=*(DataDptr+1);
    DataDptr++;
    for(i=0;i<DataLend-1;i++)
    {
        k=0x80;
        for(j=0;j<8;j++)
        {
            CardChkData<<=1;
            if((DataOne & k)== (DataTwo & k))
            {
                    CardChkData&=0xfe;
            }
            else
            {
                    CardChkData|=0x01;  
            }
            k>>=1;
        }
        DataDptr++;
        DataTwo=*DataDptr;
        DataOne=CardChkData;
    }
    if(CardChkData==*DataDptr)
    {
        ChkOk=1;
    }
    else
    {
        ChkOk=0;
    }
    return ChkOk;
}
//--------------------------------------------------------------------------------------------------------------------------数据运算
//-----***-void DataAddup(unsigned char *DataDptr,unsigned char DataLend)-***-----//
//---功能描述:不大于100的16进纸数组累加
//---输入条件:*DataDptr-->指定数组的首地址,DataLend-->需要累加的长度
//---输出项目:
void DataAddup(unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char i;
    *DataDptr=BcdToHex(*DataDptr);
    *DataDptr=*DataDptr+1;
    for(i=0;i<DataLend;i++)
    {      
        if(*DataDptr>=0x64)
        {
            *DataDptr=0;
            DataDptr++;
            *DataDptr=BcdToHex(*DataDptr);
            *DataDptr=*DataDptr+1;
        }
        else
        {
            *DataDptr=HexToBcd(*DataDptr);
            break;
        }
    }
}
//-----***-void DptrDecData(unsigned char *DataOneDptr,unsigned char *DataTwoDptr,unsigned char *DataThrDptr)-***-----//
//---功能描述:数组减法(4字节BCD)
//---输入条件:DataOneDptr-->被减数数组首地址,DataTwoDptr-->减数,数组首地址,DataThrDptr-->查数组首地址
//---输出项目:
void DptrDecData(unsigned char *DataOneDptr,unsigned char *DataTwoDptr,unsigned char *DataThrDptr)
{
    unsigned char i;
    for(i=0;i<4;i++)
    {
        GloBuf[i]=*DataOneDptr;
        GloBuf[i+4]=*DataTwoDptr;
        DataOneDptr++;
        DataTwoDptr++;
    }
    DataOne=BcdToLong(&GloBuf[0],4);
    DataTwo=BcdToLong(&GloBuf[4],4);
    DataThr=0;
    if(DataOne>DataTwo)
    {
       DataThr=DataOne-DataTwo;  
    }
    LongToBcd(&GloBuf[8],DataThr);
    for(i=0;i<4;i++)
    {
        *DataThrDptr=GloBuf[i+8];
        DataThrDptr++;
    }
}
//-----***-void DataAdd(unsigned char *DataOneDptr,unsigned char *DataTwoDptr,unsigned char *DataThrDptr)-***-----//
//---功能描述:数组相加(4字节BCD)
//---输入条件:DataOneDptr-->被加数,数组首地址,DataTwoDptr-->加数,数组首地址,DataThrDptr-->累加和,数组首地址
//---输出项目:
void DataAdd(unsigned char *DataOneDptr,unsigned char *DataTwoDptr,unsigned char *DataThrDptr)
{
    unsigned char i,DataLow,DataHigh,TempBufOne,TempBufTwo,DataOver;
    DataOver=0;
    for(i=0;i<4;i++)
    {
        TempBufOne=*DataOneDptr;
        TempBufTwo=*DataTwoDptr;
        DataLow=(TempBufOne&0x0f) + (TempBufTwo&0x0f) + DataOver;
        if(DataLow>0x09)
        {
            DataLow=DataLow-10;
            DataOver=1;
        }
        else
        {
            DataOver=0;
        }   
        DataHigh=(TempBufOne>>4) + (TempBufTwo>>4) + DataOver;
        if(DataHigh>0x09)
        {
            DataHigh=DataHigh-10;
            DataOver=1;
        }
        else
        {
            DataOver=0;
        }        
        *DataThrDptr= DataLow + (DataHigh<<4);
        DataOneDptr++;
        DataTwoDptr++;
        DataThrDptr++;
    }   
}
//--------------------------------------------------------------------------------------------------------------------------数据存储以及提取
//-----***-void DataPick(void)-***-----//
//---功能描述:提取表水量信息
//---输入条件:
//---输出项目:
void DataPick(void)
{  
    FlashLongRead(0x1000,MeterNum,0);//----------------------------------表号
    FlashLongRead(0x1004,AddsBuy,1);//-----------------------------------总购买量
    FlashLongRead(0x1008,Overal,1);//------------------------------------累计量
    FlashLongRead(0x100c,MeterSt,1);//-----------------------------------表状态字
    FlashLongRead(0x1010,BaoJing,1);//-----------------------------------报警两
    FlashLongRead(0x1014,Regrate,1);//-----------------------------------囤积量
    FlashLongRead(0x1018,BuyData,1);//-----------------------------------本次购买
    FlashLongRead(0x101c,Residual,1);//----------------------------------剩余量
    FlashLongRead(0x1020,OverData,1);//----------------------------------透支量
    FlashLongRead(0x1024,ChongZhi,1);//----------------------------------充值次数和地区代码
}
//-----***-void DataSave(void)-***-----//
//---功能描述:存储表水量信息
//---输入条件:
//---输出项目:
void DataSave(void)
{
    FlashErase(0x1000);
    FlashLongWrite(0x1000,MeterNum,0);//----------------------------------表号
    FlashLongWrite(0x1004,AddsBuy,1);//-----------------------------------总购买量
    FlashLongWrite(0x1008,Overal,1);//------------------------------------累计量
    FlashLongWrite(0x100c,MeterSt,1);//-----------------------------------表状态字
    FlashLongWrite(0x1010,BaoJing,1);//-----------------------------------报警两
    FlashLongWrite(0x1014,Regrate,1);//-----------------------------------囤积量
    FlashLongWrite(0x1018,BuyData,1);//-----------------------------------本次购买
    FlashLongWrite(0x101c,Residual,1);//----------------------------------剩余量
    FlashLongWrite(0x1020,OverData,1);//----------------------------------透支量
    FlashLongWrite(0x1024,ChongZhi,1);//----------------------------------充值次数和地区代码
}
//--------------------------------------------------------------------------------------------------------------------------数据清除以及复制
//-----***-void RamCopy(unsigned char *DataOneDptr,unsigned char *DataTwoDptr,unsigned char DataLend)-***-----//
//---功能描述:数据复制
//---输入条件:*DataOneDptr-->目的地数组的首地址,*DataTwoDptr-->数据源数组的首地址,DataLend-->需要复制的长度
//---输出项目:
void RamCopy(unsigned char *DataOneDptr,unsigned char *DataTwoDptr,unsigned char DataLend)
{
    unsigned char i;
    for(i=0;i<DataLend;i++)
    {
        *DataOneDptr=*DataTwoDptr;
        DataOneDptr++;
        DataTwoDptr++;
    }
}
//-----***-void RamCler(unsigned char *DataDptr,unsigned char DataLend)-***-----//
//---功能描述:数据清零
//---输入条件:*DataDptr-->需要清零数组的首地址,DataLend-->需要清零的长度
//---输出项目:
void RamCler(unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char i;
    for(i=0;i<DataLend;i++)
    {
         *DataDptr=0;
         DataDptr++;
    }
}
//-----***-void ClerDataInfo(void)-***-----//
//---功能描述:表计水量信息归零
//---输入条件:
//---输出项目:
void ClerDataInfo(void)
{
    RamCler(MeterNum,4);//----------------------------------------------表号
    RamCler(AddsBuy,4);//-----------------------------------------------累购量
    RamCler(Overal,4);//------------------------------------------------累计量
    RamCler(MeterSt,4);//-----------------------------------------------表状态
    RamCler(BaoJing,4);//-----------------------------------------------报警量
    RamCler(Regrate,4);//-----------------------------------------------囤积量
    RamCler(BuyData,4);//-----------------------------------------------购买量
    RamCler(Residual,4);//----------------------------------------------剩余量
    RamCler(OverData,4);//----------------------------------------------透支量
    RamCler(ChongZhi,4);//----------------------------------------------充值次数和地区代码
    DataSave();
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

789

帖子

243

粉丝