多数码管(Arduino)

本文介绍了如何使用ESP32和Arduino编程实现动态控制4位数码管的7段显示,包括定义位选线和段选线,以及清屏和显示数字的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图示

在这里插入图片描述
在这里插入图片描述

/*
  该程序的作用是演示动态扫描原理。
  在线文档:https://docs.geeksman.com/esp32/Arduino/08.esp32-arduino-4-digits-7segment.html
*/


// 定义位选线引脚
int seg_1 = 5;
int seg_2 = 18;
int seg_3 = 19;
int seg_4 = 21;

// 定义位选线数组
int seg_array[4] = {seg_1, seg_2, seg_3, seg_4};

// 定义段选线引脚;
int a = 32;
int b = 25;
int c = 27;
int d = 12;
int e = 13;
int f = 33;
int g = 26;
int dp = 14;

// 定义位选线引脚
int led_array[8] = {a, b, c, d, e, f, g, dp};

// 定义共阴极数码管不同数字对应的逻辑电平的二维数组
int logic_array[10][8] = {
 //a, b, c, d, e, f, g, dp
  {1, 1, 1, 1, 1, 1, 0, 0}, // 0
  {0, 1, 1, 0, 0, 0, 0, 0}, // 1
  {1, 1, 0, 1, 1, 0, 1, 0}, // 2
  {1, 1, 1, 1, 0, 0, 1, 0}, // 3
  {0, 1, 1, 0, 0, 1, 1, 0}, // 4
  {1, 0, 1, 1, 0, 1, 1, 0}, // 5
  {1, 0, 1, 1, 1, 1, 1, 0}, // 6
  {1, 1, 1, 0, 0, 0, 0, 0}, // 7
  {1, 1, 1, 1, 1, 1, 1, 0}, // 8
  {1, 1, 1, 1, 0, 1, 1, 0}, // 9
  };

// 延时时间
int count = 355;


// 清屏函数
void clear() {
  for (int i=0;i<4;i++) {
    digitalWrite(seg_array[i], HIGH);
    }

  for (int i=0;i<8;i++) {
    digitalWrite(led_array[i], LOW);
    }
  }
// 4 位数码管显示函数
void display_4_number(int number) {
  // 把输入的数字格式化为 4 位数的数组
  if (number < 10000) {
    // 获取每一位对应的数字
//    // 获取个位
//    int seg_4_number = number % 10;
//    number /= 10;
//
//    // 获取十位
//    int seg_3_number = number % 10;
//    number /= 10;
//
//    // 获取百位
//    int seg_2_number = number % 10;
//    number /= 10;
//
//    // 获取千位
//    int seg_1_number = number % 10;

    // 定义格式化数组
    int number_array[4];

    // 使用循环获取格式化数组
    for (int i=3;i>=0;i--) {
      number_array[i] = number % 10;
      number /= 10;
      }
      
    // 显示数字
    for (int i=0;i<4;i++) {
      display_number(i, number_array[i]);
      delay(5);
      }
    }
}

// 显示数字的函数
void display_number(int order, int number) {

  // 清屏
  clear();

  // 把对应位选线的电平拉低
  digitalWrite(seg_array[order], LOW);

  // 显示数字
  for (int i=0;i<8;i++) {
    digitalWrite(led_array[i], logic_array[number][i]);
    }
  }

void setup() {
  // 设置所有位选线引脚为输出模式,初始化所有位选线引脚为高电平
  for (int i=0;i<4;i++) {
    pinMode(seg_array[i], OUTPUT);
    digitalWrite(seg_array[i], HIGH);
    }
    
  // 设置所有段选线引脚为输出模式,初始化所有段选线引脚为低电平
  for (int i=0;i<8;i++) {
    pinMode(led_array[i], OUTPUT);
    digitalWrite(led_array[i], LOW);
    }
}

void loop() {
  for(int i=0;i<=9999;i++){
    display_4_number(i);
  }
  
  

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值