ボタンの使い方
今回は,基板上にあるボタンをプログラムから使ってみます.
ボタン(タクトスイッチ)を押すと,LEDが点灯するようにしましょう.
スイッチの使い方
スイッチは,PC-0とPC-1に繋がっています.
まず,ポートを入力モードにするために,DDRCに0を書き込みます.
PINCの0ビット目と1ビット目にスイッチの状態が反映されます.
何もしていない状態が1で,押されている状態が0です.逆の方が感覚的に分かりやすいと思いますが,回路の都合で普通はこうなってます.
プルアップ抵抗
説明を端折ってしまいましたが,入力ピンに何もつながっていない(ボタンが押されていない)場合正常に入力値が取れません.ピンがどこにもつながっていないため,電圧が不定なためです.
そこで,電源とピンの間に大き目の抵抗を入れて,何もつながっていない状態にならないようにします.これをプルアップ抵抗と呼びます.
ボタンを押していないとき,抵抗を介して電源ライン意つながっているので,入力は1になります.ボタンを押すと,グランドに接続され電圧が0Vになるので入力が0になります.
AVRには,プルアップ抵抗が内臓されていて,出力のときにも使ったPORTレジスタでプルアップ抵抗を使うかどうか決定します.
ビット演算の復習
マイコンのプログラムでは,1つの変数に複数の情報を持たせることが頻繁にあります.必用なビットを取り出すためには,ビット演算子の「&」を使います.
- SW1が押されて無いとき → (PINC&1) = 1
- SW1が押されているとき → (PINC&1) = 0
- SW2が押されて無いとき → (PINC&2) = 2
- SW2が押されているとき → (PINC&2) = 0
一度に両方のスイッチを見ることもできます.
- SW1:OFF SW2:OFF → (PINC&3) = 3
- SW1:ON SW2:OFF → (PINC&3) = 2
- SW1:OFF SW2:ON → (PINC&3) = 1
- SW1:ON SW2:ON → (PINC&3) = 0
プログラム例
テキストエディタにコピーして貼り付けて,sw_test.cという名前で保存してください.
#define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h> // 指定された時間だけ待つ void wait(uint16_t w){ while (w-->0) _delay_ms(1); } int main() { DDRC = 0x00; // ポートCは全て入力モード PORTC = 0x03; // 内部プルアップON DDRD=0x0F; for(;;) { wait(100); // 少し待つ if ( (PINC&1)==0 ) { // 押されている PORTD = 0b1111; // ON } else { // 押されていない PORTD = 0b0000; // OFF } } }
この文書の履歴
- 2006-06-29 慌てて作成
- 2010-01-01 プルアップ抵抗について追記
Copyright © binzume all rights reserved.