如何获得16位变量的8位高位?

时间:2013-10-20 22:05:27

标签: c bit-manipulation avr

我正在进行一些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?

2 个答案:

答案 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的位将不会被或操作更改。