所有微控制器都有特定数量的 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 数据线
示意图
ESP32 7 Segment Display的原理图如下-
ESP32 与 74HC595 相连。移位寄存器的数据管脚与PIN14相连,Clock管脚与PIN12相连,Latch或strobe管脚与PIN4相连。您可以查看7 段显示器的基础知识文章,以了解有关 7 段显示器及其工作原理的更多信息。
74HC595移位寄存器
74HC595是一个8位移位寄存器。引脚图如下图所示 -
引脚说明见下表-
QA 到 QH,从起始引脚 1 到 7 和引脚 15 是移位寄存器的 8 位输出。输入引脚为 PIN14,即串行数据输入,以串行方式获取数据。
其他输入引脚为 PIN 11 和 PIN12。这两个引脚是 SCK 和 RCK。SCK 是时钟输入,RCK 是锁存器输入。下面给出了获取数据并将数据提供给下一个移位寄存器所需的真值表
74HC595真值表
然而,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 段显示器上完美显示。由于电线的数量,连接和调试可能会变得很困难,我们在面包板上构建它,它确实按预期工作。
/*
* 该程序在 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);
}
全部0条评论
快来发表一下你的评论吧 !