打印

这个函数要实现的是什么功能呢,求教

[复制链接]
905|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
还我今生|  楼主 | 2017-3-7 14:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
几个定义
EEPROM_EXT unsigned char  TempBufOfMain[258];

typedef struct  instantx
{
        unsigned char voltagex[4];
        unsigned char currentx[4];
        unsigned char current1x[4];
        unsigned char KWx[4];
        unsigned char Tvoltagex[5];
        unsigned char FTvoltagex[5];
        unsigned char TKWx[6];
        unsigned int  TNx;       
        unsigned char FTKWx[6];
        unsigned int  FTNx;       
};
ENERGY_EXT  struct instantx instant;

函数1
void ReadFastInstanat(void)
{
         memcpy_c(&instant.voltage[0], &instant.voltagex[0],4);
          memcpy_c(&instant.activepower[0], &instant.KWx[0],4);

                if(!(instant.TNx==0xffff))
         {
                 instant.TNx++;
                 TempBufOfMain[0]=instant.Tvoltagex[0];
                 TempBufOfMain[1]=instant.Tvoltagex[1];
                 TempBufOfMain[2]=instant.Tvoltagex[2];
                 TempBufOfMain[3]=instant.Tvoltagex[3];
                 TempBufOfMain[4]=instant.Tvoltagex[4];
                 TempBufOfMain[10]=0;
                 TempBufOfMain[11]=instant.voltagex[0];
                 TempBufOfMain[12]=instant.voltagex[1];
                 TempBufOfMain[13]=instant.voltagex[2];
                 TempBufOfMain[14]=instant.voltagex[3];
                 BcdAdd(&TempBufOfMain[10],TempBufOfMain,instant.Tvoltagex,5);
                 TempBufOfMain[0]=instant.TKWx[0];
                 TempBufOfMain[1]=instant.TKWx[1];
                 TempBufOfMain[2]=instant.TKWx[2];
                 TempBufOfMain[3]=instant.TKWx[3];
                 TempBufOfMain[4]=instant.TKWx[4];
                 TempBufOfMain[5]=instant.TKWx[5];
                 TempBufOfMain[9]=0;
                 TempBufOfMain[10]=0;
                 TempBufOfMain[11]=instant.KWx[0];
                 TempBufOfMain[12]=instant.KWx[1];
                 TempBufOfMain[13]=instant.KWx[2];
                 TempBufOfMain[14]=instant.KWx[3];
                 BcdAdd(&TempBufOfMain[9],TempBufOfMain,instant.TKWx,6);
                                         
         }


函数2
u8 BcdAdd(u8 *AddendPnt,u8 *AugendPnt,u8 *SumPnt,u8 Length)
{
        u8 i;
        u8 Sign=0;
        u8 TempVar;
        AddendPnt=AddendPnt+Length-1;
        AugendPnt=AugendPnt+Length-1;
        SumPnt=SumPnt+Length-1;
       
        for(i=0;i<Length;i++)
        {
                //处理低位
                *SumPnt=Sign;
                *SumPnt+=(*AddendPnt&0x0f);       
                *SumPnt+=(*AugendPnt&0x0f);
                if(*SumPnt>0x09)
                {
                        *SumPnt+=0x06;
                        *SumPnt&=0x0f;                       
                        TempVar=1;
                }
                else
                        TempVar=0;
                //处理高位
                TempVar+=(*AddendPnt>>4);
                TempVar+=(*AugendPnt>>4);
                if(TempVar>0x09)
                {
                        TempVar+=0x06;
                        Sign=1;
                }
                else
                        Sign=0;       
                *SumPnt+=(TempVar<<4);
                SumPnt--;
                AddendPnt--;
                AugendPnt--;       
        }
        return Sign;
}

我想问的是 函数2实现了什么功能,求大侠指点


相关帖子

沙发
NE5532| | 2017-3-7 14:36 | 只看该作者
函数名称上已经说了,BCD码加法。

使用特权

评论回复
板凳
xyz549040622| | 2017-3-7 14:38 | 只看该作者
好像是把AddendPnt和AugendPnt地址的数据进行分解,累加到SumPnt的地址上,并进行处理。

使用特权

评论回复
地板
还我今生|  楼主 | 2017-3-7 14:39 | 只看该作者
水平比较菜 ,看不懂  哪位给具体解释下 什么意思    BcdAdd(&TempBufOfMain[10],TempBufOfMain,instant.Tvoltagex,5); 具体是怎么调用的

使用特权

评论回复
5
dirtwillfly| | 2017-3-7 15:09 | 只看该作者
还我今生 发表于 2017-3-7 14:39
水平比较菜 ,看不懂  哪位给具体解释下 什么意思    BcdAdd(&TempBufOfMain[10],TempBufOfMain,instant.Tv ...

这个函数的参数,依次是加数、被加数、和、数据长度
但我看你的函数有问题。
可以参考这里例程http://wenku.baidu.com/link?url= ... ikF1TEjZSVAufV_FqX7

使用特权

评论回复
6
还我今生|  楼主 | 2017-3-7 15:23 | 只看该作者
谢谢  最后一个 return Sign; 又是干什么用呢?
返回不是0 就是1而已啊 校验和吗?

使用特权

评论回复
7
linqing171| | 2017-3-7 22:56 | 只看该作者
进位标准,  比如 99+99=198, 99 在结果里面, 1在sign里面.
如果在8051下,参考DA A汇编指令的描述.

使用特权

评论回复
8
dirtwillfly| | 2017-3-8 13:49 | 只看该作者
还我今生 发表于 2017-3-7 15:23
谢谢  最后一个 return Sign; 又是干什么用呢?
返回不是0 就是1而已啊 校验和吗? ...

一个标志位而已

使用特权

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

本版积分规则

218

主题

1382

帖子

1

粉丝