#include #define F_CPU 1000000UL #define PIND_CLK 0b00010000 #define PIND_DT 0b01000000 //#define PIND_MASK PIND_CLK + PIND_DT volatile uint8_t next_state, prev_state, state, state_1; int sw34, PIND_SHIFT_1, PIND_SHIFT_2, PIND_MASK, PIN_CLK_2, PIN_DT_2; // Передача void read_encoder_state() { PIND_SHIFT_1 = 0; PIND_SHIFT_2 = 0; PIND_MASK = 0; if(PIND_CLK == 4 & PIND_DT == 8) //0b00001100 = 12 { PIND_SHIFT_1 = 2; PIND_SHIFT_2 = 2; } if(PIND_CLK == 4 & PIND_DT == 16) //0b00010100 = 20 { PIND_SHIFT_1 = 2; PIND_SHIFT_2 = 3; } if(PIND_CLK == 4 & PIND_DT == 32) //0b00100100 = 36 { PIND_SHIFT_1 = 2; PIND_SHIFT_2 = 4; } if(PIND_CLK == 4 & PIND_DT == 64) //0b01000100 = 68 { PIND_SHIFT_1 = 2; PIND_SHIFT_2 = 5; } if(PIND_CLK == 4 & PIND_DT == 128) //0b10000100 = 132 { PIND_SHIFT_1 = 2; PIND_SHIFT_2 = 6; } if(PIND_CLK == 8 & PIND_DT == 4) //0b00001100 = 12 { PIND_SHIFT_1 = 3; PIND_SHIFT_2 = 2; } if(PIND_CLK == 8 & PIND_DT == 16) //0b00011000 = 24 { PIND_SHIFT_1 = 3; PIND_SHIFT_2 = 3; } if(PIND_CLK == 8 & PIND_DT == 32) //0b00101000 = 40 { PIND_SHIFT_1 = 3; PIND_SHIFT_2 = 4; } if(PIND_CLK == 8 & PIND_DT == 64) //0b01001000 = 72 { PIND_SHIFT_1 = 3; PIND_SHIFT_2 = 5; } if(PIND_CLK == 8 & PIND_DT == 128) //0b10001000 = 136 { PIND_SHIFT_1 = 3; PIND_SHIFT_2 = 6; } if(PIND_CLK == 16 & PIND_DT == 4) //0b00010100 = 16 { PIND_SHIFT_1 = 4; PIND_SHIFT_2 = 2; } if(PIND_CLK == 16 & PIND_DT == 8) //0b00011000 = 24 { PIND_SHIFT_1 = 4; PIND_SHIFT_2 = 3; } if(PIND_CLK == 16 & PIND_DT == 32) //0b00110000 = 48 { PIND_SHIFT_1 = 4; PIND_SHIFT_2 = 4; } if(PIND_CLK == 16 & PIND_DT == 64) //0b01010000 = 80 { PIND_SHIFT_1 = 4; PIND_SHIFT_2 = 5; } if(PIND_CLK == 16 & PIND_DT == 128) //0b10010000 = 144 { PIND_SHIFT_1 = 4; PIND_SHIFT_2 = 6; } if(PIND_CLK == 32 & PIND_DT == 4) //0b00100100 = 36 { PIND_SHIFT_1 = 5; PIND_SHIFT_2 = 2; } if(PIND_CLK == 32 & PIND_DT == 8) //0b00101000 = 40 { PIND_SHIFT_1 = 5; PIND_SHIFT_2 = 3; } if(PIND_CLK == 32 & PIND_DT == 16) //0b00110000 = 48 { PIND_SHIFT_1 = 5; PIND_SHIFT_2 = 4; } if(PIND_CLK == 32 & PIND_DT == 64) //0b01100000 = 96 { PIND_SHIFT_1 = 5; PIND_SHIFT_2 = 5; } if(PIND_CLK == 32 & PIND_DT == 128) //0b10100000 = 160 { PIND_SHIFT_1 = 5; PIND_SHIFT_2 = 6; } if(PIND_CLK == 64 & PIND_DT == 4) //0b01000100 = 68 { PIND_SHIFT_1 = 6; PIND_SHIFT_2 = 2; } if(PIND_CLK == 64 & PIND_DT == 8) //0b01001000 = 72 { PIND_SHIFT_1 = 6; PIND_SHIFT_2 = 3; } if(PIND_CLK == 64 & PIND_DT == 16) //0b01010000 = 80 { PIND_SHIFT_1 = 6; PIND_SHIFT_2 = 4; } if(PIND_CLK == 64 & PIND_DT == 32) //0b01100000 = 96 { PIND_SHIFT_1 = 6; PIND_SHIFT_2 = 5; } if(PIND_CLK == 64 & PIND_DT == 128) //0b11000000 = 192 { PIND_SHIFT_1 = 6; PIND_SHIFT_2 = 6; } PIN_CLK_2 = (PIND & PIND_CLK) >> PIND_SHIFT_1; PIN_DT_2 = (PIND & PIND_DT) >> PIND_SHIFT_2; PIND_MASK = (PIN_CLK_2 + PIN_DT_2); // Читаем состояние энкодера next_state = (PIND & PIND_MASK); // Обновляем состояние энкодера 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_CLK + PIND_DT); } void loop() { // Читаем состояние энкодера read_encoder_state(); // Если состояние энкодера изменилось, выводим его в последовательный порт if (state != sw34) { Serial.println(state); sw34 = state; } }