0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取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 開發(fā)套件 v4.0

7 段顯示器共陰極 - 3 個

74HC595 - 3 個

680R電阻 - 24pcs

5V電源

面包板

很多連接線

帶有 ESP32 編程環(huán)境的 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相連。數據連續(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 段顯示器上完美顯示。由于電線的數量,連接和調試可能會變得很困難,我們在面包板上構建它,它確實按預期工作。

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 段顯示的字母數字模式
常量字節(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);
}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 顯示器
    +關注

    關注

    21

    文章

    4999

    瀏覽量

    140189
  • 74HC595
    +關注

    關注

    7

    文章

    191

    瀏覽量

    30898
  • ESP32
    +關注

    關注

    18

    文章

    971

    瀏覽量

    17431
收藏 人收藏

    評論

    相關推薦

    74HC595的原理

    屏的顯示效果,使用74HC595來驅動發(fā)光二極管。595的使用方法很簡單,在正常使用時SCLR(清除位移緩存)為高電平,G為低電平。從SER每輸入一位數據,串行輸入時鐘SCK上升沿有
    發(fā)表于 10-27 20:56

    如何利用SPI接口實現74HC595的操作

    /****************************現象:通過查詢的方式利用SPI接口實現74HC595的操作,并在數碼上顯示
    發(fā)表于 11-24 06:03

    利用SPI接口實現74HC595的操作

    /****************************現象:通過查詢的方式利用SPI接口實現74HC595的操作,并在數碼上顯示
    發(fā)表于 11-24 06:46

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

    內部工作原理74HC595時一款漏極開路輸出的CMOS移位寄存,輸出端為可控的三態(tài)輸出,亦能串行輸出控制下一級級聯芯片,其移位時鐘頻率高達25MHz。二、74HC595引腳的簡...
    發(fā)表于 11-29 08:27

    74HC595怎么使用

    一、74HC595使用方法74HC595的數據端Q0--Q7:八位并行輸出端,可以直接控制數碼管的8個。Q7:級聯輸出端。將它接下一個
    發(fā)表于 12-07 06:46

    如何利用兩個74HC595實現三個引腳實現數據的傳送

    74HC595驅動8位選數碼管利用兩個74HC595實現三個引腳實現數據的傳送以下是
    發(fā)表于 12-07 06:57

    如何使用HAL 庫的SPI實現74HC595芯片控制

    使用HAL 庫的SPI實現74HC595芯片控制先簡單看一下原理圖:原理圖是簡單的級聯方式,如圖所示可用三個字節(jié),例如:先寫入第一個字節(jié)0000 0000控制的數據是右邊74HC595芯片所有引腳為
    發(fā)表于 12-07 07:17

    如何實現74HC595驅動數碼管顯示

    ?4、數碼管顯示數碼管驅動電路采用2片74HC595芯片進行IO擴展,僅僅只需3Pin即可驅動需要16位引腳的數碼管。74HC595是一個8位串行輸入、并行輸出的位移緩存。只有對
    發(fā)表于 12-07 07:29

    如何利用CC2530和74HC595實現數碼管動態(tài)顯示數字的效果?

    數碼管的原理是什么?如何利用CC2530和74HC595實現數碼管動態(tài)顯示數字的效果?
    發(fā)表于 01-25 06:43

    基于74hc595和smd電阻的0.8寸7模塊電路

    描述4位0.8寸7模塊電路(74hc595driver)此設計使用 4 個 74hc595 和 32 個 smd 電阻 220ohm
    發(fā)表于 08-12 07:56

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

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

    利用74HC595實現多位LED顯示的新方法

            本文介紹了應用移位寄存芯片74HC595 實現LED 動、靜態(tài)顯示的基本原理。提出了一種用
    發(fā)表于 09-09 08:39 ?349次下載

    74hc573和74hc595有什么不同?該怎樣區(qū)分74hc573和74hc595

    在實際應用電路中74hc573和74hc595都可用,都可實現行掃描,看你電路怎么連接,程序如何編寫。
    的頭像 發(fā)表于 07-27 14:27 ?2.7w次閱讀
    <b class='flag-5'>74hc</b>573和<b class='flag-5'>74hc595</b>有什么不同?該怎樣區(qū)分<b class='flag-5'>74hc</b>573和<b class='flag-5'>74hc595</b>

    任務774HC595的使用方法

    內部工作原理74HC595時一款漏極開路輸出的CMOS移位寄存,輸出端為可控的三態(tài)輸出,亦能串行輸出控制下一級級聯芯片,其移位時鐘頻率高達25MHz。二、74HC595引腳的簡...
    發(fā)表于 11-19 14:51 ?42次下載
    任務<b class='flag-5'>7</b>:<b class='flag-5'>74HC595</b>的使用方法

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

    電子發(fā)燒友網站提供《7屏蔽使用移位寄存74HC595和ULN2003.zip》資料免費下載
    發(fā)表于 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