Petka, огромное Вам спасибо! Всё получилось.
Собрал небольшую схемку для проверки.
Энкодер висит на порту B микросхемы ATmega32. PB1,PB2,PB3 - A,B,C энкодера соответственно.
Светодиоды повесил на порт C.
Если крутим оный влево, значит загорается светодиод на выходе PC0, если в право то PC1.
Вот исходник, может кому пригодится.
CODE
#include <stdio.h>
#include <avr/delay.h>
#include <avr/signal.h>
//Подпрограммы
void le(void)
{
//Зажигаем светодиод на PC0
PORTC |= _BV(PC0);
//И гасим светодиод на PC1
PORTC &= ~_BV(PC1);
}
void ri(void)
{
//Зажигаем светодиод на PC1
PORTC |= _BV(PC1);
//И гасим светодиод на PC0
PORTC &= ~_BV(PC0);
}
int main(void)
{
// Раздел переменных
int sost_A =0,sost_B=0,sost_C=0,sostn_A=0,sostn_B=0,sostn_C=0;
//Настраиваем порты
DDRB = 0x00;
PORTB = 0xff;
DDRC = 0b00000011;
PORTC = 0x00;
while(1)
{
//Запоминаем состояние портов
if (!(PINB & (1<<PINB1)))
{
sost_A = 1; //A
sost_B = 0;
sost_C = 0;
}
if (!(PINB & (1<<PINB2)))
{
sost_A = 0; //B
sost_B = 1;
sost_C = 0;
}
if (!(PINB & (1<<PINB3)))
{
sost_A = 0; //C
sost_B = 0;
sost_C = 1;
}
//Ждём 50 ms
_delay_ms(50);
//Запоминаем состояние портов
if (!(PINB & (1<<PINB1)))
{
sostn_A = 1; //A
sostn_B = 0;
sostn_C = 0;
}
if (!(PINB & (1<<PINB2)))
{
sostn_A = 0; //B
sostn_B = 1;
sostn_C = 0;
}
if (!(PINB & (1<<PINB3)))
{
sostn_A = 0; //C
sostn_B = 0;
sostn_C = 1;
}
//Сравниваем запомненные состояния
if ((sost_A & sostn_B)==1) le();
if ((sost_A & sostn_C)==1) ri();
if ((sost_B & sostn_C)==1) le();
if ((sost_B & sostn_A)==1) ri();
if ((sost_C & sostn_A)==1) le();
if ((sost_C & sostn_B)==1) ri();
// Обнуляем флаги
sostn_A = 0;
sostn_B = 0;
sostn_C = 0;
sost_A = 0;
sost_B = 0;
sost_B = 0;
}
}