0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用ESP32与74HC595实现7段显示器

科技观察员 来源:circuitdigest 作者:Sourav Gupta 2022-08-11 16:09 次阅读

所有微控制器都有特定数量的 IO 引脚,但在某些应用中,例如在 7 段显示器中,我们需要的 GPIO 引脚数量将超过我们的控制器所能提供的数量。对于这种需要多个输出引脚但微控制器的输出引脚数量有限的情况,74HC595 移位寄存器将是一个完美的选择。74HC595是以串行数据为输入,提供并行输出的移位寄存器。除了电源管脚,它只需要3个管脚就可以控制多个移位寄存器。

因此,可以使用微控制器单元的三个输出引脚并级联两个或更多移位寄存器以获得 16 或 24+ 输出引脚。在这个ESP32 74HC595项目中,我们将仅使用三个引脚连接三个 74HC595,并连接三个 7 段显示器以仅使用来自 ESP32 的三个引脚查看输出,ESP32 是一种支持 WiFi/BT 的微控制器设备,是许多基于物联网的流行选择项目。

所需组件

ESP32 开发套件 v4.0

7 段显示器共阴极 - 3 个

74HC595 - 3 个

680R电阻 - 24pcs

5V电源

面包板

很多连接线

带有 ESP32 编程环境的 Arduino IDE。

一根微型 USB 数据线

pYYBAGL0t7aAWZEAAAMWqX5sbtA738.png

示意图

ESP32 7 Segment Display的原理图如下-

poYBAGL0t7KAF5twAAFnHaW25Y4708.png

ESP32 与 74HC595 相连。移位寄存器的数据管脚与PIN14相连,Clock管脚与PIN12相连,Latch或strobe管脚与PIN4相连。您可以查看7 段显示器的基础知识文章,以了解有关 7 段显示器及其工作原理的更多信息

74HC595移位寄存器

74HC595是一个8位移位寄存器。引脚图如下图所示 -

pYYBAGL0t66AVYWEAAPdxAfsKtk457.png

引脚说明见下表-

pYYBAGL0t6qAU1GRAAD3a4ksfAI254.png

QA 到 QH,从起始引脚 1 到 7 和引脚 15 是移位寄存器的 8 位输出。输入引脚为 PIN14,即串行数据输入,以串行方式获取数据。

其他输入引脚为 PIN 11 和 PIN12。这两个引脚是 SCK 和 RCK。SCK 是时钟输入,RCK 是锁存器输入。下面给出了获取数据并将数据提供给下一个移位寄存器所需的真值表

74HC595真值表

poYBAGL0t6aACL8zAAFjHVJtBls981.png

然而,PIN9 是串行数据输出,它将提供数据到下一个级联移位寄存器。因此,PIN9与下一个移位寄存器的PIN 14相连。数据连续不断地串行传递到下一个移位寄存器。

使用 74HC595 为 7 段显示器编程 ESP32

控制所有三个 7 段显示器的程序可以在页面底部找到。您可以直接将它用于上面给出的电路图并进行测试。代码解释如下。

在进入程序之前,我们声明我们正在使用的 7 段显示器的类型。

此行将识别 ESP32 的 7 段显示类型。如果使用共阴极,则需要为真,否则,如果使用共阳极,则需要为假。由于取决于共同的阴极状态,移位寄存器的输出会发生变化。

const bool commonCathode = true;

下一部分用于以 8 位格式提供支持的数字和字母。这将提供来自移位寄存器的精确二进制输出,以点亮 7 段显示器。

const byte digit_pattern[17] =

{

// 74HC595 Outpin 与 7 段显示器的连接。

// Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7

// abcdefg DP

0b11111100, // 0

0b01100000, // 1

0b11011010, // 2

0b11110010, // 3

0b01100110, // 4

0b10110110 , // 5

06011111000, //

, // 7

0b11111110, // 8

0b11110110, // 9

0b11101110, // A

0b00111110, // b

0b00011010, // C

0b01111010, // d

0b10011110, // E

0b100011010, // F

0b0000 0.

};

在下面的代码行中,定义了移位寄存器引脚。

//连接到74HC595的ST_CP的引脚

int latchPin = 4;

//连接到74HC595的SH_CP的引脚

int clkPin = 12;

//74HC595的DS引脚

int dtPin = 14;

// 显示值

int dispVal = 0;

布尔增量=真;

设置代码在实际循环应用程序之前完成。在上述代码中,74HC595 控制引脚设置为输出,UART 通信的串行输出也仅用于调试目的。

void setup() {

// 将您的设置代码放在这里,运行一次:

// 将串口设置为 115200

Serial.begin(115200);

延迟(1000);

// 将 74HC595 控制引脚设置为输出

pinMode(latchPin, OUTPUT); //74HC595的ST_CP

pinMode(clkPin, OUTPUT); //74HC595的SH_CP

pinMode(dtPin, OUTPUT); //74HC595的DS

}

