Wie steuere ich 8 LEDs mit nur 5 Pins eines Mikrocontrollers?
Zunächst einmal ist es unmöglich mit nur 5 binären outputs welche 32 mögliche Kombinationen haben alle 256 Kombinationen von an und ausgeschalteten LEDs anzusteuern, zumindest wenn man außer den Pins nur Kabel zur Verfügung hat. In dem Fall bleibt einem nur die Möglichkeit aus den 256 Kombination 32 auszuwählen und die LEDs so zu verkabeln (z. B. In Reihe schalten) das diese bei entsprechenden pin outputs erscheinen.
Das ist aber nicht die ganze Wahrheit. Es gibt diverse Möglichkeiten diese Limitation zu umgehen wobei die jeweils mit gewissen Einschränkungen verbunden sind. Ich stelle hier zwei vor, die ich benutzt habe, es gibt aber bestimmt auch andere.
Hat man ein Shift Register zur Verfügung ist die Sache relativ einfach (ist in diversen Starterkits dabei und sonst billig zu kaufen). Dann benötigt man nur 3 Output Pins um beliebig viele LEDs zu steuern (8 mit einem, durch daisychaining beliebig viele). Es gibt diverse Tutorials online deswegen werde ich hier nur grob die Idee vermitteln: Man sendet dem Chip eine Liste von Outputs, indem man auf einem der drei Pins sendet was der Output sein soll und den anderen immer an und aus schaltet wenn dieses Signal übernommen werden soll. Aktiviert man den dritten Pin wird die so gesammelte Liste auf die Outputs des Shift Registers übertragen. Dies ist die Methode, die ich empfehlen würde, sie ist gut online dokumentiert und als Anfänger lernt man sich mit Chips und ihrer Dokumentation auseinanderzusetzen. Der potentielle Nachteil ist das die LEDs natürlich nur leicht verzögert reagieren (obwohl das vernachlässigbar ist, ich habe mal eine LED matrix für ein Tetris Spiel so angesteuert und es hat das Spielen in keinster Weise beeinflusst)
Die Zweite Variante ist ein bisschen komisch und keine wirkliche Handlungsempfehlung sondern mehr aus Prinzip gelistet. Man verkable die LEDs so, dass jede LED nur dann angeht wenn 2 spezifische Output pins auf HIGH gesetzt sind. Das liese sich zum Beispiel mit Transistoren erreichen (wir bauen and gates). Dann braucht man im Programm eine konstanten loop, der für jede LED je nachdem ob sie an oder nicht sein soll diese beiden Pins kurz auf HIGH setzt und dann wieder auf LOW oder halt nicht. Geht man schnell genug durch den Loop erscheinen alle LEDS als angeschaltet. Eine Ähnliche Strategie verfolgen LED matrizen weswegen Busdisplays auf Kameras oft komish aussehen. Die Nachteile hier sind offensichtlich: Die LEDs erscheinen dunkler als sie sind (da sie nur ein Teil der Zeit tatsächlich an sind) und es bedarf konstanter Steuerung der LEDs sollen zwischenzeitlich komplexe Berechnungen oder Delays eingebaut werden ist das nicht immer trivial oder sogar möglich ohne auf einmal nur eine einzige LED leuchten zu haben. (Diese Methode kann strengenommen noch ein wenig optimiert werden, sodass manchmal zwei LEDS gleichzeitig adressiert werden aber das Prinzip bleib das gleiche)
Ich empfehle also: Benutz ein Shift Register.