数码管显示
大约 5 分钟ESP32Arduino
现阶段,无论 LCD 和 OLED 显示技术有多好,都无法替代这个古老的显示方式 - 数码管。直到现在,很多领域都离不开数码管。最主要的原因是他便宜有稳定,而且控制简单。
实验原理
数码管是一种半导体发光器件,其基本单元依然是 LED。 数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要显示的内容。
按照能显示的位数可分为 1 位、2 位、3 位、4 位、5 位、6 位、7 位等数码管。
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管:
共阳数码管
是指将所有发光二极管的阳极
接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极 COM 接到+5V
,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管
是指将所有发光二极管的阴极
接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极 COM 接到地线 GND
上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
原理图如下:
引脚图中间的两个 COM,是公共端,共阴数码管要将其接地,共阳数码管将其接电源。a,b,c,d,e,f,g,dp 被称为段选线。
如何判断是共阴还是共阳?
如果你不清楚你的数码管到底是共阴还是共阳,可以使用下面三种方法测试。
- 一般在数码管的侧面会标注该数码管的型号,可以在浏览器中搜索该型号,获取对应的原理图
- 用 ESP32 单片机给面包板通电(3.3V 引脚),公共端通过一个限流电阻接电源, 用跳线连通电源和数码管的 LED 引脚,如果亮了说明是
共阳型数码管
;反之,说明是共阳型数码管
。
- 使用万用表的二极管档,红表笔接公共端,黑表笔接任一引脚,亮了说明是
共阳型数码管
,反之,则说明是共阴型数码管
。
提示
建议把所有引脚测试一遍,也可以检查出是否有坏了的 LED。
硬件电路设计
物料清单(BOM 表):
材料名称 | 数量 |
---|---|
1 位 8 段数码管 | 1 |
1kΩ 电阻 | 1 |
杜邦线(跳线) | 若干 |
面包板 | 1 |
将材料按照下图相连:
软件程序设计
设计这个程序时,我们需要使用二维数组。
如果我们想让这个数码管某一引脚亮起来,那么我们需要给对应的引脚设置一个低电平。如果我们想要显示一个数字时,就需要让多个 LED 同时亮,比如数字 1 需要 b、c 引脚给低电平,其余引脚给高电平。程序可以这样写:
// 定义输出引脚并把所有引脚存到数组中
int pin_a = 4;
int pin_b = 5;
int pin_c = 19;
int pin_d = 21;
int pin_e = 22;
int pin_f = 2;
int pin_g = 15;
int 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
};
void setup() {
// 设置所有引脚为输出模式,初始化所有引脚为高电平
for (int i=0;i<8;i++){
pinMode(pin_array[i], OUTPUT);
digitalWrite(pin_array[i], HIGH);
}
}
void loop() {
// 显示数字
int num = 8;
for (int i=0;i<8;i++){
digitalWrite(pin_array[i], number_array[num][i]);
}
}
我们也可以使用函数来把显示数字的逻辑代码封装起来,方便我们在其他地方使用:
// 定义输出引脚并把所有引脚存到数组中
int pin_a = 4;
int pin_b = 5;
int pin_c = 19;
int pin_d = 21;
int pin_e = 22;
int pin_f = 2;
int pin_g = 15;
int 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
};
void display_number(int num){
// 清屏
for (int i=0;i<8;i++){
digitalWrite(pin_array[i], HIGH);
}
// 改变对应引脚的电平;
for (int i=0;i<8;i++){
digitalWrite(pin_array[i], number_array[num][i]);
}
}
void setup() {
// 设置所有引脚为输出模式,初始化所有引脚为高电平
for (int i=0;i<8;i++){
pinMode(pin_array[i], OUTPUT);
digitalWrite(pin_array[i], HIGH);
}
}
void loop() {
// 显示数字
for (int i=0;i<10;i++){
display_number(i);
delay(500);
}
}