c - 如何点亮特定的 LED 并使用 74HC595 移位寄存器移动所有其他 LED?
问题描述
我目前正在构建带有微控制器的鼓机。我试图弄清楚音序器的逻辑。我有 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 始终亮起?
解决方案
推荐阅读
- javascript - 如何使用动态 ID 值获取 ElementByID?
- kedro - Kedro 部署到数据块
- apache - 在服务器上部署多个 Flask 应用程序
- java - 为什么要将 lambda 中的已检查异常包装在未检查异常中?
- r - R中的正则表达式strsplit表达式,所以它只适用于每个字符串中特定字符的第一次出现?
- google-apps-script - 谷歌脚本循环只执行一次
- visual-studio - 如何在 Visual Studio 中获得集成控制台?(如 CLion/IntelliJ)
- angular - 对导入的 scss 文件的更改不会触发重建
- sql-server - SQL Server Integration Services - 以编程方式选择要导入的文件
- powerbi - PowerBI 中的滚动平均值不包括当前月份