esp32使用数码管显示数字

        前言:本文参考视频链接放在最后,同时本文为学习笔记,为了自己好复习。

#数码管概念

        现在显示流行有 LCD  OLED  但是数码管也能用来作为显示,相对于前两者,数码管稳定价格低廉,到现在也在被应用,也没有被替代。

        这种模块,按照显示数字的多少有着不同的叫法,1位数码管,只能显示1位数字,同样的4位数码管可以显示4位数字。

        按照显示多少不同的数字,有着不同的叫法,同时分为共阳极数码管,和共阴极数码管,这两种数码管的区别在于,公共端是正极和接地,公共端是正极,就是共阳极数码管,公共端全都接地就是共阴极数码管。

共阳极数码管:将所有发光二极管的阳极接到一起,行成公共阳极(COM),数码管。

共阴极数码管:将所有发光二极管的阴极接到一起,行成公共阴极(COM),数码管。        

显示原理:单个数码管,内部是分为a b c d e f g 7个段,每个段有一个LED组成,当LED发光时,这个段落就亮起,不同的段落就组成了不同的数字来显示,所以只需要让LED亮起,组合就能显示数字,当为共阳极数码管,因为已经供电,只需要将连接的IO引脚设置为拉低接地,就能亮起,同理如果为共阴极只需要将IO引脚设置为高电平,就能点亮LED段落。

#1位数码管显示数字    

    到这里,理解了,常见的数码管,数码管显示的原理,接下来将用程序点亮一个数码管。

#define Pin_c 19
#define Pin_d 21 
#define Pin_e 22
#define Pin_f 2
#define Pin_g 15
#define Pin_dp 18
//宏定义定义引脚

int pin_array[8] = {Pin_a,Pin_b,Pin_c,Pin_d,Pin_e,Pin_f,Pin_g,Pin_dp};
//数组放置宏定义的
int number_array[][8] = 
{
{0,0,0,0,0,0,1,1},//0
{1,0,0,1,1,1,1,1},//1
{0,0,1,0,0,1,0,1},//2
{0,0,0,0,1,1,0,1},//3
{1,0,0,1,1,0,0,1},//4
{0,1,0,0,1,0,0,1},//5
{0,1,0,0,0,0,0,1},//6
{0,0,0,1,1,1,1,1},//7
{0,0,0,0,0,0,0,1},//8
{0,0,0,0,1,0,0,1},//9

}
//在C语言中数组,数组一维没有填写会默认判断数组大小,如果两个都没有填写则会报错,只能是一维没有填写
void setup() {
  for(int i = 0;i<8;i++)
  {
    pinMode(pin_array[i],OUTPUT);
    digitalWrite(pin_array[i],HIGH);
   // pinMode(2,OUTPUT);
  }
}

  // put your setup code here, to run once:

void loop() {
  // put your main code here, to run repeatedly:
  //显示数字3
  int num = 3;
  for(int i = 0,i<8,i++)
    {
      digitalWrite(pin_array[i],number_array[num][i]);

    }

}

        上面代码里,将显示不同的数字,对应不同的二极管发光情况,当成元素放在二维数组里面,这里二维数组省略一维,程序会根据数组大小自动判断,一维大小,只能这么用,也只能这么省略。


#4位数码管显示数字

        4位数码管跟1位数码管是有些区分的,前者没有公共端(COM),有的是不同的选通端,也就是SEG1  SEG2  SEG3  SEG4,多位数码管的特点是,选通端是独立的,每个数码管的LED段选线是公共的

        总结:4位数码管中,段选线用来控制显示的数字,选通端(位选线)用来控制是那个数码管进行显示。

/*
  该程序的作用是演示动态扫描原理。
  在线文档: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);
    }
  }

// 显示数字的函数
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() {
  display_number(0, 1);
  delay(count);

  display_number(1, 2);
  delay(count);

  display_number(2, 3);
  delay(count);

  display_number(3, 4);
  delay(count);

  if (count > 10) {
    if (count > 110) {
      count -= 50;
    }else {
      count -= 10;  
    }
    }
}

                欢迎指正,希望对你,有所帮助!!!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值