用移位寄存器来扩展 8位移位寄存器( 四 )


和它的表亲shiftOut函数一样,shiftIn函数也提供时钟信号来同步数据传输 。
Arduino & 74HC165连接74HC165的输入需要拉低以防止错误读数 , 因此除了八个按钮开关之外 , 我们还需要八个下拉电阻 。我用的是10k的电阻,但是4.7k到27k的任何值都可以正常工作 。
同样,我使用了一个100uf的去耦电容 , 以确保连接时注意极性 。
一旦你把它们连接在一起,我们就可以专注于我们将用来完成这项工作的代码 。
Arduino & 74HC165代码我们的代码非常简单,因为它所做的只是读取按钮的状态,并在串行监视器上显示结果 。但要知道如何从buttons和74HC165获取数据,你只需要做这些 。
/* 74hc 165 shift registerdemation174 HC 165-demo . inoreadfrom 8 switchesanddisplayvaluesonserialmonitordronebotworkshop 2020 https://dronebotworkshop . com *///define connections to 74hc 165//plpin 1 int load = 7;//cepin 15 intclockenablepin = 4;//q 7 pin 7 int data in = 5;//CP pin 2 intclokin = 6;void setup(){//setupserialmonitorserial . begin(9600);//setup 74 HC 165 connectionspinmode(load,OUTPUT);pinMode(clockEnablePin , 输出);pinMode(时钟,输出);pinMode(数据输入 , 输入);} void loop(){//WritepulsetoloadpindigitalWrite(load,LOW);delay微秒(5);digitalWrite(高负载);delay微秒(5);//getdata from 74 HC 165 digital write(clock in,高电平);digitalWrite(clockEnablePin,低电平);byteincoming=shiftIn(dataIn,clockIn , LSB first);digitalWrite(clockEnablePin,高电平);//printtoserialmonitorserial . print(" pin States:\ r \ n ");Serial.println(传入,BIN);延迟(200);}该代码与我们之前的所有代码一样,定义了IC的四个连接 。
在设置中,我们初始化串行监视器,然后根据需要设置连接 。
在循环中 , 我们首先向load引脚写入一个脉冲,使其将并行输入的数据加载到缓冲器中进行处理 。
接下来,我们设置74HC165发送数据,然后使用shiftIn函数获取数据,首先是LSB(最低有效位) 。我们通过拉高时钟引脚来实现,这意味着我们完成了 。
最后,我们将结果打印到串行监视器上 。
加载代码,打开串行监视器并观察输出 。你会马上注意到一些事情 。
所有数据输出保持高电平,与电路板上的布线相反 。按下按钮将使其读数变低 , 即使这与实际发生的情况相反 。
这是因为我们使用74HC165的反相输出 。我们的数据正好相反 。
我将在后面的代码中向您展示如何以正确的方式将其恢复 。继续读!
我们刚才用的例子有很多实际应用,其中一个很明显是作为小键盘(虽然有更好的方法来制作大键盘) 。对于需要大量开关的项目,这是一种有用的设计技术 。
该电路的一个重要应用是配合DIP开关或跳线使用,这些开关或跳线只是偶尔设置 。您可以使用74NC165来减少读取8位DIP开关所需的连接数量,只需在设置程序中读取它,以便它只能在设备通电或复位时读取 。
74HC595和74HC165一起使用 。当然,如果不采取额外的步骤将所有这些led和开关连接在一起,那将是一种浪费!所以我们开始吧 。
74HC595和74HC165已连接如果你像我一样在自己的无焊面包板上构建每个演示,那么将它们连接在一起非常简单 。
在其中一次演示中,Arduino与其面包板断开了连接,无论是哪一个都没有关系 。将连接留在面包板上,以便您可以将它们重新连接到另一个Arduino 。您可以将5v和接地连接连接到其他试验板电源轨 。
完成后,尝试在Arduino上运行前面的代码,一切应该仍然正常 。如果有什么东西坏了,请检查一下你的线路 。当你加入项目的时候 , 可能有什么东西被断开了——这里有很多电线!
测试完一切 , 就可以检查代码同时使用74HC165和74HC595了 。
74HC595和74HC165代码1因为我们的演示本质上是两个演示的融合,所以我们的代码完全相同 。你会发现这段代码和之前的代码有很多相似之处,这不是偶然的——有些是字面上的剪切和粘贴!
该代码的目的是简单地使用LED来显示按钮的状态 。作为示范,效果不错 。我保证在这之后我们会继续做一些更令人兴奋的事情!
/* 74hc 595 & 74hc 165 shift registerdemaration74hc 595-to-74ch 365 . inoinputfor8 buttonsusing 74hc 165 outputto 0 LEDs using 74hc 595 dronebotworkshop 2020 https://dronebotworkshop . com *///defineconnectionsto 74hc 165//plpin 1 int load = 7;//cepin 15 intclockenablepin = 4;//q 7 pin 7 int data in = 5;//CP pin 2 intclokin = 6;//defineconnectionsto 74hc 595//ST _ CP pin 12 constintlatchpin = 10;//SH _ CP pin 11 constintclockpin = 11;//ds pin 14 constintdatapin = 12;void setup(){//setupserialmonitorserial . begin(9600);//74HC165pinspinMode(load,OUTPUT);pinMode(clockEnablePin , 输出);pinMode(时钟,输出);pinMode(数据输入,输入);//74HC595pinspinMode(latchPin , 输出);pinMode(clockPin,输出);pinMode(数据引脚,输出);} void loop(){//read switches//WritepulsetoloadpindigitalWrite(load , LOW);delay微秒(5);digitalWrite(高负载);delay微秒(5);//getdata from 74 HC 165 digital write(clock in,高电平);digitalWrite(clockEnablePin , 低电平);byteincoming=shiftIn(dataIn,clockIn , LSB first);digitalWrite(clockEnablePin,高电平);//printtoserialmonitorserial . print(" pin States:\ r \ n ");Serial.println(传入,BIN);//WritetoLEDs//ST _ cplowtokeepledsfromchangingwhilereindingserialdata digital write(latch pin,LOW);//shiftouthebitshiftout(data pin,clockPin,LSBFIRST,~ incoming);//ST _ CPHIGHchangeLEDsdigitalWrite(latch pin,高);延迟(500);}我们再次定义两个集成电路的引脚连接 。在设置中,我们初始化串行监视器,并根据需要设置连接 。

推荐阅读