diff --git a/Encoder.c b/Encoder.c index 3a198b3..239b9b2 100644 --- a/Encoder.c +++ b/Encoder.c @@ -7,7 +7,7 @@ // Определяем бит в регистре PIND для сигнала с DT энкодера. #define PIND_DT 0b01000000 -volatile uint8_t next_state, prev_state, state; +volatile uint8_t encoder_state, prev_encoder_state, state; int sw34, pin_clk_2, pin_dt_2; @@ -21,33 +21,43 @@ void read_encoder_state() pin_clk_2 = (PIND & PIND_CLK) ? 1 : 0; // Устанавливаем значение PIN_DT_2 в зависимости от установки бита PIND_DT в PIND pin_dt_2 = (PIND & PIND_DT) ? 1 : 0; - // Определяем и сохраняем следующее состояние энкодера - next_state = (pin_clk_2 << 1) | pin_dt_2; + // Определяем и сохраняем следующее состояние энкодера + // Получаем состояние энкодера + encoder_state = (pin_clk_2 << 1) | pin_dt_2; // Проверяем, изменилось ли состояние энкодера - if (next_state != prev_state) + if (encoder_state != prev_encoder_state) { - switch (next_state) - { - case 0: // CW - if (prev_state == 3) state++; - else if (prev_state == 0) state--; - break; - case 1: // CCW - if (prev_state == 1) state++; - else if (prev_state == 2) state--; - break; - case 2: // CW - if (prev_state == 1) state++; - else if (prev_state == 3) state--; - break; - case 3: // CCW - if (prev_state == 2) state++; - else if (prev_state == 0) state--; - break; - } - // Устанавливаем значение prev_state равным текущему состоянию энкодера - prev_state = next_state; + switch (encoder_state) + { + case 0: // Поворот против часовой стрелки (CCW) + if (prev_encoder_state == 3) + state++; + else if (prev_encoder_state == 0) + state--; + break; + 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; } }