2

我目前正在构建带有微控制器的鼓机。我试图弄清楚音序器的逻辑。我有 16 个 LED,它们将指示鼓机当前正在播放的第 16 个音符。

因此,例如,假设每分钟节拍 (BPM) 为 120,那么 LED 应该每秒移动两次。

因此,对于移位部分,我编写了代码,如果步数为 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);
   }
 }           

但我也希望 LED 在用户编程声音的每一步都静态亮起。因此,例如,如果用户使用乐器底鼓按下按钮 1 和 5 以及 9 和 13,则 LED 1、5、9、13 应该静态亮起,但 LED 也应该像上面的代码一样移动。有没有人有关于如何有效地实现这一点的任何提示?移动其他 LED 时,是否有一种聪明的方法可以使特定 LED 始终亮起?

4

0 回答 0