#include #define F_CPU 1000000UL #define PIND_MASK 0b11000011 #define PIND_SHIFT 6 volatile uint8_t next_state, prev_state, state, state_1; int sw34; // Передача void read_encoder_state() { // Читаем состояние энкодера next_state = (PIND & PIND_MASK) >> PIND_SHIFT; // Обновляем состояние энкодера if (next_state != prev_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 = next_state; } } void setup() { // Инициализация последовательного порта Serial.begin(9600); // Настройка портов ввода-вывода DDRD = 0x00; PORTD = PIND_MASK; } void loop() { // Читаем состояние энкодера read_encoder_state(); // Если состояние энкодера изменилось, выводим его в последовательный порт if (state != sw34) { Serial.println(state); sw34 = state; } }