Jane 发表于 2024-11-22 11:26:41

Arduino入门教程27-点亮点阵

在生活中,点阵屏是一种常用的显示设备,它能够以矩阵形式展示信息,如数字、字母或简单的图形。通过控制点阵屏上的每一个点(LED)的亮灭,我们可以创造出各种视觉效果。今天,我们将通过一个Arduino项目来学习如何控制一个8x8的点阵屏,包括如何初始化硬件、编写代码来点亮所有LED、以及实现扫描显示技术。
元件清单

硬件连接图 1 点亮点阵连线图 示例代码//项目 - 点亮点阵

const int rowPins = {6, 11, 5, 9, A0, 4, A1, 2}; // 点阵屏行引脚(负极)

const int colPins = {10, A2, A3, 7, 3, 8, 12, 13}; // 点阵屏列引脚(正极)



void setup() {

for (int i = 0; i < 8; i++) {

    pinMode(colPins, OUTPUT);

    pinMode(rowPins, OUTPUT);

    digitalWrite(rowPins, HIGH); // 初始化行引脚为高电平(关闭)

}

}



void turnOnAllLeds() {

for (int i = 0; i < 8; i++) {

    digitalWrite(colPins, HIGH);

    digitalWrite(rowPins, LOW);

}

}



void turnOffAllLeds() {

for (int i = 0; i < 8; i++) {

    digitalWrite(colPins, LOW);

    digitalWrite(rowPins, HIGH);

}

}



void scanRows() {

digitalWrite(colPins, HIGH);

for (int col = 0; col < 8; col++) {

    digitalWrite(rowPins, LOW);

    delay(500);

}

turnOffAllLeds();

}



void scanColumns() {



for(int col = 0; col < 8; col++){

    digitalWrite(colPins, HIGH);

    for(int row = 0; row < 8; row++){

      digitalWrite(rowPins, LOW);

    }

    delay(500);

    digitalWrite(colPins, LOW);

}



}



void loop() {

turnOnAllLeds();

delay(1500);

turnOffAllLeds();

delay(1500);

scanRows();

scanColumns();

}
将程序上传成功后,可以看到点阵屏闪烁一次,接着第一列的LED从上到下依次亮起,之后点阵屏按照列为单位从左至右依次亮起,并不断重复所有上述效果。
代码回顾
在开始学习如何使用代码来控制8*8 LED点阵屏之前,建议您看一下硬件回顾部分,了解8*8 LED点阵屏的基本原理。这样,您就能更容易地理解和上手本项目中代码所演示的点阵屏点亮效果。
const int rowPins = {6, 11, 5, 9, A0, 4, A1, 2};

const int colPins = {10, A2, A3, 7, 3, 8, 12, 13};
开头这部分代码定义了两组引脚数组,rowPins 和 colPins,分别用于连接点阵屏的行和列。
void setup() {

for (int i = 0; i < 8; i++) {

    pinMode(colPins, OUTPUT);

    pinMode(rowPins, OUTPUT);

    digitalWrite(rowPins, HIGH);

}

}
setup() 函数在Arduino板上电后只运行一次。使用for循环将colPins和rowPins数组中的引脚设置为输出模式。将所有行引脚设置为高电平(HIGH)确保点阵屏在初始化时处于关闭状态。 void turnOnAllLeds() {

for (int i = 0; i < 8; i++) {

    digitalWrite(colPins, HIGH);

    digitalWrite(rowPins, LOW);

}

}
turnOnAllLeds() 函数用for循环将所有列引脚设置为高电平(HIGH),并将所有行引脚设置为低电平(LOW),所有的LED灯将被点亮。 void turnOffAllLeds() {

for (int i = 0; i < 8; i++) {

    digitalWrite(colPins, LOW);

    digitalWrite(rowPins, HIGH);

}

}
turnOffAllLeds() 函数通过将所有列引脚设置为低电平(LOW)并将所有行引脚设置为高电平(HIGH),关闭点阵屏上的所有LED。 void scanRows() {

digitalWrite(colPins, HIGH);

for (int row = 0; row < 8; row++) {

    digitalWrite(rowPins, LOW);

    delay(500);

}

turnOffAllLeds();

}
scanRows() 函数是扫描行,将第一列的LED灯从第一行到第八行依次亮起。 void scanColumns() {

for(int col = 0; col < 8; col++){

    digitalWrite(colPins, HIGH);

    for(int row = 0; row < 8; row++){

      digitalWrite(rowPins, LOW);

    }

    delay(500);

    digitalWrite(colPins, 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 内部电路图
课后练习本项目中是先扫描行再扫描列,请尝试对程序进行更改,实现先扫描列再扫描行。

附件下载:


页: [1]
查看完整版本: Arduino入门教程27-点亮点阵