Hm, billiges Schieberegister, an jeden Ausgang einen Taster (oder halt
Schalter). Dann in der Schleife oder im Interrupt einfach immer ein Bit
durchschieben. Auf der anderen Tasterseite alle gemeinsam auf eine
Leitung schalten; am µC-Pin dazu den Pulldown aktivieren und vielleicht
noch einen 1kOhm-Widerstand zwischen die Leitung und µC-Pin setzen. Wenn
du nun mitzählst, kannst du ständig alle 8 Stellungen durchlaufen. und
bei einer davon ist bei gedrücktem Taster der µC-Pin auf 1 statt 0.
Ausgangsseitig nun genau andersherum, da das passende Bit setzen, das
Byte durchschieben, Latch aktivieren, fertig.
Entprellung wäre noch nett dazu, aber grob sollte das so gehen.
Oder verstehe ich das Problem falsch?
Ein Shiftregister verarbeitet auch nur Bytes, halt bitweise.
Pseudocode, Schnellschuss, geht hübscher, könnte leichten Fehler haben
;) :
1 | // 595_TASTER: Schieberegister mit den Schaltern dran
|
2 | // 595_RELAIS: Schieberegister mit den 8 Relais dran
|
3 | // 595_*_*_PIN: der jeweilige µC-Pin mit den Schieberegister-Anschlüssen dran
|
4 |
|
5 | 595_TASTER_LATCH_PIN=0;
|
6 | 595_RELAIS_LATCH_PIN=0;
|
7 |
|
8 | 595_TASTER_DATA_PIN=1; // durchzuschiebendes Bit für die Tastenabfrage setzen
|
9 |
|
10 | for (uint8_t j=0; j<8; j++)
|
11 | {
|
12 | 595_TASTER_CLK_PIN=1; // einen CLK-Puls zum weiterschieben des Bits
|
13 | 595_TASTER_CLK_PIN=0;
|
14 | 595_TASTER_LATCH_PIN=1; // Schieberegister-Ausgang anschalten
|
15 | 595_TASTER_DATA_PIN=0; // und jetzt nur noch Nullen nachsetzen
|
16 |
|
17 | if (TASTER_LEITUNG) 595_RELAIS_DATA_PIN=1; // Taste an dieser Position gedrückt -> Bit im Relais-Register an richtiger Stelle setzen
|
18 | 595_RELAIS_CLK_PIN=1; // und mit einem Takt weiterschieben
|
19 | 595_RELAIS_CLK_PIN=0;
|
20 | 595_RELAIS_DATA_PIN=0; // aber nur setzen, wenn Taste gedrückt war
|
21 | 595_TASTER_LATCH_PIN=0; // Taster-Register wieder "ausschalten"
|
22 | }
|
23 | 595_RELAIS_LATCH_PIN=1; // und am Ende die Relais nach dem umkopierten Register an/ausschalten.
|
Transferaufgabe für dich: Das war jetzt nur das SET-Register. Bestücke
das Reset-Register in den Code - sollte trivial sein.