标题: 关于单片机传送最高位date&0x80问题 [打印本页]

作者: asp65    时间: 2020-3-4 17:53
标题: 关于单片机传送最高位date&0x80问题
请问各位大神,为何我画出来的这一段写法为这种,我知道date&0x80后判断最高位状态,但是发送是不是发送的最低位吗?那怎么实现把最高位先发送出去了,望各位发生解答。

IMG_20200304_174953.jpg (1.24 MB, 下载次数: 76)

IMG_20200304_174953.jpg

作者: huangzongwu    时间: 2020-3-4 18:46
最高位一般是指符号位,所以不用发
作者: lovexulu    时间: 2020-3-4 18:49
看来楼主需要多看看C语言,
0x80的二进制展开是1000 0000,即最高位是1,当与一个数据(二进制8字节)做位与运算时,D0-D6都为0,D7如果数据为1,则结果是0x80,如果D7为0,则结果为0x00,这样就可以得到最高位的值了。
作者: adject    时间: 2020-3-4 20:03
MAX7219_pinDIN = DATA&0X80;
应该是发送的0  因为MAX7219_pinDIN  只能是0 或 1  DATA&0x80 可能是 0 或 0x80

可以这样试试
for(i=0x80;i!= 0x01; i>>=1)
{
    if(i&DATA)
      {

         MAX7219_pinDIN = 1;
      }
    else  MAX7219_pinDIN =0;
}
或者

or(i=0;i<8;i++)
{
   
    if(0x01&(DATA>>(7-i)))
      {

         MAX7219_pinDIN = 1;
      }
    else  MAX7219_pinDIN =0;

作者: xuyaqi    时间: 2020-3-4 20:31
要仔细看MAX7219数据手册,不是一两句话可以给你说清楚。
作者: liu888888    时间: 2020-3-4 20:57
您好,您所遇到的困惑我当年也遇到过,同感!
其实是这样的:
              1.这段代码写的不太标准,标准写法是:  Max7219_pinDIN=(bit)DATA&0x80; 这里 “(bit)”是关键。
                2, 您有一个数据类型转换惯性误区,认为16位无符号UINT变量,在向8位无符号UCHAR类型变量赋值时,只能保留16位中的低8位;  由此您也得出  8位无符号变量在向1位bit类型变量传送时只能保留最低位!
         但这是有个例外的: 8位uchar  转变成 bit  类型时      保留的是  :      最高位   !!!   
      ————————知道这个规则后,例程中这段代码就可轻易理解了,这种类型代码您以后会经常遇到。
作者: asp65    时间: 2020-3-5 09:30
liu888888 发表于 2020-3-4 20:57
您好,您所遇到的困惑我当年也遇到过,同感!
其实是这样的:
              1.这段代码写的不太标准,标 ...

感谢你,哎困惑了好久。

作者: liu888888    时间: 2020-3-5 14:14
紧急更正一下:昨晚回复较仓促外加基础不牢,文中有错误之处:
              标准写法是:  Max7219_pinDIN=(bit)(DATA&0x80);
                掉了括号,否则编译能通过,但实际运行错误。
作者: haierzaifei11    时间: 2020-3-5 16:14
仔细看MAX7219数据手册
作者: liu888888    时间: 2020-3-5 21:08
asp65 发表于 2020-3-5 09:30
感谢你,哎困惑了好久。

下午我继续学习了一下数值转换同时更正一下上文表述错误:  8位uchar变量  转变成 bit  类型时  判断的是 uchar变量是 0和非0两种状态,对应的bit变量值就是 0和1 两种状态值。
      
       代码(DATA&0x80) 运算的结果是将DATA 中低7位清零,那么此时判断 运算后 DATA 值是否是非零态只剩下最高位 bit7的值 是否是1。
      若此时bit7 位值 是1:则运算后是:  0x80 ,非零值,bit类型转换后   为 1 。
       若此时bit7 位值 是0:则运算后是:  0x00 ,是0,   bit类型转换后    为 0  。  
   这样   这句 “ MAX7219_pinDIN = DATA&0X80;  ” 指令代码就实现了 把DATA 最高位 赋值给了MAX7219_pinDIN 引脚。
       这样解释其实还有缺陷,因为实际运算中参与清零运算的是DATA的一份拷贝值,DATA并未被真正清零,这牵扯到51汇编语言学习。            初期学习C记住这句代码形式和功用 就可以了。我也是今天下午才理解透彻。
             ----------有误之处,欢迎大侠拍砖。
      

作者: __Aknice    时间: 2021-3-29 23:01
试了一下4楼的代码,发现并不行,然后自己琢磨写了一下
这是我自己写的代码
k=DATA&0x80;
j=k>>7;
if(j==1)
        GPIO_SetBits(GPIOC,GPIO_Pin_3);
else
        GPIO_ResetBits(GPIOC,GPIO_Pin_3);
这样应该好理解了,在原来代码的基础上让他赋值等于一个常量,然后把它右移7位,这就是他的最高位




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1