owclhly 2022-04-07 16:46 采纳率: 100%
浏览 71
已结题

C程序中计数最大值不能超过65535,如何设置可以大于这个值?当前最大值是65000

void KeySet ( void )
{
extern union usart_msg Rx_MSG, Tx_MSG;
unsigned int data0,data1,dtemp0,dtemp1;
unsigned long dlong0;
unsigned char pass;

Tx_MSG._xMsgClASS = Rx_MSG._xMsgClASS;
Tx_MSG._xMsgCODE = Rx_MSG._xMsgCODE;
Tx_MSG._xMsgID = Rx_MSG._xMsgID;

    data0 = Rx_MSG._data[0];
    data1 = Rx_MSG._data[1];

    switch ( Rx_MSG._xMsgCODE)
    {
        case '1' ://写编号
        {
            dtemp0 = E2promRD_word( ADDR_DEF_KeyID);
            if (dtemp0==0)
            {
                E2promWR_word( ADDR_DEF_KeyID ,data0);
                srand(data0);
                dtemp0 = rand();
                E2promWR_word( ADDR_DEF_KeyWords ,dtemp0);
            }
            data1 = 0;
            break;
        }
        case '2' ://读编号
        {
            data0 = E2promRD_word( ADDR_DEF_KeyID);
            data1 = 0;
            break;
        }
        case '3' ://读KEY原码
        {
            data0 = E2promRD_word( ADDR_DEF_KeyWords);
            data1 = 0;
            break;
        }
        case '4' ://
        {
            pass = 0;
            dtemp0 = E2promRD_word( ADDR_DEF_KeyErro);
            dtemp1 = E2promRD_word( ADDR_DEF_KeyID);
            if((dtemp0<=10)&&(dtemp1!=0))
            {
                dtemp1 = E2promRD_word( ADDR_DEF_KeyWords);
                if (data0 == dtemp1+7)
                {
                    AddOutSpare    (2);
                    pass = 1;
                }
                if(pass==0)
                {
                    dtemp0 = KeyWords1(dtemp1)+1217;
                    if (data0 == dtemp0)
                    {
                        AddOutSpare    (5000);
                        pass = 1;
                    }
                }
                if(pass==0)
                {
                    dtemp0 = KeyWords2(dtemp1)+1217;
                    if (data0 == dtemp0)
                    {
                        AddOutSpare    (20000);
                        pass = 1;
                    }
                }
                if(pass==0)
                {
                    dtemp0 = KeyWords3(dtemp1)+1217;
                    if (data0 == dtemp0)
                    {
                        AddOutSpare    (50000);
                        pass = 1;
                    }
                }
                if(pass)
                {    
                    dtemp0 = E2promRD_word( ADDR_DEF_KeyWords);
                    dtemp1 = E2promRD_word( ADDR_DEF_KeySum);
                    dtemp0 += dtemp1;

                    srand(dtemp0 );
                    dtemp1 = rand();
                    E2promWR_word( ADDR_DEF_KeyWords ,dtemp1);    
                    E2promWR_word( ADDR_DEF_KeyErro ,0);
                }
                else
                {
                    dtemp0 = E2promRD_word( ADDR_DEF_KeyErro);
                    E2promWR_word( ADDR_DEF_KeyErro ,dtemp0+1);
                }
            }
            else
            {
                data0 = 0;
                data1 = 0;
            }
            break;
        }
        case '5' ://读
        {
            data0 = E2promRD_word(ADDR_DEF_KeySum);
            data1 = E2promRD_word(ADDR_DEF_KeySum+2);
            break;
        }
        case '6' ://读
        {
            data0 = E2promRD_word(ADDR_DEF_KeySpare);
            data1 = E2promRD_word(ADDR_DEF_KeySpare+2);
            break;
        }
        case '7' ://读
        {
            data0 = E2promRD_word(ADDR_DEF_KeyErro);
            data1 = 0;
            break;
        }
    }
    Tx_MSG._data[0] = (unsigned int )data0;
    Tx_MSG._data[1] = (unsigned int )data1;

}
void KeyInitial(void)
{
unsigned int dtemp0 ,dtemp1;

dtemp0 = E2promRD_word( ADDR_DEF_KeyID);
if (dtemp0==0xFFFF)
{
    E2promWR_word( ADDR_DEF_KeyID ,0);

    E2promWR_word(ADDR_DEF_KeySum ,0); 
    E2promWR_word(ADDR_DEF_KeySum+2 ,0); 

    E2promWR_word(ADDR_DEF_KeySpare ,65000); 
    E2promWR_word(ADDR_DEF_KeySpare+2 ,0); 

    E2promWR_word(ADDR_DEF_KeyErro ,0);
    E2promWR_word(ADDR_DEF_KeyWords ,0);
}

}

//成功输出1次后输出1,否则输出0
unsigned int OutState;
unsigned char OutMonitor(void)
{
unsigned int dtemp0 ;

if (SG_org == 1)        //原点    
    OutState = 0;
else
{
    dtemp0 = SpiRead(ADDR_OutState);

    if ((dtemp0 == 0x0002)&&(OutState == 0))
        OutState = 1;
    else if ((dtemp0 == 0x0001)&&(OutState == 1))
        OutState = 2;
    else if ((dtemp0 == 0x0002)&&(OutState == 2))
        OutState = 3;
    else if ((dtemp0 == 0x0002)&&(OutState == 3))
        OutState = 0;

}

if (OutState==3)
    return(1);
else
    return(0);

}

