#ifndef ENC_H #define ENC_H // Определяем бит в регистре PIND для сигнала с клока энкодера. #define PIND_CLK 0b00010000 // Определяем бит в регистре PIND для сигнала с DT энкодера. #define PIND_DT 0b01000000 int encoder_state, prev_encoder_state = 3, state = 1; 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; if ( pin_clk_2 != prev_encoder_state) { prev_encoder_state = pin_clk_2; if ( !pin_clk_2 ) { switch(PIND & pin_dt_2 ) { case 0: state--; break; case 1: state++; break; } } } } void encoder_setup(void) { // Настройка портов ввода-вывода DDRD = 0x00; PORTD = (PIND_CLK + PIND_DT); } int encoder_value(void) { // Читаем состояние энкодера read_encoder_state(); return state; } //#include "enc.cpp" #endif /*ENC_H*/