8-1 功能簡介 8-4 實驗成果 8-2 電路說明 8-5 延伸應用與練習 8-3 程式設計 第8章 七段顯示器 8-1 功能簡介 8-4 實驗成果 8-2 電路說明 8-5 延伸應用與練習 8-3 程式設計
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 電路說明 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() setup():主要設定seg[] 陣列中的數位腳之電氣特性為輸出,包含D11 ~ D5。 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 程式設計 陣列宣告:陣列宣告的指令格式如下 其中資料型態應以不超過值域範圍的最小型態來宣告,例如觀察seg7 的元素值均不超過255,故宣告成byte 會比int 節省記憶空間。另外,有預設值的宣告可省略陣列元素個數的宣告,編譯器會幫忙計算,例如:
8-4 實驗成果 確定好本實驗的電路及程式後,即可開始進行編譯程式,以及下載、燒錄、測試的工作;首先請使用USB 傳輸線連接好個人電腦與Arduino Leonardo 板,再按 圖示進行程式的燒錄。 燒錄成功後,應可立即看到七段顯示器開始數數,從0 到9,每隔0.5 秒變化一次,若無法正常顯示,請檢查接線是否正確。
8-5 延伸應用與練習 有了顯示一位數0 ~ 9 的七段顯示器輸出能力後,還有哪些可以延伸應用並練習的呢?以下讓我們來思考一下。 8-5.1 讀入指撥開關數值並顯示的實驗(顯示0 ~ F) 本小節希望完成一個讀入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 延伸應用與練習 讀入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。 從最高位元DIP[0],也就是D13 開始判斷,若為LOW(往上撥)代表指撥開關為邏輯1,所以number=number+8;若為HIGH(往下撥) 代表指撥開關為邏輯0,不需進行任何處理。接著判斷DIP[1](D12),若為LOW,則number= number+4。 接著判斷DIP[2](D3),若為LOW,則number= number+2。 接著判斷DIP[3](D2),若為LOW,則number= number+1。 程式碼如下:
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為資料端;假設顯示器上要顯示 ,其動作流程如下: 首先讓掃描端com1~com4送出0000 的控制訊號,所有電晶體OFF,七段顯示器不顯示。 資料端JP7送出0x5B(請對應表8-1的控制碼),掃描端com1送出1的控制訊號(即Q1導通),此時顯示數字 ,並停留一段時間。 為避免掃描端掃至下一位時造成的顯示殘影現象,掃描端com1送出0的控制訊號,讓七段顯示器不顯示。
8-5 延伸應用與練習 資料端送出0x3F,掃描端com2送出1的控制訊號,Q2導通,此時顯示數字 ,並停留一段時間。 資料端送出0x06,掃描端com3 送出1 的控制訊號,Q3 導通,此時顯示數字 ,並停留一段時間。 掃描端com3 送出0的控制訊號,讓七段顯示器不顯示。 資料端送出0x4F,掃描端com4送出1的控制訊號,Q4導通,此時顯示數字 ,並停留一段時間。 掃描端com4送出0的控制訊號,讓七段顯示器不顯示。 跳至步驟2重複執行。 以上的動作流程,只要掃描的速度夠快,超過人一秒鐘至少需要24個畫面的視覺暫留,就可看到非常穩定的畫面,若掃描速度不夠,會看到閃爍的 畫面。
8-5 延伸應用與練習 根據上述的動作流程,可寫出底下的程式,請對應參考;本程式也加入利用Serial Monitor 改變延遲時間delaytime 的設計,透過不同的delaytime了解多工顯示器的原理,以及延遲時間的影響。
8-5 延伸應用與練習
8-5 延伸應用與練習
8-5 延伸應用與練習
8-5 延伸應用與練習
8-5 延伸應用與練習 將程式燒錄後,因變數delaytime 預設為5(ms),可看到一個很穩定的 顯示畫面。 點選Tools → Serial Monitor,開啟Serial Monitor,接著請在命令列依序輸入要測試的延遲時間數據(單位為ms),並記錄顯示狀態: (1) 10ms 顯示狀態描述: ___________________________ (2) 100ms 顯示狀態描述: __________________________ (3) 1000ms 顯示狀態描述: _________________________ 經測試後應可發現延遲時間增加後,多工顯示的數字閃爍明顯。 請試著修改顯示其它數值,例如「5214」,其顯示的數字是否符合預期。