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