//------------------------------------------------------------------------------ // // ロータリーエンコーダ テスト // 割り込み版 チャタリング対策改良版 (ATmega88P) // Copyright (c) 2011 Let's Try It! // //------------------------------------------------------------------------------ #include #include #include ISR(PCINT0_vect) { // チャタリング防止 _delay_ms(5); PCIFR = _BV(PCIF0); if (bit_is_clear(PINB, PB0)) // A相のスイッチがオンの時 { // B相のスイッチがオンの時 // 反時計回り if (bit_is_clear(PINB, PB1)) { // 右にビットシフト PORTD >>= 1; if (PORTD == 0) { PORTD = 0x80; } } // B相のスイッチがオフの時 // 時計回り else { // 左にビットシフト PORTD <<= 1; if (PORTD == 0) { PORTD = 0x01; } } } } int main() { DDRD = 0xff; // ポートDを出力にする PORTD = 0x08; // 中央のLEDを点灯させる DDRB = 0xfc; // ポートBを入力にする PORTB = 0x03; // 0と1を内部プルアップ // 割り込みの設定 PCICR = _BV(PCIE0); // PCIE0を有効化(PCIE0 = PORTB) PCMSK0 = _BV(PCINT0); // PCINT0を有効化(PCINT0 = PB0) // 割り込み有効化 sei(); // プログラムが終了しないようにする while (1) { PORTB |= _BV(PB2); _delay_ms(100); PORTB &= ~_BV(PB2); _delay_ms(100); } return 0; }