本文旨在補充《超圖解Arduino互動設計入門》第7章「序列連接七段顯示器」。74HC595具有一個串聯輸出腳位(第9腳),將它接在下一個74HC595的序列輸入腳,即可串聯成一組多重並列輸出埠。
串聯在一起的74HC595,就像相連的生產線,自前一條生產線推移出來的物品,會接續出現在下一條生產線:
底下是書本7-14頁的Arduino接74HC595七段顯示器麵包板電路圖:
所有串聯的74HC595的序列時脈(第11腳)和暫存器時脈線(第12腳),都要接在一起,才能同步運作,像這樣:
在不改變書本「動手做7-2」程式碼的情況下測試上面的電路:第一秒鐘,七段顯示器A將顯示“0”,七段顯示器B沒有顯示;第二秒鐘,第二個74HC595將接收從前一個IC的序列資料,在七段顯示器B顯示0,而顯示器A則呈現1…
若要在兩個顯示器上分別呈現不同的數字,需要一次移入16位元的資料,再開啟閘門。
底下的Arduino範例程式定義兩個陣列,分別叫做LED_A(此即原範例程式的LEDs)和LED_B。重點在於,每一次迴圈(loop)執行時,程式都要先推入“LED_B”,再送入“LED_A”:
// 修改自7-13頁「動手做7-2」的序列連接七段顯示器程式 const byte dataPin = 2; // 74HC595 序列腳接「數位 2」 const byte latchPin = 3; // 74HC595 暫存器時脈腳接「數位 3」 const byte clockPin = 4; // 74HC595 序列時脈腳接「數位 4」 byte index = 0; // 七段顯示器的數字索引 const byte LED_A[10] = { // 記錄0~9的七段數字 B01111110, B00110000, B01101101, B01111001, B00110011, B01011011, B01011111, B01110000, B01111111, B01110011 }; const byte LED_B[10] = { // 記錄9~0的七段數字 B01110011, B01111111, B01110000, B01011111, B01011011, B00110011, B01111001, B01101101, B00110000, B01111110 }; void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { digitalWrite(latchPin, LOW); // 關上閘門 // 先推入「陣列B」 shiftOut(dataPin, clockPin, LSBFIRST, LED_B[index]); // 再推入「陣列A」 shiftOut(dataPin, clockPin, LSBFIRST, LED_A[index]); digitalWrite(latchPin, HIGH); // 開啟閘門 delay(1000); // 暫停一秒 index ++; if (index == 10) { index = 0; } }
測試執行上面的程式,第一個七段顯示器將逐秒顯示0~9,第二個顯示器則依序顯示9~0: