51单片机位操作问题
时间:10-02
整理:3721RD
点击:
单片机为stc宏晶单片机,8位单片机。我给一个状态变量赋值是。当我位操作是:
status |= 0x00800000;
status |= 0x00400000;
结果正确。
先预定义
#define POS_STATUS_USECD 1<<18
#define POS_STATUS_USEBD 1<<19
status |= POS_STATUS_USEBD;
status |= POS_STATUS_USECD;
status 18 19位结果为0。不能达到我位或的结果
这个是怎么回事。希望知道的给个答复。谢谢。
status |= 0x00800000;
status |= 0x00400000;
结果正确。
先预定义
#define POS_STATUS_USECD 1<<18
#define POS_STATUS_USEBD 1<<19
status |= POS_STATUS_USEBD;
status |= POS_STATUS_USECD;
status 18 19位结果为0。不能达到我位或的结果
这个是怎么回事。希望知道的给个答复。谢谢。
不好意思。18、19位数据应该为:
status |= 0x00080000;
status |= 0x00040000;
坐等大神解答。不知道是不是只能操作16数据。
把十六进制改成二进制吧
试试把宏改为
#define POS_STATUS_USECD 1UL<<18
#define POS_STATUS_USEBD 1UL<<19
你是不是用的uvsion软件来编程的?在uvison中整型常量默认为2个字节16位(可通过a=sizeof(1);语句来进行验证,在debug中查看a的值为2),1<<15后就变为1000 0000 0000 0000,再继续左移则高位的1溢出,以后一直为0000 0000 0000 0000,因此,1<<18和1<<19后16位上全为0(十进制0),再与status进行按位或运算就得不到正确结果。可将1改为长整形数据1L或1UL,此时1L或1UL为4字节数据32位,左移18位或19位后,1不会溢出,此时可得到正确结果。