#c #microcontroller #atmega #shift-register
#c #микроконтроллер #atmega #сдвиговый регистр
Вопрос:
В настоящее время я нахожусь в процессе создания драм-машины с микроконтроллером. Я пытаюсь разобраться в логике секвенсора. У меня есть 16 светодиодов, которые будут указывать, на какой 16-й ноте играет драм-машина в данный момент.
Так, например, допустим, что частота ударов в минуту (BPM) равна 120, тогда светодиод должен смещаться дважды каждую секунду.
Итак, для части сдвига я написал такой код, что если номер шага равен 0, мы сдвигаемся на 1. Если номер шага> 0, мы сдвигаемся на 0. Метод вызывается каждые (60 ударов в минуту) секунды.
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 amp;= ~(1 << PD5);
PORTD amp;= ~(1 << PD4);
PORTD |= (1 << PD3); //Shift to next led
_delay_ms(40); //Apparently I need a delay here to light up LED
PORTD amp;= ~(1 << PD3);
}else{
PORTD |= (1 << PD4);
PORTD amp;= ~(1 << PD4);
PORTD |= (1 << PD3);
_delay_ms(40);
PORTD amp;= ~(1 << PD3);
}
}
Но я также хочу, чтобы светодиоды статически загорались для каждого шага, на котором пользователь запрограммировал звук. Так, например, если пользователь нажимает кнопки 1, 5, 9 и 13 с помощью ударного барабана инструмента, светодиод 1,5,9,13 должен гореть статически, но светодиоды также должны сдвигаться, как в приведенном выше коде. У кого-нибудь есть какие-либо советы о том, как эффективно это реализовать? Есть ли разумный способ заставить определенный светодиод всегда загораться при переключении других светодиодов?
Комментарии:
1. Я бы просто сохранил желаемое состояние всех светодиодов в переменной. Каждый раз, когда он меняется, сдвигайте необходимые биты по всем светодиодам, чтобы обновить их до последнего состояния.
2. Как мне правильно объявить такую переменную? Допустим, у меня step_number в настоящее время находится на шаге 8, а выбранные шаги — на 1, 5, 9, 12. Я хочу иметь один массив «current_step» с 1, установленным в 8-м индексе. Один массив «selected_steps» с 1, установленным с индексом 1,5,9,12. Затем я хочу иметь массив «final_led», который имеет значение final_led = XOR(current_step, selected_steps). Я не очень разбираюсь в C, поэтому у меня проблемы с правильным определением этих массивов.
3. Вы на правильном пути! Но «как объявлять массивы» — это материал для другого вопроса. На этот вопрос, вероятно, отвечали много раз, так что просто поищите немного 🙂
4. Да, я понимаю, спасибо, что нашли время ответить мне! Мой второй вопрос не должен быть сложным для выяснения, ха-ха.