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

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

必需的组件

ESP32开发套件4.0版

带总阴极的7段显示器-3

74HC595-3

680R电阻器-24个

5V电源

面包板

许多连接线

带有ESP32编程环境的Arduino IDE。

微型USB数据线

示意图

ESP32 7段显示示意图如下-

ESP32连接到74HC595。移位寄存器的data引脚连接到引脚14,Clock引脚连接到引脚12,Latch或strobe引脚连接到引脚4。你可以查看7段显示器的基础知识文章,了解更多关于7段显示器及其工作原理。

74HC595移位寄存器

74HC595是一个8位移位寄存器。下图显示了这些引脚-

引脚描述见下表-

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

其他输入引脚是引脚11和引脚12。两个大头针是SCK和RCK。SCK是时钟输入,RCK是锁存输入。获取数据并将其提供给下一个移位寄存器所需的真值表如下所示。

74HC595真值表

然而,引脚9是串行数据输出,它将为下一个级联移位寄存器提供数据。因此,引脚9连接到下一个移位寄存器的引脚14。数据连续串行地传输到下一个移位寄存器。

使用74HC595对7段显示器的ESP32进行编程

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

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

该行将标识ESP32的7段显示类型。如果使用公共阴极,它需要是真的;否则,如果使用普通阳极,则需要为假。根据公共阴极状态,移位寄存器的输出将改变。

const bool commonCathode=true

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

常量字节digit_pattern[17]=

{

//74HC595输出引脚连接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 latch pin=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(锁销,输出);//74HC595的ST_CP

引脚模式(clkPin,输出);//74HC595的SH_CP

引脚模式(dtPin,输出);//74HC595的鐽

}

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

空的循环(){

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

int disp digit 1=dispVal/10;

dispDigit2=dispVal境内;

if(increment==true){

printf(% d % d,% n ,显示数字1,显示数字2);

数字写入(锁销,低);

if(commonCathode==true){

shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[disp digit 2]| digit _ pattern[16]);//1.(数字DP)

shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[显示数字1]);

}否则{

shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 2]| digit _ pattern[16]);//1.(数字DP)

shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 1]);

}

digitalWrite(锁销,高电平);

显示值=1;

如果(显示值==99){

增量=假;

}

}否则{

printf(% d % d,% n ,显示数字1,显示数字2);

数字写入(锁销,低);

if(commonCathode==true){

shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[disp digit 2]| digit _ pattern[16]);//1.(数字DP)

shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[显示数字1]);

}否则{

shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 2]| digit _ pattern[16]);//1.(数字DP)

shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 1]);

}

digitalWrite(锁销,高电平);

显示值-=1;

如果(显示值==0){

增量=真;

}

}

延迟(250);

}

digitalWrite(锁销,低电平);

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

digitalWrite(锁销,高电平);

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

shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[disp digit 2]| digit _ pattern[16]);

shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[显示数字1]);

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

shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 2]| digit _ pattern[16]);

shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 1]);

带有ESP32的七段显示器 工作

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

/** 该程序在3、7 段显示器上打印数字* 硬件连接(舷外断裂到Arduino Nano):* Vin - 5V(允许3.3V)*接地-接地* 74hc 595 ST _ CP-4(ESP32)* 74hc 595 SH _ CP-12(ESP32)* 74hc 595 DS-14(ESP32)* *///设置七段类型(普通阴极或阳极)const bool commonCathode=true//如果你使用普通阳极,我使用普通阴极七段然后将值更改为错误。//用于七段显示的字母数字模式常量字节数字模式[17]={//74HC595带七段显示器的输出引脚连接//Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7//abcdefg dp0b 111111100,//00b 011000000,//10b 110110110010,//30b 0111100110,//40b10110110,//40b 10110110,//50b 1011111110,//60b 1110000000,//60b 1111100000000,//70b 1111111111111110一个0b00111110,//b 000011010,//C0b01111010,//d0b10011110,//E0b10001110,//F0b00000001 //.};//引脚连接到74HC595的ST_CPint闩锁销=4;//引脚连接到74HC595的SH_CP诠释clkPin=12//引脚连接到74HC595的DSint dtPin=14//显示值int dispVal=0;布尔增量=真;无效设置(){//把你的设置代码放在这里,运行一次://设置串口为115200序列号。开始(115200);延迟(1000);//将74HC595控制引脚设置为输出引脚模式(锁销,输出);//74HC595的ST_CPpinMode(clkPin,输出);//74HC595的SH_CPpinMode(dtPin,输出);//74HC595的DS}无效循环(){//把你的主要代码放在这里,重复运行:int disp digit 1=dispVal/10;dispDigit2=dispVal境内;如果(增量==真){ printf(%d%d,\ n ,显示数字1,显示数字2);数字写入(锁销,低);如果(普通阴极==真){shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[disp digit 2]| digit _ pattern[16]);//1.(数字DP)shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[disp digit 1]);}别的{shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 2]| digit _ pattern[16]);//1.(数字DP)shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 1]);}digitalWrite(latchPin,高);显示值=1;如果(显示值==99){增量=假;}}别的{ printf(%d%d,\ n ,显示数字1,显示数字2);数字写入(锁销,低);如果(普通阴极==真){shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[disp digit 2]| digit _ pattern[16]);//1.(数字DP)shiftOut(dtPin,clkPin,LSBFIRST,digit _ pattern[disp digit 1]);}别的{shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 2]| digit _ pattern[16]);//1.(数字DP)shiftOut(dtPin,clkPin,LSBFIRST,~(digit _ pattern[disp digit 1]);}digitalWrite(latchPin,高);显示值-=1;如果(显示值==0){增量=真;}}延迟(250);}