1

以下是做什么的?

PORTB = (PORTB & ~0xFC) | (b & 0xFC);
PORTD = (PORTD & ~0x30) | ((b << 4) & 0x30);

AFAIK,0xFC 是一个十六进制值。那基本上是说11111100,因此PORTD0-PORTD1是输出,其余的是输入。

该代码的完整解释是什么?

4

2 回答 2

4

PORTB = (PORTB & ~0xfc) | (b & 0xfc);

分解它:

PORTB = PORTB & ~0xFC

0xFC =  1111 1100
~0xFC = 0000 0011

PORTB = PORTB & 0000 0011

选择 的低两位PORTB

b & 0xFC

0xFC = 1111 1100

选择 b 的高 6 位。

将它们组合在一起,PORTB将包含 b 的高六位和 的低两位PORTB

PORTD = (PORTD & ~0x30) | ((b << 4) & 0x30);

分解它:

PORTD = PORTD & ~0x30

0x30  = 0011 0000
~0x30 = 1100 1111

PORTD = PORTD & 11001111

选择 PORTD 的第 4 位和第 5 位(从 0 开始计数)以外的所有位

(b << 4) & 0x30

将 b 视为位字段:

b = b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0

b << 4 = b3 b2 b1 b0 0 0 0 0

0x30 = 0011 0000

(b << 4) & 0x30 = 0 0 b0 b1 0 0 0 0

将这两个部分组合在一起,PORTDb在其第 4 位和第 5 位中包含第 0 位和第 1 位,其余部分包含 PORTD 的原始值。

于 2011-05-26T12:41:31.590 回答
0

第一行实际上设置了端口的 PB7-PB2 线的状态。PORTB 的当前状态首先使用~0xFC=屏蔽0x03,因此除 0 和 1 之外的所有位都被复位。

第二步是b使用 0xFC 进行屏蔽,因此位 0 和 1 始终为 0。然后将这些值 OR'ed 在一起。实际上,它从 b[7]..b[2] 设置 PB7-PB2,同时保持 PB1 和 PB0 的当前状态不变。

请注意,PORTB 寄存器位的用途不同,具体取决于通过 DDRB 寄存器配置的引脚方向。对于输出引脚,它只是控制引脚状态。对于输入引脚,PORTB 控制引脚的上拉电阻。例如,如果您在引脚和地之间连接了一个按钮,则必须启用此上拉电阻 - 这样,当开关打开时输入引脚不会浮动。

于 2011-05-26T11:56:22.793 回答