ブラジルの挨拶!
まず第一に、あなたの例にジョビに感謝します。第二に、彼の例にはわずかなエラーがあります。番号0x20は正しくありません。0x04である必要があります。また、提案として、コードで0xFB、0x20、または0x04などの16進数を使用しません。io.hにあるPINポート定義と、ヘッダーファイルで参照される他のポート定義を使用することをお勧めします。初心者向けにいくつかコメントを付けて、以下のJobyの例を書き直しました。
# include <avr/io.h>
int main (void)
{
// set all pins on PORTB for output
DDRB = 0xFF;
// set port pin PORTD2 as input and leave the others pins
// in their originally state (inputs or outputs, it doesn't matter)
DDRD &= ~(1 << PD2); // see comment #1
while (1)
{
if (PIND & (1<<PD2)) // see comment #2
PORTB |= (1<<PB2); // see comment #3
else
PORTB &= ~(1<<PB2); // see comment #4
}
return 0;
}
/ *
初心者向けのコメント
コメント#1:(1 << PD2)バイナリ00000100を生成します。操作「〜」はすべての数字を反転します。つまり、バイナリは11111011になります。最後に&=はDDRDと11111011の間に論理「AND」を適用し、結果が再び配置されますDDRDメモリ内。注:演算子「AND」は、DDRDメモリ内の各ビットに対して、上記の2進数と比較します。DDRDのビットが0で、同じバイト位置のバイナリのビットが1の場合、結果のビットは0です。DDRDが1で、バイナリのビットが1の場合、結果のビットは1です。 DDRDのビットが1または0で、バイナリのビットが0の場合、結果のビットは常に0です。要約すると、コマンドDDRD&=〜(1 << PD2)はビットPD2のみをゼロに変更し、他の1つ(0または1)はそのままにします。少し複雑に見えますが、慣れると、他のビットを変更せずに少しずつ変更する最良の方法です。
コメント#2:(1 << PD2)はバイナリ00000100を生成します。コメント#1で説明した同じロジック「AND」を使用して、コマンド「PIND&0000100」はPIND2(プッシュボタンが接続されている入力ピンto)は、highまたはnotに設定されます。バイナリビットが0に設定されているため、他のすべてのピンはFALSEになり、バイナリビット#2が1に設定されているため、IFステートメントはPD2入力がhighに設定されている場合のみTRUE、PD2入力が低に設定します。
コメント#3:コメント#1で説明したロジックに従って、このコマンドはポートPORTBの出力ピンPINB2を高電圧に設定します。LEDが約300オームの抵抗でこのピンポートに正しく接続されていて、その抵抗がアースに接続されている場合、LEDが点灯します。
コメント#4:前のコメントで説明したのと同じ理由でLEDが消灯するはずです。
最終的な考慮事項:
a)プッシュボタンが押されていないとき(開回路)に入力ピンPD2の電圧発振を防ぐため、LEDが誤って点灯しないように、プルダウン抵抗(1 kOhm以上)を配置することを強くお勧めしますこのランダムな電圧振動に。
b)免責事項:ここで説明するアイデアは教育目的でのみ使用するものであり、電子機器の専門家に相談する前に実際のシステムで使用しないでください。
* /