目录

一、barGraph 实验测试

1.1 硬件接线方式

1.2 中文注释代码

1.3 核心原理

二、RowColumnScanning 实验测试

2.1 硬件接线方式

2.2 中文注释代码

2.3 核心原理


本实验硬件平台为 Arduino Uno R3 主控板,核心主控芯片为 ATmega328P,具备多路数字与模拟引脚、串口通信接口,可通过 USB 直接供电和程序烧录。

软件开发环境为 Arduino IDE,本次测试代码为内置 07.Display 显示输出官方示例,路径为文件→示例→07.Display,包含 barGraph、RowColumnScanning 共 2 个范例,主要用于学习 LED 光柱条图模拟显示、行列扫描点阵矩阵驱动等 IO 可视化显示输出编程技术。

一、barGraph 实验测试

1.1 硬件接线方式

  1. 电位器接线:电位器两端引脚分别接 + 5V、GND,中间抽头引脚接模拟输入 A0
  2. LED 光柱接线:10 颗 LED 各自串联 220Ω 限流电阻,正极依次接 D2~D11 引脚,负极统一接 GND
  3. 整体供电:Arduino Uno R3 通过 USB 数据线连接电脑,完成供电与程序烧录,无需串口监视器即可直观观察光柱变化

1.2 中文注释代码

/*
  LED bar graph LED光柱条形图显示示例

  读取电位器模拟输入数值,映射为LED点亮等级,实现光柱可视化指示效果;
  电位器数值越大,点亮的LED数量越多,模拟条形柱状图显示模拟量大小。

  电路说明:
  - 电位器中间引脚接模拟引脚A0
  - 10个LED经220Ω电阻分别连接数字引脚2~11,负极接GND

*/

// 常量定义
const int analogPin = A0;  // 电位器模拟输入引脚
const int ledCount = 10;   // 光柱LED总数量

// 数组存储全部LED引脚编号
int ledPins[] = {
  2, 3, 4, 5, 6, 7, 8, 9, 10, 11
};

void setup() {
  // 遍历数组,将全部LED引脚设置为输出模式
  for (int thisLed = 0; thisLed < ledCount; thisLed++) {
    pinMode(ledPins[thisLed], OUTPUT);
  }
}

void loop() {
  // 读取电位器原始0~1023模拟数值
  int sensorReading = analogRead(analogPin);
  // 将模拟量映射为0~10的LED点亮等级
  int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);

  // 循环遍历所有LED,分级点亮
  for (int thisLed = 0; thisLed < ledCount; thisLed++) {
    // 索引小于等级则点亮该LED
    if (thisLed < ledLevel) {
      digitalWrite(ledPins[thisLed], HIGH);
    }
    // 超出等级的LED全部熄灭
    else {
      digitalWrite(ledPins[thisLed], LOW);
    }
  }
}

1.3 核心原理

  1. 数组批量管理 IO 引脚:使用一维数组存储 10 路 LED 引脚,配合 for 循环批量初始化、批量控制输出,简化多 LED 管理代码
  2. 模拟量映射分级map()函数将 0~1023 连续模拟值线性映射为 0~10 的整数等级,对应可点亮的 LED 个数
  3. 光柱分级显示逻辑:循环遍历 LED 数组,索引序号小于当前等级则保持点亮,其余熄灭,形成从左到右逐级增长的光柱条形图
  4. 模拟量可视化方案:把看不见的电压数值转换为直观的灯光长度,可用于音量、液位、压力等传感器可视化指示
  5. 功能目的:学习数组批量 IO 控制、map 数值映射、分级显示逻辑,掌握多 LED 光柱可视化显示的基础编程方法

二、RowColumnScanning 实验测试

2.1 硬件接线方式

  1. 8×8 共阴极点阵矩阵接线(行接阳极,列接阴极)
    • 点阵 8 根行阳极引脚依次接数字引脚:2、7、19 (A5)、5、13、18 (A4)、12、16 (A2)
    • 点阵 8 根列阴极引脚依次接数字引脚:6、11、10、3、17 (A3)、4、8、9
    • 模拟引脚 A2~A5 复用为数字输出引脚,扩展 IO 数量驱动矩阵
  2. 双电位器输入(XY 光标控制)
    • X 轴电位器中间抽头接 A0,两端分别接 + 5V、GND
    • Y 轴电位器中间抽头接 A1,两端分别接 + 5V、GND
  3. 整体供电:Arduino Uno R3 通过 USB 数据线供电、烧录程序,转动电位器可移动点阵上的光标位置

以下是基于上图的引脚连接矩阵:

