我目前正在构建带有微控制器的鼓机。我试图弄清楚音序器的逻辑。我有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时始终点亮?