zoukankan      html  css  js  c++  java
  • Keil C51 遇到的移位问题

    有个自动上传状态变化的代码

    使用stc15单片机在Keil C51上

    unsigned long State;//状态

    unsigned long StaBkp;//状态备份

    /***************************************************************Author:Liming***

    * @brief 状态自动上报

    * @param None

    * @retval None

    ****************************************************************0x49E7FC7B*****/

    uint8_t AutoReport(void)

    {

      uint8_t i;

      uint32_t res;

      uint32_t temp;

      State = GetSta();//获取状态

      res = (StaBkp^State);//获取状态差异

      if(res != 0)//有差异{

        for (i = 0; i < 24; i++){

          //temp = 1;

          //if ((res&(temp<<i)) != 0)

          if ((res&(0x00000001UL<<i)) != 0){

            //temp = 1;

            //StaBkp ^= (temp<<i);//修正状态

            StaBkp ^= (0x00000001UL<<i);//修正状态

            //temp = 1;

            //if ((State &(temp<<i)) == 0)

            if ((State &(0X00000001UL<<i)) == 0)

              TX1.Buff[7] = 0x00;

            else

              TX1.Buff[7] = 0x01;

            TX1.Cnt = 8;

            return SUCCESS;//需要上报

          }

        }

      } 

      return ERROR;

    }

    注意程序中红色的UL必须要加上,不然就会出现问题,编译器会把0x00000001以int类型来处理,Keil C51的int 类型为16位,所以会出现17-32位的数据异常。

    感谢网友的经验https://bbs.21ic.com/icview-606362-1-1.html 第18楼的回复。

    当然,换个做法就是使用注释掉的代码,先定义一个变量temp,每次要使用移位的数据,先temp=1,再移位,再使用temp的值。

  • 相关阅读:
    ReactiveX-简介
    docker简记
    ethereum-在Ubuntu上搭建私有链
    netflix-ribbon简介
    netflix-hystrix-简例
    netflix-hystrix-原理[译]
    netflix-hystrix-简介[译]
    JS简记-委托
    JS简记-对象关联
    JS简记-原型二
  • 原文地址:https://www.cnblogs.com/IdeaMing/p/13296814.html
Copyright © 2011-2022 走看看