第 8 章 七段顯示
器
8-1 功能簡介
• 七段顯示器是由七顆 LED 組合七段而成的數字型顯示器,只要 組合讓不同段的 LED 亮,即可顯示出不同的數字,甚至一些簡 單的文字。
• 本章實驗的功能為使用 Arduino 控制板的 I/O 來驅動七段 顯示器,使七段顯示器每隔 0.5 秒依序顯示出 0 ~ 9 的數 字,並不斷重複變化。
• 本實驗的系統方塊圖如圖 8-1 所示。
8-2 電路說明
• 七段顯示器( seven-segment display )為常用的數字顯示元件,
其外觀如圖 8-2(b) 所示;
• 七段顯示器內部結構是由 8 個 LED (發光二極體)所組成,有 七段筆畫與一個小數點,依順時針方向排列為
a 、 b 、 c 、 d 、 e 、 f 、 g 與 dp 等 8 個 LED ,如圖 8-2(a) 所 示。
• 圖 8-2(a) 標示了七段顯示器的各段名稱與腳位,可用來顯示數 字 0 ~ 9 及英文字 A 、 b 、 C 、 d 、 E 、 F 。
8-2 電路說明
七段顯示器依結構可分為共陽七段與共陰七段兩種:內部所有 LED 陽極接在共同端腳位( com )者,為共陽七段顯示器,如圖 8- 3(a) 所示;內部所有 LED 陰極接在 com 者,則為共陰七段顯 示器,如圖 8-3(b) 所示。
8-2 電路說明
• 本章實驗採用共陰七段顯示器,只要共同端點( com )上接地
,對應的腳位上送高準位,即可使對應的各段 LED 亮
• 圖 8-4 為七段顯示器上要呈現的數字,則其對應的共陰七段 顯示器控制碼如表 8-1 所示,以顯示數字 為例,只有 g 段 不亮,其餘要亮,故 g ~ a 段的顯示控制碼為 0111111 , 換成 16 進制為 0x3F 。( C 語言中 0x 代表 16 進制, 0b 代表 2 進制)
8-2 電路說明
8-2 電路說明
8-2 電路說明
8-2 電路說明
實驗時請確認圖 8-2(a) 上七段顯示器的腳位,接錯會出現亂碼
;另外本實驗採用共陰七段顯示器, com 端請接地。
在此提供麵包板及 Arminno 多功能實驗板兩種接線圖供選擇,請 依手邊有的設備狀況進行實驗。
1. 使用麵包板
圖 8-6 所示為使用麵包板進行七段顯示器的參考接線電路,可 將 ArduinoLeonardo 板固定在一般的麵包板上方便接線,由於 七段顯示器的腳位非 a ~ g 的順序,接線會有些交錯,請注意 不要接錯;另外限流電阻 330Ω 不可省略,請按圖配線:
8-2 電路說明
(1)Arduino 的 GND 腳接 至麵包板上橫向導通的藍 色線,並接至七段顯示器 的 com 端。
(2) 本實驗使用 USB 提供 的
5V ,電源不需外加。
8-2 電路說明
2. 使用 Arminno 多功能實驗板
圖 8-7 所示為使用 Arminno 多功能實驗板的接線情況,
其中:
① 實驗板與 Arduino 板的連接均採用杜邦排線。
② 使用 2pins 的排線連接 Arduino 板上的 5V 及 GND 接至實驗板 3V3 及 GND 的電源端。
③ 使用 1pin 的排線連接 JP8 的 com4 至 5V 端,指定使 用七段顯示器的個位數。
④ 連接 Arduino 板上的 D11 ~ D5 至實驗板 7- SEGMENT ×4 區塊的 JP7 (對應 a ~ g )。
8-3 程式設計
接下來要進行程式的撰寫,由於表 8-1 已明確標示了共陰七段 顯示器控制碼,電路也接妥 Arduino 板的 D11 ~ D5 對應至 七段的 a ~ g ,故本次的實驗非常適合使用查表法,也就是使用 陣列取值的方式,再呼叫自訂的 OutPort() 副程式,逐一將值 送至指定的輸出即可。
1. setup() 、 loop()
1) setup() :主要設定 seg[] 陣列中的數位腳之電氣特性 為輸出,包含 D11 ~ D5 。
2) loop() :依序取出 0 ~ 9 七段顯示器編碼陣列 TAB[]
的資料,然後呼叫 OutPort() 副程式進行顯示的工作。
8-3 程式設計
8-3 程式設計
2. OutPort() 副程式
此副程式的主要目的是將傳入值 dat 送至指定的腳位輸出,
腳位由程式中的 seg7[]={11, 10, 9, 8, 7, 6, 5} 定 義,其中 seg7[0]=11 對應七段顯示器的 a
段, seg7[1]=10 對應 b 段,其餘類推;要將傳入值 dat 送至指定的腳位輸出,可使用十進制轉二進制的方式,從最低 位元逐一將值送出,流程如下:
(1) 取出 dat 除 2 的餘數。
(2) 若餘數為 1 ,則輸出高準位,否則輸出低準位。
(3) 接著處理下一位元,故取 dat=dat/2 。 (4) 重複動作 (1) ,共做 7 次。
圖 8-9 為 dat=94 處理後對應 seg7[] 的操作範例,此範例 顯示 d 。
8-3 程式設計
8-3 程式設計
8-3 程式設計
8-3 程式設計
1. 陣列宣告:陣列宣告的指令格式如下
其中資料型態應以不超過值域範圍的最小型態來宣告,例如觀 察 seg7 的元素值均不超過 255 ,故宣告成 byte 會比 int 節省記憶空間。另外,有預設值的宣告可省略陣列元素個數的 宣告,編譯器會幫忙計算,例如:
8-4 實驗成果
• 確定好本實驗的電路及程式後,即可開始進行編譯程式,以及下 載、燒錄、測試的工作;首先請使用 USB 傳輸線連接好個人電 腦與 Arduino Leonardo 板,再按 圖示進行程式的燒 錄。
• 燒錄成功後,應可立即看到七段顯示器開始數數,從 0 到 9 , 每隔 0.5 秒變化一次,若無法正常顯示,請檢查接線是否正確
。
8-5 延伸應用與練習
有了顯示一位數 0 ~ 9 的七段顯示器輸出能力後,還有哪些可 以延伸應用並練習的呢?以下讓我們來思考一下。
8-5.1 讀入指撥開關數值並顯示的實驗(顯示 0 ~ F )
1. 本小節希望完成一個讀入 4 位元指撥開關的數值,並將對應的 16 進制數值顯示在七段顯示器上的實驗,數值包含 0 ~ 9
,以及 A ~ F 。
• 圖 8-10 所示為本小節實驗的電路圖,其中指撥開關的 4 個 數位腳分別接至 D13 、 D12 、 D3 、 D2 ,最高位元 MSB 為 D13 。
8-5 延伸應用與練習
8-5 延伸應用與練習
2. 4 位元指撥開關數值除了 0 ~ 9 以外,還包含撥 1010 以上應
顯示的字母,其字碼及對應的顯示控制碼條列如表 8-3 所 示。
8-5 延伸應用與練習
1. 指撥開關的設定:
由於指撥開關用到 4 個數位腳,且未連接提升電阻,因此本小節 需用到使用內建提升電阻的設定,同樣是用設定 pin 腳電氣模式 的指令 pinMode ,不過模式要使用 INPUT_PULLUP 。
8-5 延伸應用與練習
2. 讀入 4 位元指撥開關狀態,轉成十進制數值:轉換的方法其 實就是進行二進制轉十進制,首先宣告轉換後的十進制數值 number=0 ,並宣告加權值陣列 Weight={ 8,4,2,1 } ,以 及指撥開關輸入腳位的陣列 DIP ={13,12,3,2 } ,然後進 行底下的流程即可,例如指撥開關撥上上下下,代表邏輯 1100
, number=1×23+1×22+0×21+0×20=8+4=12 。
1) 從最高位元 DIP[0] ,也就是 D13 開始判斷,若為 LOW
(往上撥)代表指撥開關為邏輯 1 ,所以
number=number+8 ;若為 HIGH (往下撥)
2) 代表指撥開關為邏輯 0 ,不需進行任何處理。接著判斷 DIP[1] ( D12 ),若為 LOW ,則 number= number+4
。
3) 接著判斷 DIP[2] ( D3 ),若為 LOW ,則 number=
number+2 。
4) 接著判斷 DIP[3] ( D2 ),若為 LOW ,則 number=
number+1 。 5) 程式碼如下:
8-5 延伸應用與練習
3. 呼叫 OutPort(number) 副程式,即可顯示指撥開關的 數值。
4. 接著周而復始進行步驟 2. 到 3. 即可。
8-5 延伸應用與練習
8-5 延伸應用與練習
2. Arminno 多功能實驗板的接線情況
圖 8-12 所示為使用 Arminno 多功能實驗板的接線情況
8-5 延伸應用與練習
8-5 延伸應用與練習
8-5 延伸應用與練習
8-5 延伸應用與練習
將程式燒錄後,可調整指撥開關,看看七段顯示器是否有對應 到指撥開關的數值內容顯示。
8-5 延伸應用與練習
Arminno 多功能實驗板上的七段顯示器為四位元的多工顯示 器,因其電路結構與單一顆七段顯示器有點不同,需要特別說 明一下。實驗板上的顯示器由四顆七段顯示器組成,由左而右
,分別為千位數、百位數、十位數及個位數,為簡化接線,每 顆七段顯示器的 a 端接一起、 b 端接一起…以此類推,最後拉 出 a 、 b 、 c 、 d 、 e 、 f 、 g 端至 JP7 ,此為資料端,
如圖 8-13 所示;小數點 dp 及要讓哪一位數亮的控制端 com1 、 com2 、 com3 、 com4 則接至 JP8 ,其中 com1 ~ com4 為掃描端,分別接一個 NPN 電晶體,控制千位數、百 位數、十位數、個位數七段顯示器的亮或滅,掃描端在同一個 時間,只有一個接高準位,亦即每個時間只有一位數會亮。
8-5 延伸應用與練習
8-5 延伸應用與練習
8-5 延伸應用與練習
• Arminno 多功能實驗板上的七段顯示器為四位元的多工顯 示器,因其電路結構與單一顆七段顯示器有點不同,需要特 別說明一下。
• 實驗板上的顯示器由四顆七段顯示器組成,由左而右,分別 為千位數、百位數、十位數及個位數,為簡化接線,每顆七 段顯示器的 a 端接一起、 b 端接一起…以此類推,最後拉 出 a 、 b 、 c 、 d 、 e 、 f 、 g 端至 JP7 ,此為資料端
,如圖 8-13 所示。
• 小數點 dp 及要讓哪一位數亮的控制端
com1 、 com2 、 com3 、 com4 則接至 JP8 ,其中 com1
~ com4 為掃描端,分別接一個 NPN 電晶體,控制千位數
、百位數、十位數、個位數七段顯示器的亮或滅。
• 掃描端在同一個時間,只有一個接高準位,亦即每個時間只 有一位數會亮。
8-5 延伸應用與練習
• 所謂的多工顯示是指利用分時多工的掃描技巧,讓四位元同 時顯示不同數字。
• 一般稱 com1 ~ com4 為掃描端, JP7 的 dp 、 g 、 f
、 e 、 d 、 c 、 b 、 a 為資料端;假設顯示器上要顯示 ,其動作流程如下:
1.首先讓掃描端 com1 ~ com4 送出 0000 的控制訊號,所 有電晶體 OFF ,七段顯示器不顯示。
2.資料端 JP7 送出 0x5B (請對應表 8-1 的控制碼),掃描 端 com1 送出 1 的控制訊號(即 Q1 導通),此時顯示數字 ,並停留一段時間。
3.為避免掃描端掃至下一位時造成的顯示殘影現象,掃描端 com1 送出 0 的控制訊號,讓七段顯示器不顯示。
8-5 延伸應用與練習
4. 資料端送出 0x3F ,掃描端 com2 送出 1 的控制訊號, Q2 導通,此時顯示數字 ,並停留一段時間。
5. 掃描端 com2 送出 0 的控制訊號,讓七段顯示器不顯示。
6. 資料端送出 0x06 ,掃描端 com3 送出 1 的控制訊 號, Q3 導通,此時顯示數字 ,並停留一段時間。
7. 掃描端 com3 送出 0 的控制訊號,讓七段顯示器不顯示。
8. 資料端送出 0x4F ,掃描端 com4 送出 1 的控制訊號, Q4 導通,此時顯示數字 ,並停留一段時間。
9. 掃描端 com4 送出 0 的控制訊號,讓七段顯示器不顯示。
10.跳至步驟 2 重複執行。
• 以上的動作流程,只要掃描的速度夠快,超過人一秒鐘至 少需要 24 個畫面的視覺暫留,就可看到非常穩定的畫面,
若掃描速度不夠,會看到閃爍的 畫面。
8-5 延伸應用與練習
根據上述的動作流程,可寫出底下的程式,請對應參考;本程 式也加入利用 Serial Monitor 改變延遲時間 delaytime 的設計,透過不同的 delaytime 了解多工顯示器的原理,以 及延遲時間的影響。
8-5 延伸應用與練習
8-5 延伸應用與練習
8-5 延伸應用與練習
8-5 延伸應用與練習
8-5 延伸應用與練習
1. 將程式燒錄後,因變數 delaytime 預設為 5 ( ms ),
可看到一個很穩定的 顯示畫面。
2. 點選 Tools → Serial Monitor ,開啟 Serial
Monitor ,接著請在命令列依序輸入要測試的延遲時間數 據(單位為 ms ),並記錄顯示狀態:
(1) 10ms 顯示狀態描述:
___________________________
(2) 100ms 顯示狀態描述:
__________________________
(3) 1000ms 顯示狀態描述:
_________________________
經測試後應可發現延遲時間增加後,多工顯示的數字閃爍 明顯。
3. 請試著修改顯示其它數值,例如「 5214 」,其顯示的數 字是否符合預期。