ボタンの使い方

今回は,基板上にあるボタンをプログラムから使ってみます.

avr03.jpg

ボタン(タクトスイッチ)を押すと,LEDが点灯するようにしましょう.

スイッチの使い方

スイッチは,PC-0とPC-1に繋がっています.

まず,ポートを入力モードにするために,DDRCに0を書き込みます.

PINCの0ビット目と1ビット目にスイッチの状態が反映されます.

レジスタとボタンの対応

何もしていない状態が1で,押されている状態が0です.逆の方が感覚的に分かりやすいと思いますが,回路の都合で普通はこうなってます.

プルアップ抵抗

説明を端折ってしまいましたが,入力ピンに何もつながっていない(ボタンが押されていない)場合正常に入力値が取れません.ピンがどこにもつながっていないため,電圧が不定なためです.

そこで,電源とピンの間に大き目の抵抗を入れて,何もつながっていない状態にならないようにします.これをプルアップ抵抗と呼びます.

ボタンを押していないとき,抵抗を介して電源ライン意つながっているので,入力は1になります.ボタンを押すと,グランドに接続され電圧が0Vになるので入力が0になります.

AVRには,プルアップ抵抗が内臓されていて,出力のときにも使ったPORTレジスタでプルアップ抵抗を使うかどうか決定します.

ビット演算の復習

マイコンのプログラムでは,1つの変数に複数の情報を持たせることが頻繁にあります.必用なビットを取り出すためには,ビット演算子の「&」を使います.

一度に両方のスイッチを見ることもできます.

プログラム例

テキストエディタにコピーして貼り付けて,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
        }
    }
}

この文書の履歴

Copyright © binzume all rights reserved.