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]