diff --git a/Encoder.cpp b/Encoder.cpp new file mode 100644 index 0000000..69181c7 --- /dev/null +++ b/Encoder.cpp @@ -0,0 +1,84 @@ +#include "enc.h" +#include + +static int encoder_state, prev_encoder_state = 3, state = 1, total_state; + +void read_encoder_state(void) +{ + int pin_clk_2, pin_dt_2; + // Устанавливаем начальные значения переменных равное 0 + pin_clk_2 = 0; + pin_dt_2 = 0; + + // Устанавливаем значение PIN_CLK_2 в зависимости от установки бита PIND_CLK в PIND + pin_clk_2 = (PIND & PIND_CLK) ? 1 : 0; + // Устанавливаем значение 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 == 2) + state++; + else if (prev_encoder_state == 1) + state--; + break; + + case 1: // Поворот по часовой стрелке (CW) + if (prev_encoder_state == 0) + state++; + else if (prev_encoder_state == 3) + state--; + break; + + case 2: // Поворот против часовой стрелки (CCW) + if (prev_encoder_state == 3) + state++; + else if (prev_encoder_state == 0) + state--; + break; + + case 3: // Поворот по часовой стрелке (CW) + if (prev_encoder_state == 1) + state++; + else if (prev_encoder_state == 2) + state--; + break; + } + // Устанавливаем значение prev_encoder_state равным текущему состоянию энкодера + prev_encoder_state = encoder_state; + if ( state == 4 ) + { + total_state++; + state=0; + } + if ( state == -4 ) + { + total_state--; + state=0; + } + } +} + +void encoder_setup(void) +{ + // Настройка портов ввода-вывода + DDRD = 0x00; + PORTD = (PIND_CLK + PIND_DT); +} + +int encoder_value(void) +{ + // Читаем состояние энкодера + read_encoder_state(); + return total_state; +} \ No newline at end of file