在循环部分或实际应用部分,代码分为两部分。首先,数字增加,而在另一部分,数字减少。但是,写入移位寄存器总是乞求锁存引脚变为低电平,并且在发送数据后,它需要为高电平。

void loop() {

// 把你的主要代码放在这里,重复运行:

int dispDigit1=dispVal/10;

int dispDigit2=dispVal%10;

if(increment==true){

printf(“%d%d.\n”, dispDigit1,dispDigit2);

数字写入(latchPin,低);

if(commonCathode == true){

shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (Digit+DP)

shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);

}else{

shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16])); // 1. (Digit+DP)

shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));

}

digitalWrite(latchPin, HIGH);

显示值 += 1;

如果(dispVal == 99){

增量=假;

}

}else{

printf(“%d%d.\n”, dispDigit1,dispDigit2);

数字写入(latchPin,低);

if(commonCathode == true){

shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (Digit+DP)

shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);

}else{

shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16])); // 1. (Digit+DP)

shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));

}

digitalWrite(latchPin, HIGH);

显示值-= 1;

如果(dispVal == 0){

增量=真;

}

}

延迟(250);

}

digitalWrite(latchPin, LOW);

在此低码和高码之间发送的数据。

digitalWrite(latchPin, HIGH);

然后,如果使用共阴极,它将使用以下代码在 7 段显示器中打印数字 -

shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]);

shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);

这些移位输出函数使用按位运算符将数据与时钟输入同时串行移位。它将打印数字以及数据点(DP)。但是,由于它是 LSB First 数据,因此 LSB 首先发送到 74HC595,然后转移到下一个 74HC595。第三个 7 段未编程和连接,以查看第一个数字被传输到最后一个 7 段,即 74HC595 单元。当 7-Seg 为共阳极时,它将使用反转运算符来反转输出。因此,

shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16]));

shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));

带有 ESP32 的七段显示器 – 工作

该电路由两个面包板构成,并检查输出。如下图所示,数字在 7 段显示器上完美显示。由于电线的数量,连接和调试可能会变得很困难,我们在面包板上构建它,它确实按预期工作。

pYYBAGL0t5uASf96AAXGkKiJGjE781.png

/*
* 该程序在 3、7 段显示器上打印数字
* 硬件连接(Breakoutboard 到 Arduino Nano):
* Vin - 5V(允许 3.3V)
* 接地 - 接地
* 74HC595 ST_CP - 4 (ESP32)
* 74HC595 SH_CP - 12 (ESP32)
* 74HC595 DS - 14 (ESP32)
*
*/
// 设置7segment类型(普通Cathode或Anode)
const bool commonCathode = true; // 如果你使用普通阳极,我使用普通阴极 7 段然后将值更改为 false。
// 用于 7 段显示的字母数字模式
常量字节数字模式[17] =
{
// 74HC595 带 7 段显示器的 Outpin 连接。
// Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
// abcdefg DP
0b11111100, // 0
0b01100000, // 1
0b11011010, // 2
0b11110010, // 3
0b01100110, // 4
0b10110110, // 5
0b10111110, // 6
0b11100000, // 7
0b11111110, // 8
0b11110110, // 9
0b11101110, // 一个
0b00111110, // b
0b00011010, // C
0b01111010, // d
0b10011110, // E
0b10001110, // F
0b00000001 // .
};
//引脚连接到74HC595的ST_CP
int 闩锁销 = 4;
//引脚连接到74HC595的SH_CP
诠释 clkPin = 12;
//引脚连接到74HC595的DS
int dtPin = 14;
// 显示值
int dispVal = 0;
布尔增量=真;
无效设置(){
// 把你的设置代码放在这里,运行一次:
// 设置串口为 115200
序列号.开始(115200);
延迟(1000);
// 将 74HC595 控制引脚设置为输出
pinMode(latchPin,输出);//74HC595的ST_CP
pinMode(clkPin,输出);//74HC595的SH_CP
pinMode(dtPin,输出);//74HC595的DS
}
无效循环(){
// 把你的主要代码放在这里,重复运行:
int dispDigit1=dispVal/10;
int dispDigit2=dispVal%10;
如果(增量==真){
printf("%d%d.\n", dispDigit1,dispDigit2);
数字写入(latchPin,低);
如果(普通阴极 == 真){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (数字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
}别的{
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16])); // 1. (数字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
显示值 += 1;
如果(dispVal == 99){
增量=假;
}
}别的{
printf("%d%d.\n", dispDigit1,dispDigit2);
数字写入(latchPin,低);
如果(普通阴极 == 真){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (数字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
}别的{
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16])); // 1. (数字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
显示值-= 1;
如果(dispVal == 0){
增量=真;
}
}
延迟(250);
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 显示器
    +关注

    关注

    21

    文章

    4940

    浏览量

    139803
  • 74HC595
    +关注

    关注

    7

    文章

    191

    浏览量

    30789
  • ESP32
    +关注

    关注

    17

    文章

    955

    浏览量

    17068
