Arduino 第十四章:led点阵
Arduino 第十三章:LED 点阵
一、LED 点阵概述
LED 点阵是由多个发光二极管(LED)按照矩阵形式排列组成的显示设备,常见的有 8x8、16x16 等规格。它可以用来显示字符、数字、简单图形以及动画等信息,在信息展示、广告屏、电子时钟等领域应用广泛。通过控制每个 LED 的亮灭状态,就能组合出各种不同的显示效果。
二、工作原理
(一)结构组成
LED 点阵通常由行线和列线组成,每个 LED 位于行线和列线的交叉点上。当对应的行线和列线加上合适的电压时,该交叉点的 LED 就会点亮。例如,在一个 8x8 的 LED 点阵中,有 8 条行线和 8 条列线,总共 64 个 LED。
(二)驱动方式
LED 点阵的驱动方式主要有静态驱动和动态扫描驱动两种。
- 静态驱动:给每个 LED 提供独立的驱动电路,使其持续发光。这种方式的优点是显示稳定、亮度高,但需要大量的驱动电路,成本较高,适用于小规模的点阵显示。
- 动态扫描驱动:逐行或逐列地依次点亮 LED,利用人眼的视觉暂留效应,让人感觉整个点阵都在同时发光。这种方式可以减少驱动电路的数量,降低成本,是最常用的驱动方式。
三、硬件连接
(一)所需材料
- Arduino 开发板(如 Arduino Uno)
- 8x8 LED 点阵模块
- 杜邦线若干
(二)引脚说明
8x8 LED 点阵模块一般有 16 个引脚,8 个行引脚和 8 个列引脚。不同模块的引脚排列可能不同,需要参考模块的说明书来确定。
(三)连接方式
以动态扫描驱动为例,将 8 个行引脚分别连接到 Arduino 的 8 个数字引脚(如引脚 2 - 9),8 个列引脚分别连接到 Arduino 的另外 8 个数字引脚(如引脚 10 - 17)。
(四)连接图
+5V (Arduino)
|
|
[VCC] (LED Matrix)
[Row 1] ---- Digital Pin 2 (Arduino)
[Row 2] ---- Digital Pin 3 (Arduino)
[Row 3] ---- Digital Pin 4 (Arduino)
[Row 4] ---- Digital Pin 5 (Arduino)
[Row 5] ---- Digital Pin 6 (Arduino)
[Row 6] ---- Digital Pin 7 (Arduino)
[Row 7] ---- Digital Pin 8 (Arduino)
[Row 8] ---- Digital Pin 9 (Arduino)
[Col 1] ---- Digital Pin 10 (Arduino)
[Col 2] ---- Digital Pin 11 (Arduino)
[Col 3] ---- Digital Pin 12 (Arduino)
[Col 4] ---- Digital Pin 13 (Arduino)
[Col 5] ---- Digital Pin A0 (Arduino)
[Col 6] ---- Digital Pin A1 (Arduino)
[Col 7] ---- Digital Pin A2 (Arduino)
[Col 8] ---- Digital Pin A3 (Arduino)
[GND] ---- GND (Arduino)
四、代码实现
(一)显示静态字符示例
// 定义行引脚
const int rowPins[8] = {2, 3, 4, 5, 6, 7, 8, 9};
// 定义列引脚
const int colPins[8] = {10, 11, 12, 13, A0, A1, A2, A3};
// 字符 'A' 的点阵数据
byte letterA[8] = {
B00111100,
B01000010,
B01000010,
B01111110,
B01000010,
B01000010,
B01000010,
B00000000
};
void setup() {
// 设置行引脚为输出模式
for (int i = 0; i < 8; i++) {
pinMode(rowPins[i], OUTPUT);
}
// 设置列引脚为输出模式
for (int i = 0; i < 8; i++) {
pinMode(colPins[i], OUTPUT);
}
}
void loop() {
// 逐列扫描显示字符
for (int col = 0; col < 8; col++) {
// 选通当前列
digitalWrite(colPins[col], LOW);
for (int row = 0; row < 8; row++) {
// 根据点阵数据设置行引脚状态
if (bitRead(letterA[row], col)) {
digitalWrite(rowPins[row], HIGH);
} else {
digitalWrite(rowPins[row], LOW);
}
}
// 短暂延时
delay(1);
// 关闭当前列
digitalWrite(colPins[col], HIGH);
}
}
(二)代码解释
- 引脚定义:
const int rowPins[8] = {2, 3, 4, 5, 6, 7, 8, 9};
:定义 8 个行引脚连接到 Arduino 的数字引脚 2 - 9。const int colPins[8] = {10, 11, 12, 13, A0, A1, A2, A3};
:定义 8 个列引脚连接到 Arduino 的数字引脚 10 - 13 和模拟引脚 A0 - A3。
- 点阵数据:
byte letterA[8]
:定义字符 ‘A’ 的点阵数据,每个字节代表一行的 LED 状态,1 表示点亮,0 表示熄灭。
setup()
函数:- 通过
pinMode()
函数将行引脚和列引脚都设置为输出模式。
- 通过
loop()
函数:- 使用
for
循环逐列扫描显示字符。 digitalWrite(colPins[col], LOW);
:选通当前列。- 通过
bitRead()
函数读取点阵数据中对应位的值,根据该值设置行引脚的状态。 delay(1);
:短暂延时,利用视觉暂留效应。digitalWrite(colPins[col], HIGH);
:关闭当前列。
- 使用
五、注意事项
- 电源供应:LED 点阵在点亮多个 LED 时需要较大的电流,要确保 Arduino 能够提供足够的电源,必要时可以使用外部电源。
- 扫描速度:动态扫描驱动时,扫描速度要合适。速度过快可能导致显示亮度不足,速度过慢则会出现闪烁现象。
- 引脚电平:不同的 LED 点阵模块可能对行引脚和列引脚的电平要求不同,需要根据实际情况调整代码中的高低电平设置。
六、应用拓展
- 滚动显示:通过不断更新显示的点阵数据,可以实现字符或图形的滚动显示效果。
- 动画展示:将多个不同的点阵数据按顺序显示,就能实现简单的动画效果。
- 与传感器结合:结合传感器(如温度传感器、光线传感器等),根据传感器的数据动态改变 LED 点阵的显示内容。