Как зажечь определенные светодиоды, а также сдвинуть все остальные светодиоды с помощью регистра сдвига 74HC595? - PullRequest
2 голосов
/ 18 апреля 2019

В настоящее время я занимаюсь сборкой драм-машины с микроконтроллером.Я пытаюсь понять логику секвенсора.У меня есть 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 должен гореть постоянно, но светодиоды также должны смещаться, как в коде выше.У кого-нибудь есть какие-нибудь советы, как эффективно это реализовать?Есть ли умный способ сделать так, чтобы определенный светодиод всегда горел при переключении других светодиодов?

...