所有微控制器都有特定數(shù)量的 IO 引腳,但在某些應(yīng)用中,例如在 7 段顯示器中,我們需要的 GPIO 引腳數(shù)量將超過我們的控制器所能提供的數(shù)量。對于這種需要多個(gè)輸出引腳但微控制器的輸出引腳數(shù)量有限的情況,74HC595 移位寄存器將是一個(gè)完美的選擇。74HC595是以串行數(shù)據(jù)為輸入,提供并行輸出的移位寄存器。除了電源管腳,它只需要3個(gè)管腳就可以控制多個(gè)移位寄存器。
因此,可以使用微控制器單元的三個(gè)輸出引腳并級聯(lián)兩個(gè)或更多移位寄存器以獲得 16 或 24+ 輸出引腳。在這個(gè)ESP32 74HC595項(xiàng)目中,我們將僅使用三個(gè)引腳連接三個(gè) 74HC595,并連接三個(gè) 7 段顯示器以僅使用來自 ESP32 的三個(gè)引腳查看輸出,ESP32 是一種支持 WiFi/BT 的微控制器設(shè)備,是許多基于物聯(lián)網(wǎng)的流行選擇項(xiàng)目。
所需組件
ESP32 開發(fā)套件 v4.0
7 段顯示器共陰極 - 3 個(gè)
74HC595 - 3 個(gè)
680R電阻 - 24pcs
5V電源
面包板
很多連接線
帶有 ESP32 編程環(huán)境的 Arduino IDE。
一根微型 USB 數(shù)據(jù)線
示意圖
ESP32 7 Segment Display的原理圖如下-
ESP32 與 74HC595 相連。移位寄存器的數(shù)據(jù)管腳與PIN14相連,Clock管腳與PIN12相連,Latch或strobe管腳與PIN4相連。您可以查看7 段顯示器的基礎(chǔ)知識(shí)文章,以了解有關(guān) 7 段顯示器及其工作原理的更多信息。
74HC595移位寄存器
74HC595是一個(gè)8位移位寄存器。引腳圖如下圖所示 -
引腳說明見下表-
QA 到 QH,從起始引腳 1 到 7 和引腳 15 是移位寄存器的 8 位輸出。輸入引腳為 PIN14,即串行數(shù)據(jù)輸入,以串行方式獲取數(shù)據(jù)。
其他輸入引腳為 PIN 11 和 PIN12。這兩個(gè)引腳是 SCK 和 RCK。SCK 是時(shí)鐘輸入,RCK 是鎖存器輸入。下面給出了獲取數(shù)據(jù)并將數(shù)據(jù)提供給下一個(gè)移位寄存器所需的真值表
74HC595真值表
然而,PIN9 是串行數(shù)據(jù)輸出,它將提供數(shù)據(jù)到下一個(gè)級聯(lián)移位寄存器。因此,PIN9與下一個(gè)移位寄存器的PIN 14相連。數(shù)據(jù)連續(xù)不斷地串行傳遞到下一個(gè)移位寄存器。
使用 74HC595 為 7 段顯示器編程 ESP32
控制所有三個(gè) 7 段顯示器的程序可以在頁面底部找到。您可以直接將它用于上面給出的電路圖并進(jìn)行測試。代碼解釋如下。
在進(jìn)入程序之前,我們聲明我們正在使用的 7 段顯示器的類型。
此行將識(shí)別 ESP32 的 7 段顯示類型。如果使用共陰極,則需要為真,否則,如果使用共陽極,則需要為假。由于取決于共同的陰極狀態(tài),移位寄存器的輸出會(huì)發(fā)生變化。
const bool commonCathode = true;
下一部分用于以 8 位格式提供支持的數(shù)字和字母。這將提供來自移位寄存器的精確二進(jìn)制輸出,以點(diǎn)亮 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;
布爾增量=真;
設(shè)置代碼在實(shí)際循環(huán)應(yīng)用程序之前完成。在上述代碼中,74HC595 控制引腳設(shè)置為輸出,UART 通信的串行輸出也僅用于調(diào)試目的。
void setup() {
// 將您的設(shè)置代碼放在這里,運(yùn)行一次:
// 將串口設(shè)置為 115200
Serial.begin(115200);
延遲(1000);
// 將 74HC595 控制引腳設(shè)置為輸出
pinMode(latchPin, OUTPUT); //74HC595的ST_CP
pinMode(clkPin, OUTPUT); //74HC595的SH_CP
pinMode(dtPin, OUTPUT); //74HC595的DS
}
在循環(huán)部分或?qū)嶋H應(yīng)用部分,代碼分為兩部分。首先,數(shù)字增加,而在另一部分,數(shù)字減少。但是,寫入移位寄存器總是乞求鎖存引腳變?yōu)榈碗娖剑⑶以诎l(fā)送數(shù)據(jù)后,它需要為高電平。
void loop() {
// 把你的主要代碼放在這里,重復(fù)運(yùn)行:
int dispDigit1=dispVal/10;
int dispDigit2=dispVal%10;
if(increment==true){
printf(“%d%d.\n”, dispDigit1,dispDigit2);
數(shù)字寫入(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);
數(shù)字寫入(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);
在此低碼和高碼之間發(fā)送的數(shù)據(jù)。
digitalWrite(latchPin, HIGH);
然后,如果使用共陰極,它將使用以下代碼在 7 段顯示器中打印數(shù)字 -
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]);
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
這些移位輸出函數(shù)使用按位運(yùn)算符將數(shù)據(jù)與時(shí)鐘輸入同時(shí)串行移位。它將打印數(shù)字以及數(shù)據(jù)點(diǎn)(DP)。但是,由于它是 LSB First 數(shù)據(jù),因此 LSB 首先發(fā)送到 74HC595,然后轉(zhuǎn)移到下一個(gè) 74HC595。第三個(gè) 7 段未編程和連接,以查看第一個(gè)數(shù)字被傳輸?shù)阶詈笠粋€(gè) 7 段,即 74HC595 單元。當(dāng) 7-Seg 為共陽極時(shí),它將使用反轉(zhuǎn)運(yùn)算符來反轉(zhuǎn)輸出。因此,
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16]));
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
帶有 ESP32 的七段顯示器 – 工作
該電路由兩個(gè)面包板構(gòu)成,并檢查輸出。如下圖所示,數(shù)字在 7 段顯示器上完美顯示。由于電線的數(shù)量,連接和調(diào)試可能會(huì)變得很困難,我們在面包板上構(gòu)建它,它確實(shí)按預(yù)期工作。
/*
* 該程序在 3、7 段顯示器上打印數(shù)字
* 硬件連接(Breakoutboard 到 Arduino Nano):
* Vin - 5V(允許 3.3V)
* 接地 - 接地
* 74HC595 ST_CP - 4 (ESP32)
* 74HC595 SH_CP - 12 (ESP32)
* 74HC595 DS - 14 (ESP32)
*
*/
// 設(shè)置7segment類型(普通Cathode或Anode)
const bool commonCathode = true; // 如果你使用普通陽極,我使用普通陰極 7 段然后將值更改為 false。
// 用于 7 段顯示的字母數(shù)字模式
常量字節(jié)數(shù)字模式[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, // 一個(gè)
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;
布爾增量=真;
無效設(shè)置(){
// 把你的設(shè)置代碼放在這里,運(yùn)行一次:
// 設(shè)置串口為 115200
序列號(hào).開始(115200);
延遲(1000);
// 將 74HC595 控制引腳設(shè)置為輸出
pinMode(latchPin,輸出);//74HC595的ST_CP
pinMode(clkPin,輸出);//74HC595的SH_CP
pinMode(dtPin,輸出);//74HC595的DS
}
無效循環(huán)(){
// 把你的主要代碼放在這里,重復(fù)運(yùn)行:
int dispDigit1=dispVal/10;
int dispDigit2=dispVal%10;
如果(增量==真){
printf("%d%d.\n", dispDigit1,dispDigit2);
數(shù)字寫入(latchPin,低);
如果(普通陰極 == 真){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (數(shù)字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
}別的{
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16])); // 1. (數(shù)字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
顯示值 += 1;
如果(dispVal == 99){
增量=假;
}
}別的{
printf("%d%d.\n", dispDigit1,dispDigit2);
數(shù)字寫入(latchPin,低);
如果(普通陰極 == 真){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]); // 1. (數(shù)字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
}別的{
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16])); // 1. (數(shù)字+DP)
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
顯示值-= 1;
如果(dispVal == 0){
增量=真;
}
}
延遲(250);
}
-
顯示器
+關(guān)注
關(guān)注
21文章
4970瀏覽量
139931 -
74HC595
+關(guān)注
關(guān)注
7文章
191瀏覽量
30844 -
ESP32
+關(guān)注
關(guān)注
18文章
971瀏覽量
17204
發(fā)布評論請先 登錄
相關(guān)推薦
評論