Großartige Lösung von jippie . Ich möchte etwas näher darauf eingehen.
Das Schema:
Die Idee ist, einen der E / A-Ausgänge und die beiden anderen Eingänge zu erstellen, mit denen Sie den lesen können Zustand von zwei Tasten. Dreifache Ausgabe \ $ \ mal \ $ zwei Eingaben sind für 6 Tasten geeignet, wie der Schaltplan zeigt.
Wie aktiviere ich den Ausgang? Hoch machen? Machen wir es für Pin 1, dann sind die Dioden B und F in Vorwärtsrichtung vorgespannt, sodass wir erwarten würden, diese Tasten lesen zu können. Bei vielen Mikrocontrollern funktioniert dies nicht. Durch Drücken der Taste B wird Eingang 2 hoch, aber was ist, wenn die Taste nicht gedrückt wird? Die Eingabe würde schweben, und dann können Sie nichts Sinnvolles darauf lesen. Ein Pulldown-Widerstand würde helfen, aber viele Mikrocontroller haben nur Pull-Up-Widerstände, und dann werden Sie nie einen niedrigen Pegel lesen. Ich weiß nicht über alle Bescheid, aber zumindest einige AVR- und PIC-Mikrocontroller haben nur Klimmzüge.
In diesem Fall ist es richtig, die internen Klimmzüge zu aktivieren und den Ausgang zu aktivieren, indem Sie ihn niedrig machen. Wir steuern nicht die Tasten B und F, sondern A und E. Wenn die Taste A nicht gedrückt wird, wird durch das Hochziehen der Eingang 2 hoch. Drücken Sie die Taste A und Sie ziehen den Eingang nach unten.
Der Algorithmus:
IO2 = Eingang, Pull-up enabledIO3 = Eingang, Pull-up enabledIO1 = Ausgang, lowButton_A = IO2 (niedrig = gedrückt) Button_E = IO3 (niedrig = gedrückt) IO1 = Eingang, Pull-up aktiviertIO2 = Ausgang, lowButton_B = IO1 (niedrig = gedrückt) Button_C = IO3 (niedrig = gedrückt) IO2 = Eingang, Pull-up aktiviertIO3 = Ausgabe, lowButton_F = IO1 (niedrig = gedrückt) Button_D = IO3 (niedrig = gedrückt)
Soweit ich weiß, haben beispielsweise alle NXP Cortex-M-Controller beide konfigurierbare Pull-Ups / Pulldown-Widerstände. Für diese können Sie positive Logik (hoch = gedrückt) verwenden, wenn Sie die Pulldowns und einen aktiven hohen Ausgang verwenden. Beachten Sie, dass Sie verschiedene Schaltflächen für denselben Ausgang lesen:
IO2 = Eingang, Pulldown aktiviertIO3 = Eingang, Pulldown aktiviertIO1 = Ausgang, hoch
Button_B = IO2 (hoch = gedrückt) Button_F = IO3 (hoch = gedrückt) IO1 = Eingang, Pulldown aktiviertIO2 = Ausgang, highButton_A = IO1 (niedrig = gedrückt) Button_D = IO3 (niedrig = gedrückt) IO2 = Eingang, Pulldown enabledIO3 = Ausgabe, highButton_E = IO1 (niedrig = gedrückt) Button_C = IO3 (niedrig = gedrückt)