一般我們稱為七段LED顯示器的元件如果把小數點也算進去的話,其實是有8個段位,或者說要用到8顆LED,這樣的硬體電路和前面的範例來比較是大同小異。七段LED顯示器為了節省硬體腳位的數目,會把這8顆LED的一端並接在一起,如果把陽極(Anode)並接在一起的稱為共陽式(CA:Common Anode),反之則稱為共陰式(CC:Common Cathode)。【圖4、5】所示是一位數七段LED顯示器的結構與接腳段位名稱,一般來說從外觀上是無法判斷是那一種接法,必須看型號或者實際去測量才行,本次實習所使用的是屬於共陽式的接法。
圖4、5 一位數七段LED顯示器結構與段位名稱及電路接線
【圖4、6】是共陽式七段LED顯示器輸入段位值與顯示數字的對應表,其中輸入的段位值為邏輯’0’時會令對應的LED點亮,由這些點亮的段位便可構成我們所要顯示的數字。例如要顯示數字’1’時,只須點亮段位b、c即可。
圖4、6 共陽式七段LED顯示器示輸入段位值與顯示數字對應表
◎功能與動作說明:
1、使用ESP8266的8隻GPIO輸出腳控制一顆共陽式的七段LED顯示器,此LED顯示器會依序顯示數字0~9及A~F共16個字型。
2、每個字顯示的時間為1秒,當到達最後的數字’F’時,會重新由’0’開始顯示。
◎ 電路圖:
圖4、7 七段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行)是依照【圖4、6】的輸入段位值與顯示數字對應表去建立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
沒有留言:
張貼留言