[實用小物] Four Digits Seven Segment Display

Morgan Ting
閱益如美
Published in
8 min readJan 17, 2021

--

Photo by Thalia Ruiz on Unsplash

七段顯示器是常見的顯示裝置之一具有結構簡單且易於控制等特點。延續上一篇文章本次將進一步介紹四位數七段顯示器的原理及操作方式。

使用工具 / 材料

  1. Arduino UNO *1
  2. 四位數共陰極七段顯示器 *1
  3. 220Ω 電阻 *8

四位數七段顯示器的結構

單一位數七段顯示器在操作上只需要注意外加電壓大小以及限流電阻的選用,如果更進一步想要顯示2位數甚至多位數呢 ? 解方就是多拿幾個模組來湊數就是了也沒什麼高明手段,但是這樣一個一個兜電路實在太複雜所以聰明的廠商就把2個位數乃至於多位數的七段顯示器做成一個模組這樣使用者就不用將線路接到昏天暗地了。這時可能會想到一個單一位數模組有A ~ G 及Dp 且一個共同腳位所以總共有9支腳位,那2個位數會是兩倍總共18支腳位,去哪兒找這麼多支腳位的驅動 IC 或微處理器呢 ? 這方法可行不通。

多位數七段顯示器內部 A ~ G 與 Dp 腳位都是接在一起的不同的是把共同腳位分出來。

上圖是一個共陰極四位數七段顯示器接線圖,我們可以看到四個位數的 LED 燈分別連接在一起,例如A1、A2、A3、A4接在一起其他腳位也依法泡製,如此一來就可以省下大量腳位的接線了。

七段顯示器的操作

前面談到四位數七段顯示器結構,那麼該如何顯示呢 ? 方法就是四個位數輪流顯示,例如當GPIO送進來數字的編碼如果想要顯示在第一個位數那就把 DIG1 腳位接低電位,這樣七段顯示器模組的第一個位數就會顯示數字了,同樣的動作依序重複進行就可以顯示四個位數了。這裡又有另一項考量,該顯示多久再換下一位數顯示呢 ? 這就要考慮人眼的視覺暫留時間,查閱了資料得知人眼的視神經反應速度約略為 1/16 秒也就是 62.5 毫秒,所以只要將輪流顯示的時間小於眼睛的反應時間這樣我們看起來就好像多個數字同時顯示一樣了。

當顯示的數字越多那麼輪流顯示的速度就要越快,我們常用 1 毫秒作為掃描時間也就是每隔 1毫秒就輪到下一位數顯示,這樣四個位數總共耗費 4 毫秒遠低於眼睛反應時間。

附帶一提,掃描時間也不可以一昧求快若是太快則七段顯示器顯示的亮度會暗暗的,另外要顯示下一個數字時先把當前數字清掉可以避免殘影。

以共陰極四位數七段顯示器為例,操作步驟:

  1. GPIO 送出數字編碼給顯示七段顯示器模組。
  2. Digit 1 腳位拉低電位。此時會看到顯示數字。
  3. 等 1 毫秒。
  4. Digit 1 腳位拉高電位。目的是把當前顯示關閉避免造成殘影。
  5. 重複上述步驟顯示 Digit 2、Digit 3與Digit 4。

模組上的接線

七段顯示器真值表

實驗

本次實驗使用四位數共陰極七段顯示器,由程式每隔0.5秒鐘依序更新數值 0 ~ 9999 並重複循環。

數字的顯示利用查表方式將對應的數值透過 Arduino UNO 的 PORTD ( 數位腳位 0 ~ 7 ) 顯示。

四位數七段顯示器的 Digit_1 ~ Digit_4 分別連接到 Arduino UNO 的 PORTC[0:3] ( 類比腳位 0 ~ 3 ),做為每一位數的掃描控制,依序由 Digit_1 至 Digit_4 輪流點亮顯示器。

上傳程式前可以先把連接在數位腳位0 ( Rx ) 與數位腳位1 ( Tx ) 上的單芯線或杜邦線拆下,避免上傳程式產生錯誤。

接線圖

數字編碼

我們常使用查表的方式配合七段顯示器來顯示數字或符號,這當中就需要先將數字進行編碼而該編碼取決於電路的連接方式,全依使用者自行運用及定義。

