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


首先循环我们之前用来从74HC165读取按钮值的相同例程 。同样,我们将数据插入一个名为“输入”的8位字节,并在串行监视器上显示其值 。
接下来 , 我们使用之前使用的相同代码将数据写入74HC595 。但是我们改变了发送到移位寄存器的数据 。
请记住,我们来自交换机的数据是相反的 。如果我们把它发送到74HC595,它会工作 , 但除非我们按下按钮,否则led将全部亮起 。
为了反转数据,当我们在shiftOut函数中使用它时,我们在“incoming”变量前面使用“~”符号 。波浪号(tilde)符号反转二进制数据 , 将每个零变为一,反之亦然 。这正是我们需要做的 。
您还会注意到,与早期的74HC595代码不同的一点是,我们首先发送数据LSB 。这与我们从按钮接收它的方式相匹配 。第一,发送MSB可以 , 但是LED显示会反 。
装上试试吧 。
很有趣,不是吗?
好吧,它确实不是,但它确实展示了如何获得并行数据(开关输入),使用移位寄存器将其转换为串行,发送到Arduino , 发送回第二个移位寄存器并进行转换 。它再次回到平行状态(LED输出) 。这有点令人兴奋 。
如果你不是很激动 , 请不要着急 。现在我们有8个开关和8个led,我们可以做其他事情 。
74HC595和74HC165代码2–激动人心!为了给我们的演示添加一些素材,让我们使用八个开关来选择LED灯的闪烁模式 。因为我们有八个开关,所以我们可以选择八种模式 。
这是我们如何做的代码:
/* 74hc 595 & 74hc 165 shift registerdemaration274 HC 595-to-74ch 365-pattern . inoinputfrom 8 button using 74hc 165 output to 8 led using 74hc 595 selectledpatternusingpustut ondronebotworkshop 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;//definedataarrayintdataarray[8];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);//SetuparrayforLEDpatternswitch(incoming){ caseb 11111110:data rray[0]= b 11111111;data rray[1]= b 01111110;data rray[2]= b 10111101;data rray[3]= b 11011011;data rray[4]= b 11100111;data rray[5]= b 11011011;data rray[6]= b 10111101;data rray[7]= b 01111110;打破;case b 1111101:data array[0]= b 00000001;data rray[1]= b 00000010;data rray[2]= b 00000100;data rray[3]= b 00001000;data rray[4]= b 00010000;data rray[5]= b 00100000;data rray[6]= b 01000000;data rray[7]= b 10000000;打破;case b 1111011:data array[0]= b 10000001;data rray[1]= b 01000010;data rray[2]= b 00100100;data rray[3]= b 00011000;data rray[4]= b 00000000;data rray[5]= b 00100100;data rray[6]= b 01000010;data rray[7]= b 10000001;打破;case b 11110111:data rray[0]= b 10101010;data rray[1]= b 01010101;data rray[2]= b 10101010;data rray[3]= b 01010101;data rray[4]= b 10101010;data rray[5]= b 01010101;data rray[6]= b 10101010;data rray[7]= b 01010101;打破;case b 11101111:data rray[0]= b 10000000;data rray[1]= b 00000001;data rray[2]= b 01000000;data rray[3]= b 00000010;data rray[4]= b 00100000;data rray[5]= b 00000100;data rray[6]= b 00010000;data rray[7]= b 00001000;打破;case b 11011111:data rray[0]= b 11000000;data rray[1]= b 01100000;data rray[2]= b 00110000;data rray[3]= b 00011000;data rray[4]= b 00001100;data rray[5]= b 00000110;data rray[6]= b 00000011;data rray[7]= b 10000001;打破;case b 10111111:data rray[0]= b 11100000;data rray[1]= b 01110000;data rray[2]= b 00111000;data rray[3]= b 00011100;data rray[4]= b 00001110;data rray[5]= b 00000111;data rray[6]= b 10000011;data rray[7]= b 11000001;打破;case b 0111111:data rray[0]= b 10001000;data rray[1]= b 01000100;data rray[2]= b 00100010;data rray[3]= b 00010001;data rray[4]= b 10001000;data rray[5]= b 01000100;data rray[6]= b 00100010;data rray[7]= b 00010001;打破;默认:break}//WritetoLEDs//count from 0 to 7 for(int num = 0;Num , 如你所见,我再次借用了之前所有演示的编码 。事实上,这段代码中只有一处不同,那就是允许您选择LED模式的switch-case语句 。

推荐阅读