diff --git a/Encoder.c b/Encoder.c index 3cb64c7..231b800 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; +volatile uint8_t encoder_state, prev_encoder_state, state = 1; int sw34, pin_clk_2, pin_dt_2; @@ -22,24 +22,44 @@ 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 ((prev_encoder_state << 2) | encoder_state) + switch (encoder_state) { - case 1: // поворот по часовой стрелке - state++; + case 0: // Поворот против часовой стрелки (CCW) + if (prev_encoder_state == 3) + state++; + else if (prev_encoder_state == 0) + state--; break; - case 2: // поворот против часовой стрелке - state--; + case 1: // Поворот по часовой стрелке (CW) + if (prev_encoder_state == 1) + state++; + else if (prev_encoder_state == 2) + state--; + break; + case 2: // Поворот против часовой стрелки (CCW) + if (prev_encoder_state == 1) + state++; + else if (prev_encoder_state == 3) + state--; + break; + case 3: // Поворот по часовой стрелке (CW) + if (prev_encoder_state == 2) + state++; + else if (prev_encoder_state == 0) + state--; break; } - - // Устанавливаем значение prev_encoder_state равным текущему состоянию энкодера - prev_encoder_state = encoder_state; - } + + // Устанавливаем значение prev_encoder_state равным текущему состоянию энкодера + prev_encoder_state = encoder_state; +} } @@ -65,4 +85,15 @@ uint8_t encoder_value() sw34 = state; return state; } +} + +void setup() +{ + encoder_setup(); +} + +void loop() +{ + //encoder_value(); + Serial.println(encoder_value()); } \ No newline at end of file