下表為本次實驗的數字編碼。

實驗結果

程式啟動後四位數七段顯示器最右邊的數字開始由1往上增值,每隔 0.5 秒增加1。程式中用了一個延遲函數等待 1 ms ,這個1毫秒也用來當作一個基準時間並利用變數來計數延遲多久後才進行下一步動作。

程式碼

程式說明

  1. void pin_setup(void) 用來定義 I/O Port 資料方向,由於目的是驅動七段顯示器因此 PORTC 與 PORTD 皆設定成輸出。
  2. void LED_TEST(void) 用來測試共陰極七段顯示器是否正常運作,PORTD 連接七段顯示器的 a ~ g 及 dp. 因此要點亮所有 LED 燈就要全部輸出高電位,然而要點亮 LED 燈還需要將共同腳位設為低電位如此才會產生電位差,所以連接七段顯示器共同腳位的 PORTC要輸出低電位 ( 我們只用到 PORTC[3:0] ),完成上述兩個動作則所有的LED 燈都會亮。等待 1 秒鐘後 PORTD 輸出設為低電位 LED 燈全滅。
  3. Int main() 進入主程式後首先分別呼叫 pin_setup(void) 與 LED_TEST(void) 函數定義資料方向以及測試七段顯示器,宣告陣列 disp[] 用來儲存千、百、十、個位數等 4 個位數,delay_time 用來計數經過了多久時間,index 則是用來作為陣列變數的索引值。
  4. While(1) 重複迴圈中,一開始 PORTC = 0x0F 表示對七段顯示器的共同腳設為高電位,因為我們採用共陰極七段顯示器因此當共同腳被設為高電位時 LED 燈就不亮了,而 PORTD = disp[index] 此時的索引值 index 為零因此 PORTD 內容被指定為 disp[0],而disp[0] 用來儲存千位數然而目前還沒有數值因此是零,PORTC = digit_tab[index] 用來依序點亮四個位數,此時索引值 index 為零因此查表格 digit_tab[0] 是0x0E 也就是 0x00001110 表示 PORTC0 是低電位所以連接到 PORTC0 的顯示器第一位數共陰腳呈現低電位,顯示器的第一位數即接通顯示「0」字樣。程式往下進行,index ++ 將索引值增加1表示下一步要顯示第二位數,由於顯示器只有四位數因此要防止索引值無限制增加,必須判斷當索引值大於3時就歸零。_delay_ms( Scan_time ) 因為 Scan_time 設為 1 因此會延遲 1毫秒,delay_time 則在延遲之後增加1 表示時間經過了 1 毫秒。接下來的小段程式執行前會先判斷變數 delay_time 是否大於變數 Refresh_time,我們事先指定了 Refresh_time = 500 ,因此必須累增到 500 毫秒時才會執行此段程式,如果還未到 500 毫秒則迴圈又重新開始換成顯示七段顯示器的第二位數,依此類推按照 index順序依序顯示四位數的數字。後面一小段程式每隔 500 毫秒才會執行,目的是用來做計數值累增並分別將計數值的千、百、十、個位數指定給陣列變數 disp[] ,disp[]的內容則是利用查表的方式給予數字編碼值,該數值則會在迴圈重頭開始時被顯示在七段顯示器。

總結

四位數七段顯示器的操作大致可整理出幾項重點。

  1. 七段顯示器本質上是 LED 燈組成,操作七段顯示器等同於操作 LED 燈。
  2. 共陽極與共陰極驅動方式相反,須確定屬於哪一類。
  3. 顯示數字常使用查表的方式來指定數字的編碼,編碼內容依硬體接線而異。
  4. 多位數七段顯示器有2項時間要控制:掃描時間,更新時間。
  5. 掃描時間太快會讓顯示黯淡太慢會閃爍。1 ms 是不錯的選擇。
  6. 更新時間取決於需求,每更新一次數字顯示變動一次。
感謝有您
感謝讀者閱讀文章若有任何意見與想法歡迎留言指導讓知識擴大加深,秉持愛學習與愛分享的精神歡迎分享與轉載並請標註來源, 或是加入 Like Coin 帳戶並點擊下方拍手按鈕,免費支持我。謝謝您。

--

--

Morgan Ting
閱益如美

用好奇心探索世界。喜愛學習樂於分享。