From c18400453d5158c502aa4a9c78b8024a64616195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9D=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= Date: Sun, 17 Mar 2024 17:23:49 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20Encoder.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Encoder.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 Encoder.cpp 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