解释有关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
选择“ 2”的低两位。
b & 0xFC

0xFC = 1111 1100
选择b的高6位。 或将它们在一起或,
PORTB
将包含b的高六位和and2ѭ的低二位。   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线路的状态。首先使用ѭ11current =
0x03
屏蔽PORTB的当前状态,因此将0和1以外的所有位复位。 第二步是使用0xFC屏蔽“ 10”,因此位0和1始终为0。然后将值进行“或”运算。有效地,它从b [7] .. b [2]设置PB7-PB2,同时保持PB1和PB0的当前状态不变。 请注意,PORTB寄存器位的用途不同,具体取决于通过DDRB寄存器配置的引脚方向。对于输出引脚,它仅控制引脚状态。对于输入引脚,PORTB控制该引脚的上拉电阻。例如,如果您在引脚和地之间连接了一个按钮,则必须启用该上拉电阻器-这样,当开关断开时,输入引脚不会浮置。     

要回复问题请先登录注册