RH: Nicht schlecht, Herr Specht!
...ist das rote links diese Eigenbau-Matrix? - sieht ja cool aus, sind das SMD-LEDs "von hinten" auf ne Platine gelötet, dass sie praktisch durch die Löcher durchleuchten?
Andy, Du bist mir jetzt zuvorgekommen, während ich getippt habe... habe das gleiche Datenblatt mittlerweile auch gefunden ;o) - dieses ganze Thema 20 mA und auch wegen Widerständen, Spaltentreiber etc. hat sich ja dann geklärt... hast schon recht, lieber 50 Cent mehr und dafür auf der sicheren Seite....
Und ich bin mittlerweile auch schon drauf gekommen, was es mit dem Und-Glied auf sich hat - lass' das auf jeden Fall drin, das ist eine genial einfache Idee, Respekt!, ich hätte mich jetzt mit Software-Dimmung rumgeplagt... ;o)
Die PWM-Frequenz muss hier halt *deutlich* höher sein als der Display-Refresh, aber das ist bei Hardware-PWM ja kein Problem...
RH: Du hast aber die Anoden am 4094 und baust den ULN 2083 an den Kathoden ein? - Weil der an der Anode dürfte nicht gehen, hat ja gemeinsamen Emitter und kann nur nach GND durchschalten, keinen Strom "ausgeben", wenn ich das richtig sehe....? Andy hat (für seinen Zweck richtigerweise) ja auch den UDN 2981 genommen, mit gemeinsamen Kollektor....
Die Software an sich ist wohl nicht sooo schwierig - hier mal in Textform als "Ablaufplan":
Ich würde das als "Bildschirmspeicher" im Ram organisieren, also 160 Byte hintereinander, wobei ein Byte eine Spalte ist.
Ansteuerung dann in einer ISR. In der schiebst Du zuerst in einem Register ("Zeile") eine "1" weiter. Fällt sie "hinten" raus, kommt sie "vorne" wieder rein...
Du holst Dir dann das erste Byte (über Pointer), machst ne AND-Verknüpfung mit diesem Register, d.h. wenn die "1" z.B. an Stelle 3 für die 3. Zeile ist, bekommst Du auch nur das Bit für die dritte Zeile, dieses an "Data" ausgeben, dann Clk-Impuls für die Übernahme/weiterschieben im 4094.
Dann das nächste Byte, selbes Spiel, bis alle 160 durch sind (sind dann im Schieberegister).
Dann deaktivierst Du zuerst Output Enable (eben wegen den "Geisterbildern"), gibst das Register "Zeile" an den Zeilen-Port aus, in diesem Beispiel wäre dann die dritte Zeile aktiv (davor war's die zweite).
DANN gibst Du den Strobe-Puls, dadurch wird das neue Bitmuster in die Latches übernommen.
Und dann Output Enable wieder aktivieren, neues Bitmuster wird angezeigt.
wenn das Display insgesamt z.B. nen Refresh von 50 Hz haben soll, musst Du diese ISR 400 mal in der Sekunde aufrufen...
Durch die Organisation des Bildspeichers in Spalten pro Byte dürfte ein hin- und her-scrollen recht einfach sein - Du musst ja nur die Bytes je eines weiter oder zurück schieben, je nachdem, ob links oder rechts gescrollt wird... oder Du machst "links" und "rechts" noch einen "Überhang", dann kannst du zumindest um ein paar Spalten scrollen, indem Du einfach den Pointer anders setzt...
Und solche Effekte, dass der Text von oben reinkommt oder nach unten verschwindet, lassen sich ganz leicht in der ISR machen, Du musst das Byte ja nur rotieren, bevor Du die And-Verknüpfung machst, dann landet z.B. die dritte (Speicher-)Zeile in den Schieberegistern, während die zweite (Hardware-)Zeile aktiv ist.
Beim Beschreiben des Bildschirmspeichers (RAM) könnte man auch das Byte aus dem Zeichensatz-Speicher (EEPROM) "umdrehen" (mir fällt grad der Fachausdruck nicht ein, wurde doch etwas später/süffiger gestern ;o), um negativ-Text anzuzeigen. Eine Or-Verknüpfung mit z.B. 00010000 ergibt dann durchgestrichenen Text, mit 00000001 unterstrichenen Text. Blinken/Faden (also gesamt) geht über die HW-PWM-Dimmung, so Effekte, dass der Text "zerbröselt" über eine And-Verknüpfung mit Zufallszahlen. Komplettes Display invertieren/unterstreichen/durchstreichen könnte man auch noch in die ISR mit einbauen...
Und das wären dann eh' schon fast alle Effekte, die so ein gängiges Display hat - wohl eben deswegen, weil sie so einfach zu machen sind... ;o)
Andy, welchen µC willst Du denn nehmen? - Ich bastle grade mit Tiny 2313 und Mega 8515, letzterer sollte hier schon reichen... ich kann Dir gerne als "Art Gemeinschaftsprojekt" beim Programmieren helfen (z.B. diese ISR-Routine mal machen), ich mach' das momentan eh' lieber, als haufenweise Bauteile auf Platinen zu löten... müsste nur wissen, welche Leitung an welchen Port/Pin soll...
Dafür darf ich dann mal vorbeikommen und mir das Ding ansehen - ist ja nicht so weit weg, könnte ich mit einem Besuch bei Pollin verbinden...
Übrigens habe ich vor Jahr(zehnt)en mal auf Karopapier nen 5x8 Zeichensatz "designt" (naja, viel Möglichkeiten gibts da nicht) und in Bytes übersetzt - ich wollte damals als 15 Jähriger nen Nadeldrucker selbst bauen, das ist natürlich sowas von in die Hose gegangen ;o) - mal sehen, ob ich den alten Bastelordner wieder finde, da wär' nämlich auch noch ein interessantes LED-Projekt drin...