三態邏輯多工(Charlieplexing,或稱 Tri-State Multiplexing)能夠控制多個 LED,其輸出數量少於 LED 數量。 三態邏輯多工以 Maxim Integrated(現在 Analog Devices Inc )的 Charles Allen 命名,他於 1995 年首次提出了這個想法。
三態邏輯多工使用微控制器的所有三種邏輯狀態以及 LED 的單向導電性來控制矩陣。如果您試圖顯示不同進程的狀態並且不想佔用多個微控制器引腳來執行此操作,這可能會很有用。
下面是一組三態邏輯多工 LED 最簡單的範例。
請注意,在上面的範例中,它使用了一組互補的 LED。根據 LED 如何允許電流沿著一個方向流動並阻止電流沿著另一個方向流動,它允許我們根據輸入/輸出的設定方式來控制兩個 LED。要使用此範例,您可以透過變更引腳的輸出類型來控制具有兩個引腳的兩個 LED。如果您將引腳 2 設為高電位並將引腳 1 設為低電平,則 L1 LED 將會亮起。如果將引腳 1 設定為高電平,將引腳 2 設定為低電平,則 L2 LED 將點亮。
以下是您在 Arduino 中進行設定的方法。
void setup() {
Serial.begin(9600);
}
void loop() {
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,INPUT);
digitalWrite(2,HIGH);
digitalWrite(1,LOW);
delay(1000);
Serial.println("1");
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,INPUT);
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
delay(1000);
Serial.println("2");
}
看著以上這個原理圖,您可能會想:「這有什麼用?我們只用兩個引腳控制兩個 LED。」讓我們看看當我們添加第三個引腳時會發生什麼。
以下是如何設定 3 引腳控制 LED 組。
透過此設定可以看出,您可以用 3 個引腳控制 6 個 LED。若要控制此設定中的 LED,您需要使用微控制器的所有三種狀態。如果您想開啟 L1 LED 而不想開啟其他 LED,則必須將引腳 2 設定為高電平,將引腳 1 設定為低電平,將引腳 3 設定為輸入。必須將引腳 3 設定為輸入的原因是將該引腳置於高阻抗。這基本上將引腳與電路斷開。另外,如果我們將引腳 3 設定為低電平,LED L4 也會亮起。
現在,如果您想開啟 L2 LED,使用者可以將引腳 1 設定為高電平,將引腳 2 設定為低電平,將引腳 3 設定為輸入。再次注意,如果我們沒有將引腳 3 設定為輸入,L4 LED 也會亮起。
然後,使用者可以完成此過程,直到成功按順序點亮每個 LED。
如果您想使用 Arduino 執行此操作,以下是編寫程式碼的一種方法。
void setup() {
Serial.begin(9600);
}
void loop() {
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,INPUT);
digitalWrite(2,HIGH);
digitalWrite(1,LOW);
delay(1000);
Serial.println("1");
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,INPUT);
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
delay(1000);
Serial.println("2");
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);
pinMode(1,INPUT);
digitalWrite(3,HIGH);
digitalWrite(2,LOW);
delay(1000);
Serial.println("3");
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);
pinMode(1,INPUT);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
delay(1000);
Serial.println("4");
pinMode(1,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2,INPUT);
digitalWrite(3,HIGH);
digitalWrite(1,LOW);
delay(1000);
Serial.println("5");
pinMode(1,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2,INPUT);
digitalWrite(1,HIGH);
digitalWrite(3,LOW);
delay(1000);
Serial.println("6");
}
現在我們已經探索了 2 個和 3 個引腳,您可以看到三態邏輯多工如何成為一個有用的工具。讓我們再進行 4 個輸入引腳的設定。
在我們展示 4 個輸入的設定之前,您能猜想我們將能夠控制多少個 LED 嗎?
您可以將要使用的 I/O 數量乘以相同數量的 I/O 減 1 來計算您可以控制多少個可能的 LED。例如,如果我們想使用 4 個 I/O 引腳,我們可以將該數字乘以 3,這樣我們就可以用 4 個 I/O 控制最多 12 個 LED。
以下是如何設定 4 個 I/O 的 LED 組。
請注意,我已對這個連接進行了顏色編碼,以使連接更加清晰。如您所見,透過在原理圖中再增加 1 個引腳,我們可以再增加 6 個 LED。為了控制 LED,此設定的工作方式與 3 引腳相同,但是,在本例中,我們將 2 引腳設定為輸入。以下是逐步執行所有 12 個 LED 的 Arduino 程式碼。
void setup() {
Serial.begin(9600);
}
void loop() {
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
digitalWrite(2, HIGH);
digitalWrite(1, LOW);
delay(1000);
Serial.println("1");
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
digitalWrite(1, HIGH);
digitalWrite(2, LOW);
delay(1000);
Serial.println("2");
pinMode(3, OUTPUT);
pinMode(2, OUTPUT);
pinMode(1, INPUT);
pinMode(4, INPUT);
digitalWrite(3, HIGH);
digitalWrite(2, LOW);
delay(1000);
Serial.println("3");
pinMode(3, OUTPUT);
pinMode(2, OUTPUT);
pinMode(1, INPUT);
pinMode(4, INPUT);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
delay(1000);
Serial.println("4");
pinMode(1, OUTPUT);
pinMode(3, OUTPUT);
pinMode(2, INPUT);
pinMode(4, INPUT);
digitalWrite(3, HIGH);
digitalWrite(1, LOW);
delay(1000);
Serial.println("5");
pinMode(1, OUTPUT);
pinMode(3, OUTPUT);
pinMode(2, INPUT);
pinMode(4, INPUT);
digitalWrite(1, HIGH);
digitalWrite(3, LOW);
delay(1000);
Serial.println("6");
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(2, INPUT);
pinMode(1, INPUT);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
Serial.println("7");
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);
digitalWrite(4, HIGH);
digitalWrite(3, LOW);
delay(1000);
Serial.println("8");
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(1, INPUT);
pinMode(3, INPUT);
digitalWrite(4, HIGH);
digitalWrite(2, LOW);
delay(1000);
Serial.println("9");
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(1, INPUT);
pinMode(3, INPUT);
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
delay(1000);
Serial.println("10");
pinMode(1, OUTPUT);
pinMode(4, OUTPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
digitalWrite(4, HIGH);
digitalWrite(1, LOW);
delay(1000);
Serial.println("11");
pinMode(1, OUTPUT);
pinMode(4, OUTPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
digitalWrite(1, HIGH);
digitalWrite(4, LOW);
delay(1000);
Serial.println("12");
}
正如您所看到的,如果您僅限於幾個 I/O 引腳,這可能是一個有用的工具。
如果您想查看三態邏輯多工的其他選項,YouTube 上有幾個使用三態邏輯多工的很酷的項目。我看到的最常見的使用三態邏輯多工的項目之一是 LED 立方體。如果您在 YouTube 上搜尋三態邏輯多工LED 立方體,您會看到幾種不同的版本。
更多相關資料,請參考:
三態邏輯的輸入 / 輸出