Код: Выделить всё
char New;
int EncState1=0;
int EncData1=0;
//Инициализация таймера
void timer_init (void)
{
cli(); //остановка глобального прерывания
TCCR0=(1<<WGM01); // устанавливаем режим СТС (сброс по совпадению)
TIMSK |= (1<<OCIE0); // устанавливаем бит разрешения прерывания счетчика по совпадению
OCR0 = 0b11111111; // определяем число сравнения
TCCR0|=(1<<CS00); //запуск таймера с предделителем
sei(); // enable global interrupt
}
//опрос порта Д
void EncoderScan(void)
{
New = PIND & 0xFF; // Берем текущее значение
//1-й энкодер
if ((New != EncState1) && (EncState1 == 3))
{
if(New == 0b00000001)
EncData1++;
else
if(New == 0b00000010)
EncData1--;
}
EncState1 = New; // Записываем новое значение
}
ISR (TIMER0_COMP_vect)
{
EncoderScan();
if(EncData1 == 1)
{
EncData1=0;
j+=1; //увеличиваем переменную на 1 + преходим в режим ожидания единиц
if (j > 9) //так как подключено 10 светодиодов, обнуляем.
j = 0;
}
if(EncData1 == -1)
{
EncData1=0;
j-=1; //уменьшаем переменную на 1 + преходим в режим ожидания единиц
if (j < 0)
j = 9;
}
}
int main(void) //Основное тело программы
{
//настраиваем порты ввода-вывода
DDRA=0xFF; //установить PA как выходы
PORTA=0x01;//Первоначально устанавливаем на всех выходах 1
DDRD=0x00; //порт PD сконфигурировать как входы
PORTD=0x00;//Первоначально устанавливаем на всех выходах 0
//PORTD |= (1 << PD1)|(1 << PD0); // подключаем подтягивающие резисторы
//Инициализация внутреннего таймера и установка прерываний
timer_init();
while(1)//Бесконечный цикл
{
тут будем зажигать 1 из 10-ти светодиодов по кругу, переменная j подскажет какой зажечь
}



