以下は何をしますか?
PORTB = (PORTB & ~0xFC) | (b & 0xFC);
PORTD = (PORTD & ~0x30) | ((b << 4) & 0x30);
私の知る限り、0xFCは16進値です。それは基本的に11111100と言っているので、PORTD0-PORTD1は出力ですが、残りは入力です。
そのコードの完全な説明は何でしょうか?
ポート 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 の元の値が含まれます。
最初の行は、ポートの 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 はピンのプルアップ抵抗を制御します。たとえば、ピンとグランドの間に押しボタンが接続されている場合は、このプルアップ抵抗を有効にする必要があります。これにより、スイッチが開いているときに入力ピンがフローティングしなくなります。