// Регистры портов
#define port9 PORTB
#define port10 PORTB
#define port11 PORTB
#define port6 PORTD
// Биты портов
#define bit9 1
#define bit10 2
#define bit11 3
#define bit6 6
// Время задержки между зажиганием каждой лампочки (в миллисекундах)
int delayTime = 500;
// Счетчик для отслеживания зажигаемой лампочки
int lampCounter = 0;
void setup() {
// Настройка пинов в качестве выходов
DDRB |= (1 << bit9) | (1 << bit10) | (1 << bit11);
DDRD |= (1 << bit6);
// Отключаем прерывания
noInterrupts();
// Сбрасываем регистры и устанавливаем счетчик таймера
TCCR1A = 0;
TCCR1B = 0;
// Устанавливаем предделитель на 256
TCCR1B |= (1 << CS12);
// Включаем прерывания по переполнению таймера
TIMSK1 |= (1 << TOIE1);
// Включаем прерывания
interrupts();
}
void loop() {
// В основном цикле ничего не делаем, управление лампочками происходит через прерывания
}
// Обработчик прерывания по переполнению таймера 1
ISR(TIMER1_OVF_vect) {
// Зажигаем соответствующую лампочку
if (lampCounter == 0) {
port9 |= (1 << bit9);
port10 &= ~(1 << bit10);
port11 &= ~(1 << bit11);
port6 &= ~(1 << bit6);
} else if (lampCounter == 1) {
port9 &= ~(1 << bit9);
port10 |= (1 << bit10);
port11 &= ~(1 << bit11);
port6 &= ~(1 << bit6);
} else if (lampCounter == 2) {
port9 &= ~(1 << bit9);
port10 &= ~(1 << bit10);
port11 |= (1 << bit11);
port6 &= ~(1 << bit6);
} else if (lampCounter == 3) {
port9 &= ~(1 << bit9);
port10 &= ~(1 << bit10);
port11 &= ~(1 << bit11);
port6 |= (1 << bit6);
}
// Увеличиваем счетчик лампочек
lampCounter++;
// Если все лампочки загорелись
if (lampCounter == 4) {
// Сбрасываем счетчик
lampCounter = 0;
}
}