avr gcc-解释有关avr端口设置的代码



下面的操作是什么?

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

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

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

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

将这两个部分进行"或"运算,PORTD的第4位和第5位将包含b的第0位和第1位,其余部分将包含PORTD的原始值。

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

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

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

最新更新