Arduino只有有限数量的引脚,可能会发现你的引脚用完了。对于这种情况,移位寄存器来救援。它们仅使用几个Arduino引脚提供多个输入。

移位寄存器74HC165

74HC165是一个8位串行输入寄存器。它仅使用4个Arduino引脚,而它本身可以从8个数字引脚读入。如果并联负载引脚(PL)为低电平,则数据从A至H引脚并行读取。当PL为高电平时,Q引脚设置为第一位的值。每次将时钟引脚的值从低电平变为高电平时,下一位发送到Q引脚。因此,您可以按顺序读取所有8位。此外,您可以菊花链式连接多个移位寄存器,同时仍然只使用4个Arduino引脚!
数据表可在此处找到:SN74HC165

ShiftIn Library

为了简化移位寄存器的使用,我写了一个小型库来处理Arduino和移位寄存器之间的通信。它托管在Github上

 

#include <ShiftIn.h>
// Init ShiftIn instance with one chip.
// The number in brackets defines the number of daisy-chained 74HC165 chips
// So if you are using two chips, you would write: ShiftIn<2> shift;
ShiftIn<1> shift;

void setup() {
  Serial.begin(9600);
  // declare pins: pLoadPin, clockEnablePin, dataPin, clockPin
  shift.begin(8, 9, 11, 12);
}

void displayValues() {
  for(int i = 0; i < shift.getDataWidth(); i++)
    Serial.print( shift.state(i) ); // get state of button i
  Serial.println();
}

void loop() {
  if(shift.update()) // read in all values. returns true if any button has changed
    displayValues();
  delay(1);
}

 

容易,不是吗?

当然,您还需要使用一些按钮连接电路板:

现在您可以按下那些漂亮的按钮,您将通过串行监视器看到它们的状态。

更多移位寄存器

如果要将某些移位寄存器进行菊花链连接,则只需更改代码中的单个数字即可。您必须更改
ShiftIn<1> shift;

ShiftIn<2> shift;
第二个移位寄存器的连接方式与第一个相同。唯一的区别是Q引脚,而不是将其连接到数据引脚,将其连接到第一个寄存器的SER引脚。如果您计划添加更多寄存器,您将第三个Q引脚连接到第二个寄存器的SER引脚,第四个Q连接到第三个SER,所以……
两个寄存器的面包板布局现在看起来像这样:

谢谢阅读!

发表评论