收藏 人收藏

    评论

    相关推荐

    74HC595的原理

    屏的显示效果,使用74HC595来驱动发光二极管。595的使用方法很简单,在正常使用时SCLR(清除位移缓存)为高电平,G为低电平。从SER每输入一位数据,串行输入时钟SCK上升沿有
    发表于 10-27 20:56

    如何利用SPI接口实现74HC595的操作

    /****************************现象:通过查询的方式利用SPI接口实现74HC595的操作,并在数码上显示
    发表于 11-24 06:03

    利用SPI接口实现74HC595的操作

    /****************************现象:通过查询的方式利用SPI接口实现74HC595的操作,并在数码上显示
    发表于 11-24 06:46

    74HC595的工作原理是什么,怎么使用

    内部工作原理74HC595时一款漏极开路输出的CMOS移位寄存,输出端为可控的三态输出,亦能串行输出控制下一级级联芯片,其移位时钟频率高达25MHz。二、74HC595引脚的简...
    发表于 11-29 08:27

    74HC595怎么使用

    一、74HC595使用方法74HC595的数据端Q0--Q7:八位并行输出端,可以直接控制数码管的8个。Q7:级联输出端。将它接下一个
    发表于 12-07 06:46

    如何利用两个74HC595实现三个引脚实现数据的传送

    74HC595驱动8位选数码管利用两个74HC595实现三个引脚实现数据的传送以下是
    发表于 12-07 06:57

    如何使用HAL 库的SPI实现74HC595芯片控制

    使用HAL 库的SPI实现74HC595芯片控制先简单看一下原理图:原理图是简单的级联方式,如图所示可用三个字节,例如:先写入第一个字节0000 0000控制的数据是右边74HC595芯片所有引脚为
    发表于 12-07 07:17

    如何实现74HC595驱动数码管显示

    ​4、数码管显示数码管驱动电路采用2片74HC595芯片进行IO扩展,仅仅只需3Pin即可驱动需要16位引脚的数码管。74HC595是一个8位串行输入、并行输出的位移缓存。只有对
    发表于 12-07 07:29

    如何利用CC2530和74HC595实现数码管动态显示数字的效果?

    数码管的原理是什么?如何利用CC2530和74HC595实现数码管动态显示数字的效果?
    发表于 01-25 06:43

    基于74hc595和smd电阻的0.8寸7模块电路

    描述4位0.8寸7模块电路(74hc595driver)此设计使用 4 个 74hc595 和 32 个 smd 电阻 220ohm
    发表于 08-12 07:56

    使用移位寄存74HC595和ULN2003的7屏蔽2,3英寸

    描述7屏蔽2,3英寸7 屏蔽 2,3 使用移位寄存 74HC595 和 ULN2003pc
    发表于 09-09 06:04

    利用74HC595实现多位LED显示的新方法

            本文介绍了应用移位寄存芯片74HC595 实现LED 动、静态显示的基本原理。提出了一种用
    发表于 09-09 08:39 349次下载

    74hc573和74hc595有什么不同?该怎样区分74hc573和74hc595

    在实际应用电路中74hc573和74hc595都可用,都可实现行扫描,看你电路怎么连接,程序如何编写。
    的头像 发表于 07-27 14:27 2.7w次阅读
    <b class='flag-5'>74hc</b>573和<b class='flag-5'>74hc595</b>有什么不同?该怎样区分<b class='flag-5'>74hc</b>573和<b class='flag-5'>74hc595</b>

    任务774HC595的使用方法

    内部工作原理74HC595时一款漏极开路输出的CMOS移位寄存,输出端为可控的三态输出,亦能串行输出控制下一级级联芯片,其移位时钟频率高达25MHz。二、74HC595引脚的简...
    发表于 11-19 14:51 42次下载
    任务<b class='flag-5'>7</b>:<b class='flag-5'>74HC595</b>的使用方法

    7屏蔽使用移位寄存74HC595和ULN2003

    电子发烧友网站提供《7屏蔽使用移位寄存74HC595和ULN2003.zip》资料免费下载
    发表于 08-18 15:17 2次下载
    <b class='flag-5'>7</b><b class='flag-5'>段</b>屏蔽使用移位寄存<b class='flag-5'>器</b><b class='flag-5'>74HC595</b>和ULN2003