项目地址:https://www.tinkercad.com/things/5nsSWyQOAkI-chenillard
// Arduino Pattern Creator by PhilCam // http://my.free.time.free.fr/ // Use with Uno R3 + 74HC595 + 8 leds int dataPin = 2; int latchPin = 3; int clockPin = 4; int seq[] = {128, 192, 224, 240, 248, 252, 254, 255, 127, 63, 31, 15, 7, 3, 1, 0, 1, 3, 7, 15, 31, 63, 127, 255, 254, 252, 248, 240, 224, 192, 128, 0}; void setup() { pinMode(dataPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { for (int n = 0; n < 32; n++) { digitalWrite(latchPin, LOW); //Pull latch LOW to start sending data shiftOut(dataPin, clockPin, MSBFIRST, seq[n]); //Send the data digitalWrite(latchPin, HIGH); //Pull latch HIGH to stop sending data delay(100); } }
如果需要做8个LED灯或者16个LED灯的跑马灯效果时,数字引脚(Digital Pin)明显会不够用;这时我们可以使用寄存器来实现数字引脚的扩充,这里使用了74HC595这个型号的位移缓存器进行实验。
先看下74HC595的引脚说明,共16个引脚,8个输出引脚对应可以控制8个LED,详情参考下图:
- Q0 - Q7(第15脚,第1-7脚):8位并行数据输出
- GND(第8引脚):地
- Q7’(第9引脚):串行数据输出
- MR(第10引脚):主复位(低电平)
- SHCP(第11引脚):数据输入时钟线
- STCP(第12引脚):输出存储器锁存时钟线
- OE(第13引脚):输出有效(低电平)
- DS(第14引脚):串行数据输入
- VCC(第16引脚):电源
74HC595寄存器可以简单的理解为是一组8个的开关组,如上图(8个开关控制LED),这组开关的开关用0和1来控制,0为关,1为开。要让这组灯从左到右像跑马灯那样逐个亮,可以简单列出来这组开关:
- 1 0 0 0 0 0 0 0 第一个亮,其他关
- 0 1 0 0 0 0 0 0 第二个亮,其他关
- 0 0 1 0 0 0 0 0 第三个亮,其他关
- 0 0 0 1 0 0 0 0 第四个亮,其他关
- 0 0 0 0 1 0 0 0 第五个亮,其他关
- 0 0 0 0 0 1 0 0 第六个亮,其他关
- 0 0 0 0 0 0 1 0 第七个亮,其他关
- 0 0 0 0 0 0 0 1 第八个亮,其他关
按顺序循环上面这组开关就是一个跑马灯。要让寄存器出现这样的开关组,只需要把这组开关转换成十进制(这八组开关对应的十进制数字为: 128, 64, 32, 16, 8, 4, 2, 1 ),然后往寄存器写即可;
TIPS:
- 一个74HC595寄存器最大只能处理256(2^8)以内的数字,需要处理更大的数字(更多灯)则加多一个/多个寄存器即可
- 数字引脚可以输入输出,扩展输入引脚需要的寄存器跟扩张输出引脚的寄存器是不同的
- 加多一个74HC595寄存器接线:
- 新加寄存器的DS接上一个寄存器的Q7’
- 新加寄存器的SHCP接上一个寄存器的SHCP
- 新加寄存器的STCP接上一个寄存器的STCP
引用一个图,可以直观对寄存器的理解。