例如,如果您有一个带有4个数字IO引脚的Arduino,您如何独立点亮> 4个LED或读取> 4个按钮的状态?
例如,如果您有一个带有4个数字IO引脚的Arduino,您如何独立点亮> 4个LED或读取> 4个按钮的状态?
Answers:
诸如74595之类的移位寄存器将使您仅通过2个连接即可获得许多输出:数据引脚和时钟引脚。将数据引脚设置为要移入寄存器的下一个值,然后向时钟引脚发送脉冲。
布鲁诺给出了一个很好的答案,但是我想做一些说明。
臭名昭著70毫安
的74HC595经常被用作I / O扩展,并且如通常用于控制一系列LED。通常被忽视的是,您可能会以这种方式超出规范地进行操作。数据表中说,总电源电流不应超过70 mA(绝对最大额定值(AMR)),因此,最好在一定程度上远离该值。因此,10 mA时8个LED太多了,而在20 mA时,您将比AMR高出不少于130%!该限制可能是由于键合线的电流容量所致,然后太大的电流可能不仅会使零件的性能下降,而且如果该线会折断,则会永久性地使其失效。
但是昨晚我醒来是因为我有一个主意。Icc和接地电流都限制为70 mA,那么为什么不将总电流或80 mA分开,让Icc占一半,而接地电流占另一半?您所要做的就是将LED的4个接地(高电平有效),将另外4个Vcc(低电平有效)接地。然后,前者的电流来自Icc,其他人的电流接地。这样就可以使用15 mA LED。(它是如此简单,以至于我觉得自己真是个白痴,没想到早一点。)
我以为组合时钟
Bruno通过将移位寄存器的时钟与锁存器的时钟相结合节省了一个额外的I / O引脚。似乎我误解了他的答案。我仍然想扩展此选项。
移位寄存器的内容通过;移位寄存器的先前内容被传输到存储寄存器和并行输出级
(由我突出显示)
因此锁住的不是新数据,而是前一个数据。这不是一个真正的问题,只需确保移入一个额外的虚拟位来锁存最后一个数据,否则所有引脚都会出错。
合并时钟还意味着在移入新数据时,输出将始终切换。锁存器的功能实际上是为了避免这种情况。在许多情况下,如果可以快速完成,这将不是问题,但在最坏的情况下,您可能会得到不希望的效果。最坏的情况是使用74HC595以非常高的扫描频率多路复用显示+移位寄存器链非常长+除1之外全为1,一个LED熄灭+一个暗室。由于该LED经常在黑暗的房间中看到所有1的通过,因此它可能会非常微弱地点亮。
或者,如果您将高频多路复用与继电器控制输出相结合。全零,然后为1的继电器,可能意味着继电器的输出不够长,无法拉入。
诚然,这些都是极端情况,但是如果您要多路复用,否则我会尽可能将串行时钟和锁存时钟分开,否则更新速度会很高。
我同意Ignacio关于使用74XX595,串行并行输出移位寄存器进行输出扩展的观点,但实际上您将需要3个连接,一个用于数据,一个用于时钟,以及一个锁存器使能,以从内部移位寄存器传输数据到输出锁存器。
为了扩展输入,可以使用74XX165并行输入串行移位寄存器,每个74XX165最多可以有8个按钮。
这种方法的好处是,您可以菊花链式连接多个移位寄存器,从而增加输入或输出的数量,更好的是,您可以混合使用74XX595和74XX165,并允许任意数量的输入或输出。
除此之外,您还可以共享时钟和锁存信号,从而减少了所需的连接数量并大大简化了软件。这样,对于任何数量的该移位寄存器,您仅需要4个连接:
在搜索图表时,我在该网站上发现了一种非常巧妙的方法,可以将所需的连接数减少到3个。它包括使用相同的引脚进行数据输入和输出。
该软件将为每个时钟脉冲执行以下操作:
尼克提到了I / O扩展器,它们绝对值得研究。Digikey列出了上千种,我将以I2C接口为例,因为这需要最少的I / O引脚。最少两个。
恩智浦PCA9505具有40个可配置的I / O引脚,相当于五个74HC595s。这是一个稍微昂贵的解决方案,但是您可以得到更多的功能:
进一步阅读
GPIO扩展器,NXP手册
PCA9505数据表
对于没有额外IC的解决方案,可以使用诸如Multiplexing和Charliplexing之类的技术:
多路复用(未显示限流电阻):
多路复用的工作方式非常简单-在上面的示例中,如果要点亮LED1,我们将引脚C1设置为输出高电平,将引脚R1设置为输出低电平,所有其他引脚可以为高电平或Hi-Z(设置为输入,高电平)阻抗,使它们看起来“断开”)
如果我们想点亮LED5,我们将引脚C2设置为输出高电平,将R2设置为输出低电平。
驱动n个LED所需的引脚数可以通过2n个引脚来计算,因此,例如对于16个LED,我们需要(√16)* 2 = 8个引脚。
Charlieplexing:
替代(更简洁)的原理图布局(由Supercat建议):
这有点复杂,但是使用较少的引脚来驱动更多数量的LED。例如,如上例所示,我们仅可以使用5个引脚来驱动20个LED(相比之下,至少10个具有“正常”矩阵多路复用功能的引脚(不要与使用IC混淆,在这种情况下,所需的引脚数为log2) (nLED)。
对于外部解决方案,您可以使用诸如移位寄存器或多路复用器之类的东西, 例如74HC595和74HC151。
移位寄存器采用时钟控制的串行数据输入流,并并行输出(Serial In Parallel Out SIPO)或以其他方式
输出(PISO)。它们通常有8个输出(或输入),但您可以随意链接任意数量以扩展的东西。缺点是可以更新的速度除以每个输入的输出数量(例如,对于8个输出的一个寄存器,如果您具有8MHz的输入时钟,则可以以1MHz更新,对于16个输出为500kHz,等等)
这些技术也可以反向进行输入。