Как включить определенные светодиоды, а также сдвинуть все остальные светодиоды с помощью сдвигового регистра 74HC595?

#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. Да, я понимаю, спасибо, что нашли время ответить мне! Мой второй вопрос не должен быть сложным для выяснения, ха-ха.