В настоящее время я занимаюсь сборкой драм-машины с микроконтроллером.Я пытаюсь понять логику секвенсора.У меня есть 16 светодиодов, которые будут указывать, на какой 16-й ноте сейчас играет драм-машина.
Так, например, скажем, число ударов в минуту (BPM) равно 120, тогда светодиод должен смещаться дважды в секунду.
Так что для сдвигающей части я написал код такой, что еслиномер шага равен 0, мы сдвигаемся на 1. Если номер шага> 0, мы сдвигаемся на 0. Метод вызывается каждые (60 / BPM) секунд.
PD5 - это последовательный вход, PD4это защелка, PD3 - это тактовый вывод.
void update_led(void) {
if (step_number == 0){
PORTD |= (1 << PD5); //Send a 1
PORTD |= (1 << PD4); //Read the input to 1st led
PORTD &= ~(1 << PD5);
PORTD &= ~(1 << PD4);
PORTD |= (1 << PD3); //Shift to next led
_delay_ms(40); //Apparently I need a delay here to light up LED
PORTD &= ~(1 << PD3);
}else{
PORTD |= (1 << PD4);
PORTD &= ~(1 << PD4);
PORTD |= (1 << PD3);
_delay_ms(40);
PORTD &= ~(1 << PD3);
}
}
Но я также хочу, чтобы светодиоды горели постоянно на каждом этапе, когда пользователь запрограммировал звук.Так, например, если пользователь нажимает кнопки 1 и 5 и 9 и 13 с ударным барабаном инструмента, светодиод 1,5,9,13 должен гореть постоянно, но светодиоды также должны смещаться, как в коде выше.У кого-нибудь есть какие-нибудь советы, как эффективно это реализовать?Есть ли умный способ сделать так, чтобы определенный светодиод всегда горел при переключении других светодиодов?