diff --git a/Encoder.c b/Encoder.c index 231b800..c87dbe4 100644 --- a/Encoder.c +++ b/Encoder.c @@ -7,7 +7,7 @@ // Определяем бит в регистре PIND для сигнала с DT энкодера. #define PIND_DT 0b01000000 -volatile uint8_t encoder_state, prev_encoder_state, state = 1; +volatile uint8_t encoder_state, prev_encoder_state = 3, state = 1; int sw34, pin_clk_2, pin_dt_2; @@ -22,44 +22,54 @@ void read_encoder_state() // Устанавливаем значение PIN_DT_2 в зависимости от установки бита PIND_DT в PIND pin_dt_2 = (PIND & PIND_DT) ? 1 : 0; // Получаем состояние энкодера - - // Определяем и сохраняем следующее состояние энкодера encoder_state = (pin_clk_2 << 1) | pin_dt_2; - // Проверяем, изменилось ли состояние энкодера if (encoder_state != prev_encoder_state) { switch (encoder_state) { case 0: // Поворот против часовой стрелки (CCW) if (prev_encoder_state == 3) - state++; - else if (prev_encoder_state == 0) - state--; + { + state++; + } break; + case 1: // Поворот по часовой стрелке (CW) - if (prev_encoder_state == 1) - state++; + if (prev_encoder_state == 1) + { + state++; + } else if (prev_encoder_state == 2) - state--; + { + state--; + } break; + case 2: // Поворот против часовой стрелки (CCW) if (prev_encoder_state == 1) - state++; + { + state++; + } else if (prev_encoder_state == 3) - state--; + { + state--; + } break; + case 3: // Поворот по часовой стрелке (CW) if (prev_encoder_state == 2) - state++; + { + state++; + } else if (prev_encoder_state == 0) - state--; + { + state--; + } break; } - - // Устанавливаем значение prev_encoder_state равным текущему состоянию энкодера - prev_encoder_state = encoder_state; -} + prev_encoder_state = encoder_state; + } } @@ -81,7 +91,6 @@ uint8_t encoder_value() // Если состояние энкодера изменилось, выводим его в последовательный порт if (state != sw34) { - //Serial.println(state); sw34 = state; return state; } @@ -94,6 +103,5 @@ void setup() void loop() { - //encoder_value(); Serial.println(encoder_value()); } \ No newline at end of file