电子说
第1步:组件
-Arduino UNO (x1)
-74HC595移位寄存器( x2)
-LEDs (x16)
-220omh电阻器(x16)
-多根导线
-两个面包(一个带有400针,另一个带有830)
-电位器,用于控制亮度(可选)
第2步:电路
进行电路(见上文)并按如下方式连接第一个移位寄存器:
-GND(引脚8)接地
-Vcc(引脚16)到5V
-OE(引脚13)接地
- MR(引脚10)至5V
-DS(引脚14)至Arduino引脚11
-SH_CP(引脚11)至Arduino引脚12
-ST_CP (引脚12)到Arduino引脚8
连接第二个移位寄存器完全相同,但是将DS(引脚14)连接到第一个寄存器引脚9。之后,将引脚:从两个寄存器连接到LED的1、2、3、4、5、6、7和15。这种连接使所有引脚始终处于活动状态且可寻址,但是当Arduino通电时,某些LED可能会打开。解决方案是将MR(引脚10)和OE(引脚13)直接连接到Arduino,但是这样一来,您必须牺牲2个Aurduino引脚。
要添加更多的移位寄存器,就像第二个一样寄存器。始终将MR和OE引脚直接连接到Arduino,将DS引脚直接连接到先前的寄存器。
如果要调节LED的亮度,请按照上图所示连接电位计以控制所有LED的电阻。
第3步:代码
现有代码旨在用于有限数量的移位寄存器和没有通用的功能/方法可以做到这一点。作为软件开发人员,这对我来说是不可接受的,并且我习惯于使所有内容尽可能地动态,没有限制。我重新设计了现有代码示例,以允许您使用无限数量的移位寄存器。参见下面的代码:
int numOfRegisters = 2;
byte * registerState;
void setup(){
//初始化数组
registerState =新字节[numOfRegisters];
for(size_t i = 0; i
registerState [i] = 0;
}
//。.. setup
}
void regWrite(int pin,bool state){
//确定寄存器int reg = pin/8;
//确定实际寄存器的
int actualPin = pin-(8 * reg);
//开始会话
digitalWrite(latchPin,LOW);
for(int i = 0; i
//获取寄存器的实际状态
字节*状态=®isterState[i];
//更新状态
if(i == reg){
bitWrite(* states,ActualPin,state);
}
//写入
shiftem(dataPin,clockPin,MSBFIRST,* sta TES);
}
//结束会话
digitalWrite(latchPin ,HIGH);
}
第4步:最终代码
我将完整的源代码发布在github上,因为这里不可读:
https://github.com/jr2002008/Arduino-74HC595-shift-registers/blob/master/ArduinoLEDsWithShiftRegisters/ArduinoLEDsWithShiftRegisters.ino
在最终代码中,我为这16个LED添加了几种效果。上面的视频演示了这些效果。如果要添加更多的LED,请按照前面所述连接更多的寄存器,并在代码中更改 numOfRegisters 的值(还可以调整效果的逻辑)。
您也可以使用此代码不仅仅用于LED,如果您只是想为Arduino使用更多引脚,请使用 regWrite(int引脚,布尔状态)函数为任何引脚写入状态,并且没有限制多少移位寄存器您正在使用,只需更改 numOfRegisters 的值,其他所有操作都会自动执行。
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !