Ich hab schon eine Anzeige mit 8 Siebensegmentanzeigen und dem AT90S2313
gebaut. Das funktioniert alles prächtig. PB habe ich über einen
Treiberbaustein (74HC541 oder so ähnlich - 8bit Leitungstreiber) und 50
Ohm-Widerstände direkt an die Segmenteingänge aller Anzeigen geschaltet
(parallel). PD0-2 gehen an A,B und C des CMOS-IC 4028 (Hex zu
Dezimal-Decoder). Dabei sind ungenutzte Eingänge UNBEDINGT auf Masse zu
schalten (Betrifft Eingang D). Jeder Ausgang dieses Decoders geht über
einen Transistorverstärker an die Gemeinsame Elektrode der Anzeige (Je
nach dem, ob gemeinsame Kathode oder gemeinsame Anode- bei mir : Anode,
aber Kathode ist IMHO besser, weil man dort bessere Ausleuchtung mit
gleichen Transistoren erreicht).
Gleichzeitig kannst du auch noch 8 Taster dranhängen, indem du jeweils
eine Diode von einem der 4028-er Ausgänge an einen Taster schließt, und
das "andere Ende des Tasters" zusammen mit den "anderen Enden der
anderen Tastern" an PD3 verbindest. Diesen Pin kannst du dann als
Eingang nehmen, aber du solltest ihn mit einem Widerstand (10KOhm)
gegen Masse verbinden, sonst fängt er an zu schwingen und kann dir den
Letzten Nerv bei der Fehlersuche rauben (Ich weiß wovon ich Rede ;).
Softwaretechnisch lässt du den Timer0 mit 1000Hz durchlaufen. In einem
Interrupt schaltest du einen anderen 4028-er Ausgang durch (nächste
Anzeigestelle) und fütterst PB mit dem Anzeigeinhalt für diese Stelle.
Im nächsten Interrupt fragst du PB3 ab, und holst den Tastenstatus für
den parallel selektierten Taster ab. Sozusagen wechselst du zwischen
Anzeigeupdate und Tasterabfrage. Damit ist gewährleistet, dass ein
Stabiles Signal am Tastereingang anliegt, wenn es abgefragt wird. Damit
läuft innerhalb von 16 Interrupts die Anzeige einmal komplett durch, und
die Taster werden auch einmal komplett abgefragt. Das alles kannst du so
realisieren, dass du zwei Tastenregister hast, die aktualisiert werden.
Im das Eine schreibst setzt du immer das aktuelle Bit (für jeden Taster
eins), und in das andere schreibst du das Bit, das du eben überschreibst
(vorher retten). Damit kann man veränderung (steigende, fallende Flanke
= Taster drücken und loslassen) ermitteln. Den Anzeigeinhalt kannst du
bequem in den RAM schreiben, von wo er im Interrupt dann entsprechend
ausgelesen wird. Das ganze braucht macimal 100 Instruktionen, womit du
noch 900 übrig hast. (viiiel Platz)
Durch die Hohe (relativ) Timerfrequenz passiert das ca. 64 mal pro
Sekunde, und du nimmst das Multiplexen der Anzeige als eine durchgehend
leuchtende Anzeige wahr. Allerdings leuchtet die Anzeige nur ein Achtel
so hell, als wenn sie im Dauerbetrieb wäre. Daher sind die Widerstände
mit 50 Ohm so dimensioniert, dass sie in den kurzen Pulsen 100mA (bei
5V) durch die LEDs schicken. Du musst unbedingt die Transistoren groß
genug wählen, dass sie einen Strom von 800mA (alle Segmente) vertragen,
sonst kann es sin, dass die Anzeige je nach Inhalt unterschiedlich hell
leuchtet (und das wollen wir doch nicht ;-) ).
Im Endeffekt hast du dann noch PD4-6 für eigene Zwecke frei. Als Quarz
hab ich einen 8MHz mit 18p Kondensatoren gegen Masse genommen. Für
Uhrenanwendungen kannst du ebenfalls den Timer0 verwenden (exakter 1ms
Takt).
Zusammenfassend :
An den (fast) kleinsten Chip der AT90S-Serie mit 15 I/Os ist
angeschlossen : Eine 8-stellige LED-Anzeige, 8 Taster und 3 Ausgänge.
Wenn man das nicht Multiplexen würde bräuchte man einen µC mit 64+8+3 =
75! IOs. Die wären nicht nur Teuer, sondern wesentlich schlechter zu
löten. Als Spannungsversorgung kannst du mit einem 7805 (Schaltplan
gibts wie Sand am Meer) aus 6-35V Eingangsspannung exakte 5V
Produzieren. Achtung: Das Ding wird Sau-warm (ich betrieb die unkekühlt
mit 13,5V Eingang - Da wird das Teil schon locker 80°C heiß !
Ich hätte dir auch gern einen Schaltplan gepostet, doch leider ist der
nur auf Papier aufgekritzelt, da Target nicht alle Bauteile zur
gleichen Zeile zulässt (100-Pin-Grenze).