前言:本文参考视频链接放在最后,同时本文为学习笔记,为了自己好复习。
#数码管概念
现在显示流行有 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;
}
}
}
欢迎指正,希望对你,有所帮助!!!