所有微控制器都有特定數量的 IO 引腳,但在某些應用中,例如在 7 段顯示器中,我們需要的 GPIO 引腳數量將超過我們的控制器所能提供的數量。對于這種需要多個輸出引腳但微控制器的輸出引腳數量有限的情況,74HC595 移位寄存器將是一個完美的選擇。74HC595是以串行數據為輸入,提供并行輸出的移位寄存器。除了電源管腳,它只需要3個管腳就可以控制多個移位寄存器。
因此,可以使用微控制器單元的三個輸出引腳并級聯兩個或更多移位寄存器以獲得 16 或 24+ 輸出引腳。在這個ESP32 74HC595項目中,我們將僅使用三個引腳連接三個 74HC595,并連接三個 7 段顯示器以僅使用來自 ESP32 的三個引腳查看輸出,ESP32 是一種支持 WiFi/BT 的微控制器設備,是許多基于物聯網的流行選擇項目。
所需組件
ESP32 開發(fā)套件 v4.0
7 段顯示器共陰極 - 3 個
74HC595 - 3 個
680R電阻 - 24pcs
5V電源
面包板
很多連接線
帶有 ESP32 編程環(huán)境的 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相連。數據連續(xù)不斷地串行傳遞到下一個移位寄存器。
使用 74HC595 為 7 段顯示器編程 ESP32
控制所有三個 7 段顯示器的程序可以在頁面底部找到。您可以直接將它用于上面給出的電路圖并進行測試。代碼解釋如下。
在進入程序之前,我們聲明我們正在使用的 7 段顯示器的類型。
此行將識別 ESP32 的 7 段顯示類型。如果使用共陰極,則需要為真,否則,如果使用共陽極,則需要為假。由于取決于共同的陰極狀態(tài),移位寄存器的輸出會發(fā)生變化。
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;
布爾增量=真;
設置代碼在實際循環(huán)應用程序之前完成。在上述代碼中,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
}
在循環(huán)部分或實際應用部分,代碼分為兩部分。首先,數字增加,而在另一部分,數字減少。但是,寫入移位寄存器總是乞求鎖存引腳變?yōu)榈碗娖?,并且在發(fā)送數據后,它需要為高電平。
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);
在此低碼和高碼之間發(fā)送的數據。
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 首先發(fā)送到 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 段顯示的字母數字模式
常量字節(jié)數字模式[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
}
無效循環(huán)(){
// 把你的主要代碼放在這里,重復運行:
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文章
4999瀏覽量
140189 -
74HC595
+關注
關注
7文章
191瀏覽量
30898 -
ESP32
+關注
關注
18文章
971瀏覽量
17431
發(fā)布評論請先 登錄
相關推薦
評論