解释有关AVR端口设置的此代码

时间:2011-05-26 11:41:28

标签: avr-gcc bitmask

以下是做什么的?

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

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

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

2 个答案:

答案 0 :(得分:4)

  

PORTB =(PORTB&amp; ~0xfc)| (b&amp; 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&amp; ~0x30)| ((b <&lt; 4)&amp; 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

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

答案 1 :(得分:0)

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

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

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