Arduino筆記(51):7段顯示器LED的應用

過去的實做中沒有對七段顯示器進行深入研究,隨着實做的內容及種類越來越多,沒有用這個常見的元件來進行實做,好像缺少些什麼。接下來的幾篇文章,如何用七段 LED顯示數字,從基本的認識到實際的應用,順便記錄一下實做的過程。
---- 2021.04.05 ----
今天使用 Pico 實作相同的控制七段顯示器倒數計時時,發現所有接腳都沒有接上電阻,其實這是不對的,短時間也許沒問題,但時間一長,可能會燒壞 LED 燈管,找個時間更新一下。
-------------------------

[七段顯示器]

七段顯示器(英語:Seven-segment display)為常用顯示數字的電子元件。因為藉由七個發光二極體以不同組合來顯示數字,所以稱為「七劃管」、「七段數碼管」、「七段顯示器」,由於所有燈管全亮時所表示的是「8」,所以又稱「8字管」、「8字顯示器」。多數七段顯示器還會在右下角附加一個表示小數點的燈管,因此也稱八段管。[維基百科]

七段顯示器在面板儀表中最受歡迎,它可以顯示數值0-9或英文A-F,它的成本低。七段顯示器有兩種類型:共陰極(Common Cathode, CC)與共陽極(Common Anode, CA)。共陽極的七段顯示器的正極(或陽極)為八個發光二極體的共有正極,其他接點為獨立發光二極體的負極(或陰極),使用者只需把正極接電,不同的負極接地就能控制七段顯示器顯示不同的數字。共陰極的七段顯示器與共陽極的只是接駁方法相反而已。兩種類型的內部結構幾乎相同。不同之處在於 LED 和公共端com的極性。下圖左方表格是共陰極的七段顯示器接腳顯示狀態,右方是共陽極的接腳顯示狀態:


七段顯示器內部構造都是由 8 個 LED 發光二極體所組成,其中七個是筆劃,另外一個是小數點,如下圖所示,依順時針方向分別為 A, B, C, D, E, F, G 以及小數點 DP  (decimal point):
七段顯示如何工作呢?要顯示的十進制數字,特定的一組LED被點亮。要打開和關閉顯示器的特定部分,請將相應的引腳設置為HIGH或LOW,就像使用常規LED一樣。例如,要顯示數字 4,我們將需要點亮對應於B, C, F和G的四個LED段。因此,可以使用如上圖所示的七段顯示來顯示從0到9的各種數字和從A到F的字元。


[材料]

• Arduino UNO R3 x 1
• 七段LED顯示器 x 1
• 麵包板 x 1
• 連接線 x n

[接線圖]

Arduino Pin 與 七段顯示器的接腳對應關係:
Pin 1 -> A
Pin 2 -> B
Pin 3 -> C
Pin 4 -> D
Pin 5 -> E
Pin 6 -> F
Pin 7 -> G





[程式一]

依照數字顯示的接腳,設定各腳的顯示狀態,顯示數字0到1:
void setup() {
  // 設定 Pin 1-7 爲 output
for(int x = 1; x < 8; x++) {
  pinMode(x,OUTPUT);
}
}

void loop() {
  // 共陽七段顯示器,若爲共陰極的顯示器,則將原本爲 LOW 改爲 HIGH,HIGH 改成 LOW

  //ZERO
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    delay(1000);
    
  //ONE
    digitalWrite(1, HIGH);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    delay(1000);
    
  //TWO
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    delay(1000);

  //THREE
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    delay(1000);

  //FOUR
    digitalWrite(1, HIGH);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    delay(1000);

  //FIVE
    digitalWrite(1, LOW);
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    delay(1000);
    
  //SIX
    digitalWrite(1, LOW);
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    delay(1000);

  //SEVEN
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    delay(1000);
                
  //EIGHT
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    delay(1000);
    
  //NINE
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    delay(1000);
  } 

[程式二]

利用八位元Bit運算方式來控制顯示LED的明滅,結果會跟[程式一]一樣,可是明顯程式短很多:
int i;
int j;
const byte num[10]={
    B11000000,  //0
    B11111001,  //1
    B10100100,  //2
    B10110000,  //3
    B10011001,  //4
    B10010010,  //5
    B10000010,  //6
    B11111000,  //7    
    B10000000,  //8
    B10010000   //9    
};
const int seg[]={2,3,4,5,6,7,8,9};  //abcdefgp
void setup() 
{ 
  for(i=0;i<8;i++)
    pinMode(seg[i],OUTPUT);
}
void loop() 
{
  for(i=0;i<10;i++)
  {
    for(j=0;j<8;j++)
    {  
      if(bitRead(num[i],j))
        digitalWrite(seg[j],HIGH);
      else
        digitalWrite(seg[j],LOW);        
    }
  delay(1000);    
  } 
}

[實作結果]



[參考資料] 

Post a Comment

較新的 較舊