找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6240|回复: 10
打印 上一主题 下一主题
收起左侧

关于单片机传送最高位date&0x80问题

  [复制链接]
跳转到指定楼层
楼主
ID:282021 发表于 2020-3-4 17:53 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
请问各位大神,为何我画出来的这一段写法为这种,我知道date&0x80后判断最高位状态,但是发送是不是发送的最低位吗?那怎么实现把最高位先发送出去了,望各位发生解答。

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

IMG_20200304_174953.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:496117 发表于 2020-3-4 18:46 | 只看该作者
最高位一般是指符号位,所以不用发
回复

使用道具 举报

板凳
ID:687694 发表于 2020-3-4 18:49 | 只看该作者
看来楼主需要多看看C语言,
0x80的二进制展开是1000 0000,即最高位是1,当与一个数据(二进制8字节)做位与运算时,D0-D6都为0,D7如果数据为1,则结果是0x80,如果D7为0,则结果为0x00,这样就可以得到最高位的值了。
回复

使用道具 举报

地板
ID:419968 发表于 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;
回复

使用道具 举报

5#
ID:94031 发表于 2020-3-4 20:31 | 只看该作者
要仔细看MAX7219数据手册,不是一两句话可以给你说清楚。
回复

使用道具 举报

6#
ID:433166 发表于 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  类型时      保留的是  :      最高位   !!!   
      ————————知道这个规则后,例程中这段代码就可轻易理解了,这种类型代码您以后会经常遇到。
回复

使用道具 举报

7#
ID:282021 发表于 2020-3-5 09:30 来自手机 | 只看该作者
liu888888 发表于 2020-3-4 20:57
您好,您所遇到的困惑我当年也遇到过,同感!
其实是这样的:
              1.这段代码写的不太标准,标 ...

感谢你,哎困惑了好久。
回复

使用道具 举报

8#
ID:433166 发表于 2020-3-5 14:14 | 只看该作者
紧急更正一下:昨晚回复较仓促外加基础不牢,文中有错误之处:
              标准写法是:  Max7219_pinDIN=(bit)(DATA&0x80);
                掉了括号,否则编译能通过,但实际运行错误。
回复

使用道具 举报

9#
ID:679425 发表于 2020-3-5 16:14 | 只看该作者
仔细看MAX7219数据手册
回复

使用道具 举报

10#
ID:433166 发表于 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记住这句代码形式和功用 就可以了。我也是今天下午才理解透彻。
             ----------有误之处,欢迎大侠拍砖。
      
回复

使用道具 举报

11#
ID:372775 发表于 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位,这就是他的最高位
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表