在生活中,点阵屏是一种常用的显示设备,它能够以矩阵形式展示信息,如数字、字母或简单的图形。通过控制点阵屏上的每一个点(LED)的亮灭,我们可以创造出各种视觉效果。今天,我们将通过一个Arduino项目来学习如何控制一个8x8的点阵屏,包括如何初始化硬件、编写代码来点亮所有LED、以及实现扫描显示技术。
元件清单
硬件连接图 1 点亮点阵连线图 示例代码
- //项目 - 点亮点阵
-
- const int rowPins[8] = {6, 11, 5, 9, A0, 4, A1, 2}; // 点阵屏行引脚(负极)
-
- const int colPins[8] = {10, A2, A3, 7, 3, 8, 12, 13}; // 点阵屏列引脚(正极)
-
-
-
- void setup() {
-
- for (int i = 0; i < 8; i++) {
-
- pinMode(colPins[i], OUTPUT);
-
- pinMode(rowPins[i], OUTPUT);
-
- digitalWrite(rowPins[i], HIGH); // 初始化行引脚为高电平(关闭)
-
- }
-
- }
-
-
-
- void turnOnAllLeds() {
-
- for (int i = 0; i < 8; i++) {
-
- digitalWrite(colPins[i], HIGH);
-
- digitalWrite(rowPins[i], LOW);
-
- }
-
- }
-
-
-
- void turnOffAllLeds() {
-
- for (int i = 0; i < 8; i++) {
-
- digitalWrite(colPins[i], LOW);
-
- digitalWrite(rowPins[i], HIGH);
-
- }
-
- }
-
-
-
- void scanRows() {
-
- digitalWrite(colPins[0], HIGH);
-
- for (int col = 0; col < 8; col++) {
-
- digitalWrite(rowPins[col], LOW);
-
- delay(500);
-
- }
-
- turnOffAllLeds();
-
- }
-
-
-
- void scanColumns() {
-
-
-
- for(int col = 0; col < 8; col++){
-
- digitalWrite(colPins[col], HIGH);
-
- for(int row = 0; row < 8; row++){
-
- digitalWrite(rowPins[row], LOW);
-
- }
-
- delay(500);
-
- digitalWrite(colPins[col], LOW);
-
- }
-
-
-
- }
-
-
-
- void loop() {
-
- turnOnAllLeds();
-
- delay(1500);
-
- turnOffAllLeds();
-
- delay(1500);
-
- scanRows();
-
- scanColumns();
-
- }
复制代码
将程序上传成功后,可以看到点阵屏闪烁一次,接着第一列的LED从上到下依次亮起,之后点阵屏按照列为单位从左至右依次亮起,并不断重复所有上述效果。
代码回顾
在开始学习如何使用代码来控制8*8 LED点阵屏之前,建议您看一下硬件回顾部分,了解8*8 LED点阵屏的基本原理。这样,您就能更容易地理解和上手本项目中代码所演示的点阵屏点亮效果。
- const int rowPins[8] = {6, 11, 5, 9, A0, 4, A1, 2};
-
- const int colPins[8] = {10, A2, A3, 7, 3, 8, 12, 13};
复制代码
开头这部分代码定义了两组引脚数组,rowPins 和 colPins,分别用于连接点阵屏的行和列。 -
- void setup() {
-
- for (int i = 0; i < 8; i++) {
-
- pinMode(colPins[i], OUTPUT);
-
- pinMode(rowPins[i], OUTPUT);
-
- digitalWrite(rowPins[i], HIGH);
-
- }
-
- }
复制代码
setup() 函数在Arduino板上电后只运行一次。 使用for循环将colPins和rowPins数组中的引脚设置为输出模式。 将所有行引脚设置为高电平(HIGH)确保点阵屏在初始化时处于关闭状态。 - void turnOnAllLeds() {
-
- for (int i = 0; i < 8; i++) {
-
- digitalWrite(colPins[i], HIGH);
-
- digitalWrite(rowPins[i], LOW);
-
- }
-
- }
复制代码
turnOnAllLeds() 函数用for循环将所有列引脚设置为高电平(HIGH),并将所有行引脚设置为低电平(LOW),所有的LED灯将被点亮。 - void turnOffAllLeds() {
-
- for (int i = 0; i < 8; i++) {
-
- digitalWrite(colPins[i], LOW);
-
- digitalWrite(rowPins[i], HIGH);
-
- }
-
- }
复制代码
turnOffAllLeds() 函数通过将所有列引脚设置为低电平(LOW)并将所有行引脚设置为高电平(HIGH),关闭点阵屏上的所有LED。 - void scanRows() {
-
- digitalWrite(colPins[0], HIGH);
-
- for (int row = 0; row < 8; row++) {
-
- digitalWrite(rowPins[row], LOW);
-
- delay(500);
-
- }
-
- turnOffAllLeds();
-
- }
复制代码
scanRows() 函数是扫描行,将第一列的LED灯从第一行到第八行依次亮起。 - void scanColumns() {
-
- for(int col = 0; col < 8; col++){
-
- digitalWrite(colPins[col], HIGH);
-
- for(int row = 0; row < 8; row++){
-
- digitalWrite(rowPins[row], LOW);
-
- }
-
- delay(500);
-
- digitalWrite(colPins[col], LOW);
-
- }
-
- }
复制代码
scanColumns() 函数是扫描列,使用两个for循环,外层for循环用于遍历所有的列,内层嵌套for循环用于点亮该列所有LED。 - void loop() {
-
- turnOnAllLeds();
-
- delay(1500);
-
- turnOffAllLeds();
-
- delay(1500);
-
- scanRows();
-
- scanColumns();
-
- }
复制代码
loop() 函数是Arduino程序的主体循环部分。 尝试打开所有LED,等待1.5秒,然后关闭所有LED,再等待1.5秒。 接着调用scanRows()和scanColumns()函数,实现依次扫描行和扫描列的效果。
硬件回顾8*8 LED点阵屏本项目中使用的点阵屏规格型号为788AS,内部电路图如图2所示。从图2可以看出LED显示屏为8*8的点阵屏,由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置高电平,某一行置低电平,则相应的二极管就亮。
图 2 内部电路图
课后练习本项目中是先扫描行再扫描列,请尝试对程序进行更改,实现先扫描列再扫描行。
附件下载:
示例代码.rar
|