如何点亮特定的LED并通过74HC595移位寄存器使其他LED移位?

时间:2019-04-18 08:42:00

标签: c microcontroller atmega shift-register

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

0 个答案:

没有答案