• 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的值。

  • 相关阅读:
    博客园添加访问人数统计【转】
    Android环境下通过C框架层控制WIFI【转】
    用户态文件系统fuse学习【转】
    linux内核 RCU机制详解【转】
    使用diff制作补丁【学习笔记】
    OAuth2授权原理
    Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)
    lock关键字只不过是C#提供的语法糖
    关于OATUH中的AUTHRAZITON CODE和TOKEN的关系,实际上就是这么回事
    SQL Server 索引设计指南
  • 原文地址:https://www.cnblogs.com/IdeaMing/p/13296814.html
Copyright © 2020-2023  润新知