2020年5月23日 星期六

四.2 七段LED顯示器數字顯示實習


一般我們稱為七段LED顯示器的元件如果把小數點也算進去的話其實是有8個段位或者說要用到8顆LED這樣的硬體電路和前面的範例來比較是大同小異七段LED顯示器為了節省硬體腳位的數目會把這8顆LED的一端並接在一起如果把陽極(Anode)並接在一起的稱為共陽式(CACommon Anode)反之則稱為共陰式(CCCommon Cathode)圖4】所示是一位數七段LED顯示器的結構與接腳段位名稱一般來說從外觀上是無法判斷是那一種接法必須看型號或者實際去測量才行本次實習所使用的是屬於共陽式的接法


圖45 一位數七段LED顯示器結構與段位名稱及電路接線


【圖46】是共陽式七段LED顯示器輸入段位值與顯示數字的對應表,其中輸入的段位值為邏輯’0’時會令對應的LED點亮,由這些點亮的段位便可構成我們所要顯示的數字。例如要顯示數字’1’時,只須點亮段位bc即可

圖46 共陽式七段LED顯示器示輸入段位值與顯示數字對應表


功能與動作說明

1使用ESP8266的8隻GPIO輸出腳控制一顆共陽式的七段LED顯示器LED顯示器會依序顯示數字0~9及A~F共16個字型

2每個字顯示的時間為1秒當到達最後的數字’F’時會重新由’0’開始顯示


電路圖

圖47 七段LED顯示器麵包板接線與電路圖


程式說明與列表

由於和前面的範例程式一樣使用了8隻IO腳位,所以2~8行的程式直接沿用了前面的程式,其中的2、3行設定了輸出腳與七段LED顯示器段位間的關係


2 const byte  segPin[]={16,5,4,0,2,14,12,13};  

3 //   對應的段位   a, b, c, d, e, f, g, dp


至於主體迴圈程式(10~17行)則只有一個簡單的”for()”迴圈結構,這個迴圈的次數為16(從0~15),先以迴圈值當作引數呼叫七段LED顯示器顯示副程式「Seg7_Display()」後,再延遲1秒,便結束整個程式,因此這個範例程式的重心在「Seg7_Display()」這個副程式上。

「Seg7_Display(byte number)」這個副程式(20~38行)是一個不回傳值的副程式,使用到一個引數(number),這個引數便是要顯示的數字號碼;程式前面幾行(24~30行)是依照【圖46】的輸入段位值與顯示數字對應表去建立0~15這些數字的輸出二進值陣列”segNum[]”,這個陣列內部元素的次序便是該順序的七段LED顯示值,因此我們要顯示那一個數字,只要以該數字當作這個陣列的查表引數,便可得到該字型的輸出顯示值,例如要取得數字’8’的七段LED顯示值,只要使用”segNum[8]”這樣的語法,便可得到數字’8’的輸出顯示值” B10000000”。

這個副程式的主體同樣也是一個簡單的”for()”迴圈結構,其迴圈的次數為8,在此先用”segNum[number]”這樣的語法取得number這個數字的七段LED顯示值後,再依序測試這個位元組(byte)的8個位元值(bit)是’0’或’1’,然後以查表法從”segPin[]”這個輸出腳陣列中找出對應的輸出腳位送出測試的結果這樣便可以把引數”number”這個數字顯示在 七段LED顯示器上。


    for(byte j=0;j<8;j++)     { 

      if(bitRead(segNum[number],j))   // 測試選擇到的數字段位值是否為'1'?

        digitalWrite(segPin[j],1);  // 若是則對應的段位腳設定輸出'1'

      else

        digitalWrite(segPin[j],0);  // 反之則對應的段位腳設定輸出'0'

    }


以下是完整的程式列表:

 

// 設定七段LED顯示器在ESP8266上使用的接腳編號

const byte  segPin[]={16,5,4,0,2,14,12,13};  

//   對應的段位   a, b, c, d, e, f, g, dp

void setup() {

  // 將 ESP8266 上所使用到的七段LED接腳以for()迴圈的方式都設定為輸出:

  for(byte i=0;i<8;i++)

    pinMode(segPin[i],OUTPUT);

}

 

void loop() {

  // 以for()迴圈的方式將16個數字顯示在七段LED顯示器上:

  for(byte i=0;i<16;i++)

  {

    Seg7_Display(i);

    delay(1000);                    // 等候1秒

  }

}

 

// 七段LED顯示器數字顯示副程式:

void  Seg7_Display(byte number)

{    

  // 共陽式七段LED顯示器的數字段位陣列值: 0/亮 1/滅

         // 數字 0~3

  const byte  segNum[]={ B11000000,B11111001,B10100100,B10110000,    

           // 數字 4~7

                       B10011001,B10010010,B10000010,B11111000,                                 // 數字 8~b

B10000000,B10010000,B10001000,B10000011,

                  // 數字 C~F

                B11000110,B10100001,B10000110,B10001110 };

                   // 將8個數字段位值取出後顯示在對應的輸出段位腳上:

    for(byte j=0;j<8;j++)     { 

      if(bitRead(segNum[number],j))   // 測試選擇到的數字段位值是否為'1'?

        digitalWrite(segPin[j],1);  // 若是則對應的段位腳設定輸出'1'

      else

        digitalWrite(segPin[j],0);  // 反之則對應的段位腳設定輸出'0'

    }

}   // Seg7_Display副程式結束    



程式名稱led8_seg2.ino


沒有留言:

張貼留言