#include "Encoder.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; }