inputモード / スイッチを押すたびに何かをトグルする / 簡易的なチャタリング防止を施す

テキストのExample 6-3 (p.117)は、もう少し凝った方法でチャタリングを防いでいるが、ここではArduinoをはじめよう 第3版 (Make:PROJECTS) (pp.42-43)を参考に単にスイッチが落ち着くまで待つ方法にした。

f:id:ti-nspire:20190514055952p:plain:h225

#include <avr/io.h>
#include <util/delay.h>

int main(void){
    uint8_t was_Pressed = 0;
    uint8_t is_Pressed  = 0;
    //DDRD &= ~(1 << PD2); // スイッチを接続するPD2のIOをINにする。INがデフォルトなのでここでは省略する。
    PORTD |= (1 << PD2);   // スイッチを接続するPD2を内部プルアップする。

    DDRB = 0xff; // ポートBのIOを全部OUTにし、全部のピンにLEDを接続する。
    //PORTB = 0; // ポートBの全部のピンからLを出力する。

    while(1){
        is_Pressed = bit_is_clear(PIND, PD2); // ボタンが押されたかどうかを読み取って
        _delay_ms(10);                        // (チャタリング防止)
        if(is_Pressed && !was_Pressed){       // 前回の状態から変化していたら、
            PORTB = ~PORTB;                   // ポートBに接続してあるLED全部の状態を反転する。
        }
        was_Pressed = is_Pressed;
    }
    return 0;
}