1

以下は何をしますか?

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

私の知る限り、0xFCは16進値です。それは基本的に11111100と言っているので、PORTD0-PORTD1は出力ですが、残りは入力です。

そのコードの完全な説明は何でしょうか?

4

2 に答える 2

4

ポート B = (ポート B & ~0xfc) | (b & 0xfc);

それを分解する:

PORTB = PORTB & ~0xFC

0xFC =  1111 1100
~0xFC = 0000 0011

PORTB = PORTB & 0000 0011

の下位 2 ビットを選択しますPORTB

b & 0xFC

0xFC = 1111 1100

b の上位 6 ビットを選択します。

それらを一緒に OR するとPORTB、b の上位 6 ビットと の下位 2 ビットが含まれます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

2 つの部分を一緒に論理和すると、4 番目と 5 番目PORTDのビットに の 0 番目と 1 番目のビットが含まbれ、残りに PORTD の元の値が含まれます。

于 2011-05-26T12:41:31.590 に答える
0

最初の行は、ポートの PB7-PB2 ラインの状態を実際に設定します。PORTB の現在の状態は、最初に~0xFC=を使用してマスクさ0x03れるため、0 と 1 を除くすべてのビットがリセットされます。

2 番目のステップは 0xFC を使用したマスキングbであるため、ビット 0 と 1 は常に 0 です。その後、値は OR で結合されます。実際には、PB1 と PB0 の現在の状態をそのまま維持しながら、b[7]..b[2] から PB7-PB2 を設定します。

PORTB レジスタ ビットは、DDRB レジスタを介して設定されたピンの方向に応じて異なる目的を果たすことに注意してください。出力ピンの場合は、ピンの状態を制御するだけです。入力ピンの場合、PORTB はピンのプルアップ抵抗を制御します。たとえば、ピンとグランドの間に押しボタンが接続されている場合は、このプルアップ抵抗を有効にする必要があります。これにより、スイッチが開いているときに入力ピンがフローティングしなくなります。

于 2011-05-26T11:56:22.793 に答える