我正在进行一些AVR编程,并且有点掌握这一点操作,但仍然不太确定数据类型转换。
例如:
我有一个16位变量(myValue
),它对应2个端口上16个LED的状态(例如,端口A上有8个LED,端口D上有8个LED)。 myValue
的8个高位位于端口D上。
所以我的想法是基本上使用(0b0000000011111111 & myValue)
来获取端口A的值和端口D的(0b1111111100000000 & myValue)
那么我可以问uint8_t portA = (0b0000000011111111 & myValue)
这样的问题吗?我相信我可以简单地设置
PORTA |= portA
因为端口A只有8个引脚(在我的情况下)。
端口D出现问题,因为另一方面无法使用无符号8位端口D,因为在&
操作后它仍然是16位变量?然后,如何设置一个带有16位变量的8针端口D?
答案 0 :(得分:2)
分配比目标大的值将截断高位。所以只是
PORTA = (uint8_t)myValue;
就足够了,不需要AND
。
同样对于端口D,您可以使用
PORTD = (uint8_t)(myValue >> 8);
这里的演员阵容是不必要的。它们仅用于在某些情况下禁用编译器警告,并且为了清晰起见
请注意,如果要复制myValue
中的值,则应直接指定值。使用OR
将需要读取以使用掩码加载当前端口的值OR
,然后将其写回,这比仅仅复制慢。只需要调整端口的某些位
答案 1 :(得分:1)
使用:
PORTD = (myValue >> 8) & 0xff;
同样保持安全并对端口A进行剪裁:
PORTA = myValue & 0xff;
请注意,通过使用|=
,您只能将位从0设置为1,已经为1的位将不会被或操作更改。