2024-11-22 11:26:41 [显示全部楼层]
355浏览
查看: 355|回复: 0

[入门教程] Arduino入门教程27-点亮点阵

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

硬件连接
Arduino入门教程27-点亮点阵图2
图 1 点亮点阵连线图
示例代码
  1. //项目 - 点亮点阵
  2. const int rowPins[8] = {6, 11, 5, 9, A0, 4, A1, 2}; // 点阵屏行引脚(负极)
  3. const int colPins[8] = {10, A2, A3, 7, 3, 8, 12, 13}; // 点阵屏列引脚(正极)
  4. void setup() {
  5.   for (int i = 0; i < 8; i++) {
  6.     pinMode(colPins[i], OUTPUT);
  7.     pinMode(rowPins[i], OUTPUT);
  8.     digitalWrite(rowPins[i], HIGH); // 初始化行引脚为高电平(关闭)
  9.   }
  10. }
  11. void turnOnAllLeds() {
  12.   for (int i = 0; i < 8; i++) {
  13.     digitalWrite(colPins[i], HIGH);
  14.     digitalWrite(rowPins[i], LOW);
  15.   }
  16. }
  17. void turnOffAllLeds() {
  18.   for (int i = 0; i < 8; i++) {
  19.     digitalWrite(colPins[i], LOW);
  20.     digitalWrite(rowPins[i], HIGH);
  21.   }
  22. }
  23. void scanRows() {
  24.   digitalWrite(colPins[0], HIGH);
  25.   for (int col = 0; col < 8; col++) {
  26.     digitalWrite(rowPins[col], LOW);
  27.     delay(500);
  28.   }
  29.   turnOffAllLeds();
  30. }
  31. void scanColumns() {
  32.   for(int col = 0; col < 8; col++){
  33.     digitalWrite(colPins[col], HIGH);
  34.     for(int row = 0; row < 8; row++){
  35.       digitalWrite(rowPins[row], LOW);
  36.     }
  37.     delay(500);
  38.     digitalWrite(colPins[col], LOW);
  39.   }
  40. }
  41. void loop() {
  42.   turnOnAllLeds();
  43.   delay(1500);
  44.   turnOffAllLeds();
  45.   delay(1500);
  46.   scanRows();
  47.   scanColumns();
  48. }
复制代码

将程序上传成功后,可以看到点阵屏闪烁一次,接着第一列的LED从上到下依次亮起,之后点阵屏按照列为单位从左至右依次亮起,并不断重复所有上述效果。

代码回顾
在开始学习如何使用代码来控制8*8 LED点阵屏之前,建议您看一下硬件回顾部分,了解8*8 LED点阵屏的基本原理。这样,您就能更容易地理解和上手本项目中代码所演示的点阵屏点亮效果。

  1. const int rowPins[8] = {6, 11, 5, 9, A0, 4, A1, 2};
  2. const int colPins[8] = {10, A2, A3, 7, 3, 8, 12, 13};
复制代码

开头这部分代码定义了两组引脚数组,rowPins 和 colPins,分别用于连接点阵屏的行和列。
  1. void setup() {
  2.   for (int i = 0; i < 8; i++) {
  3.     pinMode(colPins[i], OUTPUT);
  4.     pinMode(rowPins[i], OUTPUT);
  5.     digitalWrite(rowPins[i], HIGH);
  6.   }
  7. }
复制代码

setup() 函数在Arduino板上电后只运行一次。
使用for循环将colPins和rowPins数组中的引脚设置为输出模式。
将所有行引脚设置为高电平(HIGH)确保点阵屏在初始化时处于关闭状态。
  1. void turnOnAllLeds() {
  2.   for (int i = 0; i < 8; i++) {
  3.     digitalWrite(colPins[i], HIGH);
  4.     digitalWrite(rowPins[i], LOW);
  5.   }
  6. }
复制代码

turnOnAllLeds() 函数用for循环将所有列引脚设置为高电平(HIGH),并将所有行引脚设置为低电平(LOW),所有的LED灯将被点亮。
  1. void turnOffAllLeds() {
  2.   for (int i = 0; i < 8; i++) {
  3.     digitalWrite(colPins[i], LOW);
  4.     digitalWrite(rowPins[i], HIGH);
  5.   }
  6. }
复制代码

turnOffAllLeds() 函数通过将所有列引脚设置为低电平(LOW)并将所有行引脚设置为高电平(HIGH),关闭点阵屏上的所有LED。
  1. void scanRows() {
  2.   digitalWrite(colPins[0], HIGH);
  3.   for (int row = 0; row < 8; row++) {
  4.     digitalWrite(rowPins[row], LOW);
  5.     delay(500);
  6.   }
  7.   turnOffAllLeds();
  8. }
复制代码

scanRows() 函数是扫描行,将第一列的LED灯从第一行到第八行依次亮起。
  1. void scanColumns() {
  2.   for(int col = 0; col < 8; col++){
  3.     digitalWrite(colPins[col], HIGH);
  4.     for(int row = 0; row < 8; row++){
  5.       digitalWrite(rowPins[row], LOW);
  6.     }
  7.     delay(500);
  8.     digitalWrite(colPins[col], LOW);
  9.   }
  10. }
复制代码

scanColumns() 函数是扫描列,使用两个for循环,外层for循环用于遍历所有的列,内层嵌套for循环用于点亮该列所有LED。
  1. void loop() {
  2.   turnOnAllLeds();
  3.   delay(1500);
  4.   turnOffAllLeds();
  5.   delay(1500);
  6. scanRows();
  7.   scanColumns();
  8. }
复制代码

loop() 函数是Arduino程序的主体循环部分。
尝试打开所有LED,等待1.5秒,然后关闭所有LED,再等待1.5秒。
接着调用scanRows()和scanColumns()函数,实现依次扫描行和扫描列的效果。

硬件回顾8*8 LED点阵屏
本项目中使用的点阵屏规格型号为788AS,内部电路图如图2所示。从图2可以看出LED显示屏为8*8的点阵屏,由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置高电平,某一行置低电平,则相应的二极管就亮。

Arduino入门教程27-点亮点阵图3
图 2 内部电路图

课后练习
本项目中是先扫描行再扫描列,请尝试对程序进行更改,实现先扫描列再扫描行。


附件下载:
下载附件示例代码.rar

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail