mBlock & Arduino(17)四位數七段顯示器


在〈mBlock & Arduino(7)七段顯示器之 HELLO!〉中談過七段顯示器的原理與運用,如果你需要多個位數,基本上可以自行連接多個七段顯示器,只是七段顯示器需要的腳位很多啊?Arduino 腳位不夠用怎麼辦?

兩位數七段顯示器

如果想要自行接線,設計出兩位數七段顯示器,若使用共陰極七段顯示器,可以如下設置電路:

兩位數七段顯示器

這樣的電路,可以使用 10 個腳位,來控制兩個七段顯示器,其中 D3 到 D10,可分別控制七段顯示器上的 LED,而 D13 與 D12,可控制左邊與右邊的七段顯示器哪個要顯示,如果 D13 為高電位而 D12 為低電位,那麼右邊的七段顯示器會依 D3 到 D10 哪些腳位為高電位而顯示,如果 D13 為低電位而 D12 為高電位,那麼左邊的七段顯示器會依 D3 到 D10 哪些腳位為高電位而顯示。

這樣不是一次只能顯示一個七段顯示器嗎?沒錯!不過,只要 D13 與 D12 切換速度夠快,那麼就會像是同時點亮兩個七段顯示器!類似地,你可以銜接三位數、四位數等七段顯示器!

四位數七段顯示器

如果不想要自行接線路,那麼市面上有已經銜接好的二合一、四合一等各種位數的七段顯示器,以四合一的七段顯示器為例,由於每個七段顯示器會需要 8 個腳位控制其上的 LED,再加上各 4 個共陰或共陽腳位,因此基本上會有 12 個腳位,當然,如果還要附帶有「:」控制等腳位的話,就會有 12 個腳位以上。

我手邊這個四位數七段顯示器,就是基本的 12 腳位:

四位數七段顯示器

依上圖來看的話,下方有六個腳位,上方有六個腳位,最左下方的腳位編號是 1,依逆時針依序編號至 6,然後右上方是 7,依逆時針編號至左上方的 12:

四位數七段顯示器

當然,最重要的,是知道這些腳位,分別是控制哪個 LED,以及哪些腳位控制哪個七段顯示器,這在上圖是使用 0 到 3 以及 A 到 H(DP) 表示,0 表示最右邊的七段顯示器, 3 表示最左邊的七段顯示器,例如,當 3 為低電位而 0、1、2 為高電位時,那麼是控制最左邊的七段顯示器,至於 A 到 H(DP),如下圖表示:

四位數七段顯示器

因此,如果想要運用這個四位數七段顯示器,可以如下銜接電路:

四位數七段顯示器

使用 mBlock 控制七段顯示器

銜接好電路之後,那麼就可以寫程式來控制了,基本上就是用迴圈來逐個控制與顯示,我們稍微改寫一下〈mBlock & Arduino(7)七段顯示器之 HELLO!〉中的範例,以達到控制之目的:

四位數七段顯示器

其中 numbers 的內容一樣是:

四位數七段顯示器

執行程式之後的效果是 …

影片示範

嗯?由於透過 mBlock 控制 Arduino 會有速度上的限制,因此,你看到的是四個數字輪流閃動,而不是看起來一起亮,不過,這當作瞭解四位數七段顯示器運作原理,倒是不錯的方式,如果想要看起來有同時顯示的效果,那麼可以在 Arduino IDE 中撰寫如下的程式,其運作原理與上面的程式是類似的:

#include <Arduino.h>

void set7Seg(int number, int pos);

const int pinState[9][7] = {
  {0, 1, 1, 0, 0, 0, 0}, // 1
  {1, 1, 0, 1, 1, 0, 1}, // 2
  {1, 1, 1, 1, 1, 0, 1}, // 3
  {0, 1, 1, 0, 0, 1, 1}, // 4
  {1, 0, 1, 1, 0, 1, 1}, // 5
  {1, 0, 1, 1, 1, 1, 1}, // 6
  {1, 1, 1, 0, 0, 0, 0}, // 7
  {1, 1, 1, 1, 1, 1, 1}, // 8
  {1, 1, 1, 1, 1, 1, 0}  // 9
};

void setup() {
    for(int i = 3; i < 14; i++) {
        pinMode(i, OUTPUT);
    } 
}

void loop() {
    set7Seg(8, 4); 
    set7Seg(7, 3); 
    set7Seg(6, 2);
    set7Seg(5, 1);
}

void set7Seg(int number, int pos) {
    for(int i = 10; i < 14; i++) {
        digitalWrite(i, 1);
    }

    for(int i = 0;i < 7;i++) {
        digitalWrite(i + 3, pinState[number - 1][i]);
    }

    digitalWrite(pos + 9, 0);
    delay(5);
}

set7Seg 中需要一點 delay,這樣切換速度才不會太快,LED 看起來才會夠亮,將程式上傳至 Arduino 板子,效果會是這樣的 …

影片示範