2.2 中文注释代码

/*
  Row-Column Scanning 8×8点阵行列扫描显示示例

  使用行列动态扫描驱动8×8共阴极LED点阵,搭配两路电位器控制屏幕内光标坐标;
  二维数组存储每一个灯珠亮灭状态,逐行循环刷新实现稳定画面显示。
  适配Lumex LDM-24488NI共阴极点阵,行引脚为阳极,列引脚为阴极。

  电路说明:
  - 点阵行阳极:D2、D7、A5、D5、D13、A4、D12、A2
  - 点阵列阴极:D6、D11、D10、D3、A3、D4、D8、D9
  - 两个电位器分别接模拟A0、A1,控制光标X、Y坐标

*/

// 一维数组:存储8根点阵行阳极引脚
const int row[8] = {
  2, 7, 19, 5, 13, 18, 12, 16
};

// 一维数组:存储8根点阵列阴极引脚
const int col[8] = {
  6, 11, 10, 3, 17, 4, 8, 9
};

// 二维数组pixels[行][列],存储8×8点阵每个灯珠的亮灭状态
int pixels[8][8];

// 光标当前坐标
int x = 5;
int y = 5;

void setup() {
  // 初始化所有行、列引脚为输出模式
  for (int thisPin = 0; thisPin < 8; thisPin++) {
    pinMode(col[thisPin], OUTPUT);
    pinMode(row[thisPin], OUTPUT);
    // 阴极默认高电平,所有LED初始熄灭
    digitalWrite(col[thisPin], HIGH);
  }

  // 初始化整个点阵:全部灯珠默认熄灭(HIGH)
  for (int x = 0; x < 8; x++) {
    for (int y = 0; y < 8; y++) {
      pixels[x][y] = HIGH;
    }
  }
}

void loop() {
  readSensors();    // 读取电位器,更新光标坐标
  refreshScreen();   // 行列扫描刷新点阵画面
}

// 读取两路电位器,更新光标XY位置
void readSensors() {
  // 清除上一帧光标位置
  pixels[x][y] = HIGH;
  // A0映射为X轴,数值反转实现左右方向对应
  x = 7 - map(analogRead(A0), 0, 1023, 0, 7);
  // A1映射为Y轴
  y = map(analogRead(A1), 0, 1023, 0, 7);
  // 设置新光标位置为点亮状态(LOW)
  pixels[x][y] = LOW;
}

// 逐行动态扫描刷新8×8点阵屏幕
void refreshScreen() {
  // 遍历每一行阳极
  for (int thisRow = 0; thisRow < 8; thisRow++) {
    digitalWrite(row[thisRow], HIGH); // 选中当前行,阳极拉高
    // 遍历该行所有列阴极
    for (int thisCol = 0; thisCol < 8; thisCol++) {
      int thisPixel = pixels[thisRow][thisCol];
      digitalWrite(col[thisCol], thisPixel);
      // 当前像素需要点亮时,阴极拉低;扫描完成立即拉高消隐防止重影
      if (thisPixel == LOW) {
        digitalWrite(col[thisCol], HIGH);
      }
    }
    digitalWrite(row[thisRow], LOW); // 关闭当前行,切换下一行
  }
}

2.3 核心原理

  1. 二维数组画面缓存pixels[8][8]二维数组存储 8×8 点阵每颗 LED 的亮灭状态,相当于屏幕显存,统一管理画面内容
  2. 动态行列扫描驱动:逐行拉高中阳极,再根据显存状态控制每一列阴极电平;利用人眼视觉暂留快速循环刷新,实现稳定画面
  3. 共阴极点阵电平逻辑:行阳极 HIGH、列阴极 LOW 时对应 LED 点亮;扫描完成立刻拉高阴极消隐,消除拖影、重影
  4. 模拟量坐标映射:两路电位器 ADC 数值通过map()映射为 0~7 点阵坐标,一路反转映射实现左右方向匹配,控制光标移动
  5. IO 引脚复用扩展:复用 A2~A5 模拟引脚作为数字输出,扩展可用 IO 口,满足 8×8 点阵 16 根控制线需求
  6. 功能目的:学习二维数组存储画面、点阵行列动态扫描驱动原理,掌握模拟量映射坐标、多 IO 引脚扩展控制,理解 LED 矩阵低占空比扫描显示技术

参考链接  :https://docs.arduino.cc/built-in-examples

Logo

CANN开发者社区旨在汇聚广大开发者,围绕CANN架构重构、算子开发、部署应用优化等核心方向,展开深度交流与思想碰撞,携手共同促进CANN开放生态突破!

更多推荐