试了一下4楼的代码,发现并不行,然后自己琢磨写了一下 这是我自己写的代码 k=DATA&0x80; j=k>>7; if(j==1) GPIO_SetBits(GPIOC,GPIO_Pin_3); else GPIO_ResetBits(GPIOC,GPIO_Pin_3); 这样应该好理解了,在原来代码的基础上让他赋值等于一个常量,然后把它右移7位,这就是他的最高位 |
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记住这句代码形式和功用 就可以了。我也是今天下午才理解透彻。 ----------有误之处,欢迎大侠拍砖。 |
仔细看MAX7219数据手册 |
紧急更正一下:昨晚回复较仓促外加基础不牢,文中有错误之处: 标准写法是: Max7219_pinDIN=(bit)(DATA&0x80); 掉了括号,否则编译能通过,但实际运行错误。 |
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 类型时 保留的是 : 最高位 !!! ————————知道这个规则后,例程中这段代码就可轻易理解了,这种类型代码您以后会经常遇到。 |
要仔细看MAX7219数据手册,不是一两句话可以给你说清楚。 |
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; |
看来楼主需要多看看C语言, 0x80的二进制展开是1000 0000,即最高位是1,当与一个数据(二进制8字节)做位与运算时,D0-D6都为0,D7如果数据为1,则结果是0x80,如果D7为0,则结果为0x00,这样就可以得到最高位的值了。 |
最高位一般是指符号位,所以不用发 |