玩转LED:从二进制计数器到点阵显示动画
立即解锁
发布时间: 2025-08-24 00:50:20 阅读量: 1 订阅数: 5 

### 玩转LED:从二进制计数器到点阵显示动画
#### 1. 二进制计数器与芯片级联
在电子电路中,当需要扩展输出引脚时,我们可以使用外部集成电路(IC),比如74HC595移位寄存器。以两个74HC595芯片级联为例,第二个595芯片的接线方式与第一个基本相同,时钟(Clock)和锁存(Latch)引脚连接到第一个595芯片的对应引脚。同时,将第一个芯片(IC 1)的第9引脚(数据输出引脚)连接到第二个芯片(IC 2)的第14引脚(数据输入引脚)。
数据从Arduino输入到第一个IC的第14引脚,然后通过IC 1的第9引脚将数据输出到IC 2的第14引脚,实现芯片的级联。当输入第9位及以上的数据时,IC 1中的数据会从其数据引脚移出,进入第二个IC的数据引脚。当Arduino通过数据线发送完所有16位数据后,最先发送的8位数据会从第一个芯片移出并进入第二个芯片,即第二个595芯片包含最先发送的8位数据,第一个595芯片包含第9到16位数据。这种方式几乎可以无限级联595芯片。
这里有一个小练习:使用项目18的相同电路和全部16个LED,重现《霹雳游侠》(Knight Rider)或赛昂(Cylon)的灯光效果,让LED在16个灯之间来回闪烁。
使用外部IC来扩展Arduino输出引脚有很多好处。虽然不使用外部IC也能完成这些项目,但移位寄存器让工作变得轻松许多。如果不使用移位寄存器,项目代码会变得更加复杂。专门设计用于接收串行数据并以并行方式输出的IC,非常适合以这种方式控制LED灯组。
在面对外部IC时,不要被吓倒。仔细、有条理地阅读数据手册,就能了解它们的工作原理。数据手册乍一看很复杂,但剔除无关数据后,就能明白芯片的工作方式。
#### 2. 二进制计数器相关概念总结
在这部分内容中,涉及到了多个重要的概念和技术:
- **二进制数系统**:了解二进制数与十进制数之间的相互转换方法。
- **移位寄存器的使用**:掌握如何使用移位寄存器输入串行数据并输出并行数据。
- **外部IC的作用**:明白使用外部IC可以降低项目的复杂度。
- **函数调用参数传递**:学会在函数调用时传递参数。
- **布尔类型变量**:掌握布尔类型变量的使用。
- **位运算符**:理解位运算符的概念和使用方法,例如使用位运算符创建位掩码。
- **芯片级联**:学会如何级联两个或更多的移位寄存器。
#### 3. LED点阵显示基础
前面我们主要处理的是单个5mm的LED,而现在要介绍一种新的LED封装形式——点阵显示屏。最常见的点阵显示屏是8×8的矩阵,总共包含64个LED。此外,还有双色点阵显示屏(如红色和绿色),甚至RGB点阵显示屏,后者可以显示任何颜色,单个显示封装中总共包含192个LED。
接下来要进行的项目是在标准的单色8×8点阵显示屏上显示图像和文本。首先从一个简单的示例开始,在8×8显示屏上创建动画图像,然后再进行更复杂的显示项目。在这个过程中,我们将学习到一个非常重要的概念——多路复用(multiplexing)。
#### 4. 项目19:LED点阵显示基础动画
##### 4.1 所需部件
要完成这个项目,需要以下部件:
- 2个74HC595移位寄存器IC
- 8个限流电阻
- 一个共阳极(C+)8×8点阵显示屏
- 显示屏的数据手册,用于了解引脚与行、列的连接关系
##### 4.2 电路连接
在连接电路时,要仔细查看电路图。在电路完成之前,切勿将Arduino连接到USB电缆或电源,否则可能会损坏移位寄存器或点阵显示屏。这是一个复杂的接线过程,要小心操作,确保连接缓慢且有条理。
不同的点阵显示屏可能具有不同的引脚排列,因此必须阅读所购买显示屏的数据手册,以确保移位寄存器的正确输出引脚连接到点阵显示屏的正确引脚。为了方便操作,下面的表格列出了移位寄存器的引脚与点阵显示屏的连接关系:
| 移位寄存器1 | 移位寄存器2 | 点阵显示屏 |
| --- | --- | --- |
| Pin 15 | | Row 1 |
| Pin 1 | | Row 2 |
| Pin 2 | | Row 3 |
| Pin 3 | | Row 4 |
| Pin 4 | | Row 5 |
| Pin 5 | | Row 6 |
| Pin 6 | | Row 7 |
| Pin 7 | | Row 8 |
| | Pin 15 | Column 1 |
| | Pin 1 | Column 2 |
| | Pin 2 | Column 3 |
| | Pin 3 | Column 4 |
| | Pin 4 | Column 5 |
| | Pin 5 | Column 6 |
| | Pin 6 | Column 7 |
| | Pin 7 | Column 8 |
通过参考这个表格和点阵显示屏的原理图,就能确定移位寄存器的引脚与LED显示屏引脚的具体连接方式。
##### 4.3 代码输入与库安装
在确认电路连接正确后,需要输入以下代码并上传到Arduino:
```cpp
// Project 19
#include <TimerOne.h>
int latchPin = 8; //Pin connected to Pin 12 of 74HC595 (Latch)
int clockPin = 12; //Pin connected to Pin 11 of 74HC595 (Clock)
int dataPin = 11; //Pin connected to Pin 14 of 74HC595 (Data)
byte led[8]; // 8 element unsigned integer array to store the sprite
void setup() {
pinMode(latchPin, OUTPUT); // set the 3 digital pins to outputs
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
led[0] = B11111111; // enter the binary representation of the image
led[1] = B10000001; // into the array
led[2] = B10111101;
led[3] = B10100101;
led[4] = B10100101;
led[5] = B10111101;
led[6] = B10000001;
led[7] = B11111111;
// set a timer of length 10000 microseconds (1/100th of a second)
Timer1.initialize(10000);
// attach the screenUpdate function to the interrupt timer
Timer1.attachInterrupt(screenUpdate);
}
void loop() {
for (int i=0; i<8; i++) {
led[i]= ~led[i]; // invert each row of the binary image
}
delay(500);
}
void screenUpdate() { // function to display image
byte row = B10000000; // row 1
for (byte k = 0; k < 9; k++) {
digitalWrite(latchPin, LOW); // open latch ready to receive data
shiftIt(~led[k] ); // shift out the LED array (inverted)
shiftIt(row ); // shift out row binary number
// Close the latch, sending the data in the registers out to the matrix
digitalWrite(latchPin, HIGH);
row = row << 1; // bitshift left
}
}
void shiftIt(byte dataOut) { // Shift out 8 bits LSB first, on rising edge of clock
boolean pinState;
digitalWrite(dataPin, LOW); //clear shift register read for sending data
for (int i=0; i<8; i++) { // for each bit in dataOut send o
```
0
0
复制全文
相关推荐








