yaoyao1314 发表于 2013-3-10 10:55

求指导 if((temp&0x80)==0x80)

本帖最后由 yaoyao1314 于 2013-3-10 10:56 编辑

void WR_SO12864(unsigned char dat_comm,unsigned char content)
{
unsigned char i,j,temp;
temp=content;
if(dat_comm==0)
    SO12864_A0_OUT =0;
else
    SO12864_A0_OUT =1;
SO12864_SCL_OUT=0;
for(i=0;i<8;i++)
{
    if((temp&0x80)==0x80) ///这里为什么要加一个按位与的运算呢?这是做液晶显示的一段代码
    {
      SO12864_SI_OUT=1;
    }
    else
    {
      SO12864_SI_OUT=0;
    }
      for(j=0;j<10;j++);
    SO12864_SCL_OUT=1;
      for(j=0;j<10;j++);
    SO12864_SCL_OUT=0;
      for(j=0;j<10;j++);
    temp<<=1;
}
}

refee 发表于 2013-3-10 11:23

从最高位开始发送数据 如果Bit7为高 则Data置高 否则置低 然后将数据右移一位 Bit6变成Bit7 如此循环以完成一个字节的发送

yaoyao1314 发表于 2013-3-10 12:08

整个函数是完成这样的功能,但是这个判断 if((temp&0x80)==0x80) ///这里为什么要加一个按位与的运算呢?这是做液晶显示的一段代码
我不明白为什么要加上这个

refee 发表于 2013-3-10 12:53

判断Bit7是否为高呀……

zhangmangui 发表于 2013-3-10 12:55

yaoyao1314 发表于 2013-3-10 12:08 static/image/common/back.gif
整个函数是完成这样的功能,但是这个判断 if((temp&0x80)==0x80) ///这里为什么要加一个按位与的运算呢?这 ...

if((temp&0x80)==0x80)这句其实就是判断temp最高位是零还是一 啊    当==0x80的话 说明temp的最高位是1否则是0 啊

yaoyao1314 发表于 2013-3-10 13:31

明白啦谢谢两位的耐心指导!

ddb_21ic 发表于 2013-3-11 09:46

这样写不知道编译器会不会进行优化,位与之后,再与0x80进行比较。
如果写成if ( ( temp & 0x80) !=0 ),可以位与之后利用状态寄存器跳转,无需进行比较运算。

星火燎原 发表于 2013-3-11 11:14

直接这样
if(temp&0x80)
{

}
esle
{

}

yaoyao1314 发表于 2013-3-16 12:29

我的神 怎么结贴啊!

refee 发表于 2013-3-16 15:27

yaoyao1314 发表于 2013-3-16 12:29 static/image/common/back.gif
我的神 怎么结贴啊!

https://bbs.21ic.com/icview-442857-1-1.html
页: [1]
查看完整版本: 求指导 if((temp&0x80)==0x80)