學習了關於發光二極體(LED)的控制,還有一個值得介紹的就是7段數碼管顯示器,它將7個LED排列成8字形,另外加一個小數點,由不同的燈號組合搭配出0 - 9的數字顯示。基本的7段數碼管只有一位數字,也可以多個組合在一起顯示多位數。
工具/原料
Arduino實驗套件(Arduino UNO控制器,跳線,USB資料線,麵包板)
7段數碼管(共陽) * 1 個
470歐姆直插電阻 * 8個
實驗跳線 * 若干
方法/步驟
準備實驗所用的硬體,如圖所示:
將下列程式複製到Arduino IDE中,如下圖所示:
byte DIGITAL_DISPLAY[10][8] = { //設定0-9數字所對應陣列
{ 1,0,0,0,0,1,0,0 }, // = 0
{ 1,0,0,1,1,1,1,1 }, // = 1
{ 1,1,0,0,1,0,0,0 }, // = 2
{ 1,0,0,0,1,0,1,0 }, // = 3
{ 1,0,0,1,0,0,1,1 }, // = 4
{ 1,0,1,0,0,0,1,0 }, // = 5
{ 1,0,1,0,0,0,0,0 }, // = 6
{ 1,0,0,0,1,1,1,1 }, // = 7
{ 1,0,0,0,0,0,0,0 }, // = 8
{ 1,0,0,0,0,0,1,0 } // = 9
};
void setup() { //設定4-11號數字埠為輸出
for(int i=4;i<=11;i++){
pinMode(i, OUTPUT);
}
}
void loop() {
//0-9數字顯示
for (int k = 0; k < 10; k++) {
int pin = 4;
for (int s = 0; s < 8; s++)
{
digitalWrite(pin, DIGITAL_DISPLAY[k][s]);
pin++;
}
delay(1000);
}
}
如圖所示,僅將 Arduino UNO 控制器使用 USB 資料線連線到電腦,選擇正確的板型(Arduino UNO)、埠號。
點選上傳按鈕,無誤情況下軟體會顯示如下結果,說明程式已經成功上傳到控制器,上傳成功後,斷開 UNO 控制器和電腦的連線,進行實驗電路的搭建。
硬體講解:數碼管顯示器,如下圖所示為7段數碼管顯示器的引腳對應關係、共陰極數碼管和共陽極數碼管的內部連線方式。
其中 a, b, c, d, e, f, g, dp 均為發光二極體,所以我們在電路連線的時候,需要給每個引腳新增一個限流電阻,這就是為什麼本實驗要使用 8 個 470 歐姆電阻。
按照下圖中的電路,進行實驗硬體的連線,數碼管接線詳細說明:
數碼管引腳:a - 連線Arduino UNO D7;
數碼管引腳:b - 連線Arduino UNO D6;
數碼管引腳:c - 連線Arduino UNO D5;
數碼管引腳:d -連線Arduino UNO D11;
數碼管引腳:e -連線Arduino UNO D10;
數碼管引腳:f - 連線Arduino UNO D8;
數碼管引腳:g - 連線Arduino UNO D9;
數碼管引腳:dp - 連線Arduino UNO D4;
使用USB線連線實驗電路和電腦,此處USB線相當於給整個實驗系統供電。硬體連線無誤情況下,實驗效果為數碼管會迴圈顯示數字“0”到數字“9”,除非去掉UNO控制器的供電。數字顯示效果如下圖所示:
程式碼回顧:
1、陣列程式碼:byte DIGITAL_DISPLAY[10][8]:陣列是一種可訪問的變數的集合。
以下為幾種建立陣列的方法:
myInts [6];
myPins [] = {2,4,8,3,6};
mySensVals [6] = {2,4,-8,3,2};
char message[6] = "hello";
宣告一個未初始化陣列,例如:myPins。
在myPins中,聲明瞭一個沒有明確大小的陣列。編譯器將會計算元素的大小,並建立一個適當大小的陣列。
當然也可以初始化陣列的大小,例如在mySensVals中,注意,當宣告一個char型別的陣列時,初始化的大小必須大於元素的個數,以容納所需的空字元。
訪問陣列:
陣列是從零開始索引的,也就說,上面所提到的陣列初始化,陣列第一個元素是為索引0,因此:
mySensVals [0] == 2,mySensVals [1] == 4,依此類推 。
這也意味著,在包含十個元素的陣列中,索引 9 是最後一個元素。因此,
int myArray[10] = {9,3,2,4,3,2,7,8,9,11}; // myArray[9]的數值為11
myArray[10] 索引是無效的,它將會是任意的隨機資訊(記憶體地址)
若訪問的資料超出陣列的末尾(即索引數大於你宣告的陣列的大小 - 1),則將從其他記憶體中讀取資料。從這些地方讀取的資料,除了產生無效的資料外,沒有任何作用。
指定一個數組的值:
mySensVals [0] = 10;
從陣列中訪問一個值:
X = mySensVals [4];
陣列和迴圈
陣列往往在for迴圈中進行操作,迴圈計數器可用於訪問每個陣列元素。
例如:將陣列中的元素通過串列埠列印
int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]); }
2、for (int k = 0; k < 10; k++):迴圈語句
for迴圈開頭有3個部分:
(初始化;條件;增量計數){ //語句 }
“初始化”只在迴圈開始執行一次。每次迴圈,都會檢測一次條件;如果條件為真,則執行語句和“增量計數”,之後再檢測條件。當條件為假時,迴圈終止。
程式碼位置如圖所示:
為了方便大家實驗,防止在複製程式碼的時候出現錯誤,特將程式碼和電路圖
Fritzing原始檔上傳至網盤供大家下載學習。下載地址:
開啟連結後,如圖所示,點選下載即可
注意事項
注意本文中使用的數碼管為共陽極數碼管,若使用共陰數碼管則顯示結果將不正確。
您在試驗過程中遇到的問題,或是對我寫的有什麼建議,都可以給我留言,我會及時的給大家回覆。