0

我正在做一些 AVR 编程,并且有点掌握这整个位操作的事情,但仍然不太确定数据类型转换。

例如:

我有一个 16 位变量 ( myValue),它对应 2 个端口上的 16 个 LED 的状态(例如,端口 A 上的 8 个 LED 和端口 D 上的 8 个 LED)。的 8 个高位myValue在端口 D 上。

所以我的想法是基本上(0b0000000011111111 & myValue)用来获取端口 A 和(0b1111111100000000 & myValue)端口 D的值

那么问题是我可以做类似的事情uint8_t portA = (0b0000000011111111 & myValue)吗?我相信我可以简单地设置

PORTA |= portA

因为端口 A 只有 8 个引脚(在我的情况下)。

问题出现在端口 D 中,因为另一方面,端口 D 无法使用无符号 8 位,因为它在&操作后仍将保持为 16 位变量?然后如何设置一个 16 位变量的 8 针端口 D?

4

2 回答 2

2

分配比目标更大的值将截断高位。所以就

PORTA = (uint8_t)myValue;

足够了,不需要AND.

同样对于端口 D,您可以使用

PORTD = (uint8_t)(myValue >> 8);

这里的演员表是不必要的。它们只是为了在某些情况下禁用编译器警告,也为了清楚起见

请注意,如果要从 复制值,则应直接分配myValue值。使用OR将需要读取以加载当前端口的值,OR使用掩码然后将其写回,这比单纯的复制要慢。仅当您只想调整端口的某些位时才需要对值进行逻辑处理

于 2013-10-21T05:14:19.953 回答
1

利用:

PORTD = (myValue >> 8) & 0xff;

还要保持安全并为端口 A 进行剪裁:

PORTA = myValue & 0xff;

请注意,通过使用|=,您只能将位设置为 0 到 1,已经为 1 的位不会被 or 操作更改。

于 2013-10-20T22:12:47.713 回答