//将输出总数加data
void AddOutSum(unsigned char data)
{
unsigned int dtempR0 ,dtempR1 ;
unsigned int dtempW0 ,dtempW1 ;
unsigned long dtemp0=0;

dtempR0 = E2promRD_word(ADDR_DEF_KeySum); 
dtempR1 = E2promRD_word(ADDR_DEF_KeySum+2); 

dtemp0 += dtempR1;
dtemp0 <<= 16;
dtemp0 += dtempR0;

dtemp0 += (unsigned long)data;

dtempW0 = dtemp0;
dtempW1 = dtemp0>>16;

E2promWR_word(ADDR_DEF_KeySum ,dtempW0); 
if (dtempW1!=dtempR1)
    E2promWR_word(ADDR_DEF_KeySum+2 ,dtempW1); 

}

//将余数输出总数减去data
//余数等于0时,输出0,否则输出1;
unsigned char DecOutSpare(unsigned int data)
{
unsigned long dtempR0 ,dtempR1;
unsigned long dtempW0 ,dtempW1;
unsigned long dtemp0=0;

dtempR0 = E2promRD_word(ADDR_DEF_KeySpare); 
dtempR1 = E2promRD_word(ADDR_DEF_KeySpare+2); 

dtemp0 += dtempR1;
dtemp0 <<= 16;
dtemp0 += dtempR0;

if(dtemp0>=data)
    dtemp0 -= (unsigned long)data;
else
    dtemp0 = 0;

dtempW0 = dtemp0;
dtempW1 = dtemp0>>16;

E2promWR_word(ADDR_DEF_KeySpare ,dtempW0); 
if (dtempW1!=dtempR1)
    E2promWR_word(ADDR_DEF_KeySpare+2 ,dtempW1); 

if(dtemp0==0)
    return(0);
else
    return(1);

}

//将余数输出总数加上data
//余数等于0时,输出0,否则输出1;
void AddOutSpare(unsigned int data)
{
unsigned int dtempR0 ,dtempR1;
unsigned int dtempW0 ,dtempW1;
unsigned long dtemp0=0;

dtempR0 = E2promRD_word(ADDR_DEF_KeySpare); 
dtempR1 = E2promRD_word(ADDR_DEF_KeySpare+2); 

dtemp0 += dtempR1;
dtemp0 <<= 16;
dtemp0 += dtempR0;

if(dtemp0>=0xFFFFFFFF)
    dtemp0 = 0xFFFFFFFF;
else
    dtemp0 += (unsigned long)data;

dtempW0 = dtemp0;
dtempW1 = dtemp0>>16;

E2promWR_word(ADDR_DEF_KeySpare ,dtempW0); 
if (dtempW1!=dtempR1)
    E2promWR_word(ADDR_DEF_KeySpare+2 ,dtempW1); 

}

unsigned int RightMoveR(unsigned int data,unsigned int n)
{
unsigned long dtemp0 ;
unsigned char i;

dtemp0 = data;
for(i=0;i<n;i++)
{
    if (dtemp0&0x01)
        dtemp0 |= 0x10000;
    dtemp0 = dtemp0 >> 1;
}

return(dtemp0);

}
unsigned int LeftMoveR(unsigned int data,unsigned int n)
{
unsigned long dtemp0;
unsigned char i;

dtemp0 = data;
for(i=0;i<n;i++)
{
    dtemp0 = dtemp0 << 1;
    if (dtemp0&0x10000)
        dtemp0 |= 0x01;
}

return(dtemp0);

}
unsigned int KeyWords1(unsigned int data)
{
unsigned int dtemp0 ,dtemp1;
unsigned int b=1;
unsigned char i;

dtemp0 = RightMoveR(data,1);
dtemp1 = LeftMoveR(data,1);

dtemp1 += dtemp0;

dtemp0 = 0;
for(i=0;i<16;i++)
{
    if(data&b)
        dtemp0++; 
    b <<= 1;
}

dtemp1 += dtemp0;

return(dtemp1);

}

unsigned int KeyWords2(unsigned int data)
{
unsigned int dtemp0 ,dtemp1;
unsigned int b=2;
unsigned char i;

dtemp0 = RightMoveR(data,2);
dtemp1 = LeftMoveR(data,2);

dtemp1 += dtemp0;

dtemp0 = 0;
for(i=0;i<16;i++)
{
    if(data&b)
        dtemp0++; 
    b <<= 1;
}

dtemp1 += dtemp0;

return(dtemp1);

}

unsigned int KeyWords3(unsigned int data)
{
unsigned int dtemp0 ,dtemp1;
unsigned int b=3;
unsigned char i;

dtemp0 = RightMoveR(data,3);
dtemp1 = LeftMoveR(data,3);

dtemp1 += dtemp0;

dtemp0 = 0;
for(i=0;i<16;i++)
{
    if(data&b)
        dtemp0++; 
    b <<= 1;
}

dtemp1 += dtemp0;

return(dtemp1);

}

  • 写回答

2条回答 默认 最新

  • qllaoda 2022-04-07 16:55
    关注

    把存储计数的变量改为32位的长整型,代码里好像有EEPROM的读写,注意做相应的调整,EEPROM读写都要改为适应32位整形的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 修改了问题 4月7日
  • 创建了问题 4月7日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分