Hi @all! Ich hab da ein kleines Problem: Ich suche schon seit Tagen eine Intelligente Möglichkeit einen Zeichensatz für ein Grafik Lcd_Display in Assembler-Code zu integrieren. Ich hab auch tatsächlich einen Zeichensatz gefunden (Siehe Anhang)... Thanks to Christoph Kessler! Aber irgendwie versteh ich nicht ganz die Ansteuerung davon, und Christoph meinte, es wäre schon ne weile Her, dass er das programmiert habe. Jedenfalls, soll es am Ende so sein, dass ich einen String oder auch einen einzelnen Buchstaben aus dem EEprom lade, der dann in Grafik-LCD fähiges format (z.b. 5x8 Pixel) umgesetzt und ausgegeben werden soll. Das mit dem Ausgeben ist kein problem, dass läuft bereits. Wo's noch hapert ist diese Umsetzung von einem normalen Ascii-Zeichen in die Pixel-Form. Ich hab mir da bereits ein paar Gedanken gemacht. Man könnte quasi "die Fliege mit ner Dampfwalze plätten ;)", indem man das Zeichen als Hexcode interpretiert, und dem Programm sagt, es soll an diese Stelle springen, wo wiederrum ein Verweis auf die demenstprechende Stelle mit den String vom Ascii-zeichen in LCD-Format steht... Dabei weiß ich aber wiederrum nicht, wie man dem Programm sagt, er soll nicht den Register als Sprungmarke annehmen, sondern der Wert der darin steht. Naja, jetzt hab ich euch erschlagen... Kann mir jemand helfen, oder ist das gar nicht möglich, was ich da vorhabe? Gruß Waldemar
Und... Hier mal die Ansteuerung... Thanks to Christoph Kessler! Danke für eure Bemühungen!
hey waldemar! also wenn du die zeichen im flash nach ascii-tabelle ordnen würdest (siehe anhang) könntest du einfach von einem über uart oder so eingehen zeichen die ersten 32 kontrollzeichen der tabelle anbziehen. danach subtrahiert du so lange 1 von dieser zeichen und gehst gleichzeitig mit dem aufs flash verweisenden pointer immer um 8 höher bis das zeichen irgendwann null ist. dann steht dein pointer auf dem jeweiligen zeichen-intrag im flash! ich hoffe irgendwer hat grad meine idee verstanden... :)) glg szero_gravity
oh mann... Ich musste echt lange überlegen, bis ich denen Denkweg verstanden hab. :) Also du meinst ich kopiere das Zeichen in ZL und in ein anderes Register z.B. R16 (gehen wir mal von "A" = $41 aus) r16 = Zl = $41 dann inrkrementiere ich den Z-pointer um 5 (weil das zeihen ja nur 5 Pixel breit ist) und subtrahiere R16 um 1. loop: adiw Zh:Zl, 5 dec R16 tst R16 brne loop rcall LCD_Out Wenn R16 = 0 ist stehe ich mit meinem Z-Pointer bei "A"... oder?
hey! man hat mich verstanden! freu also vom prinzip her hast du recht, nur dass du eben die berüchtigten 32 kontrollzeichen von r16 abziehen musst und deine zeichentabelle wie die ascii-tabelle anordneen musst... aber dann sollte das funktionieren! baue mir auch grad so eine routine für nen display, hab aber noch nix programmiert bisher - musst mir dann unbedingt sagen ob das überhaupt klappt! ach ja, nochwas: bei deinem zeichensatz sind die zeichen sind nicht 5x8 sondern 8x8 würde ich sagen... jedes zeichen besteht bei dir aus 8 zeichen, die in 8 spalten angeordnet sind, wovon die jeweils letzte immer 0x00 also eine leerspalte ist glg zero_gravity
Stimmt du hast recht... evtl. schreib ich noch nen eigen mit ner breite vo 5 zeichen, oder so. will nämlich nicht so viel platz mit text verbraten, wenn ich schon ein Grafik-LCD hab. Mir ist übrigens ne Idee gekommen, die auf deiner aufbaut: man löscht die zeichen die man nicht braucht einfach raus, und subtrahiert das Zeichen mit dem Wert der ersten Stelle. also z.b. "A" an Stelle 0x00 Wenn man A einliestsubrtahiert man $41 Diesen Wert multipliziert man mit der Breite der Zeichen also z.b. 8 und steht damit an stelle des Zeichens... z.b. für L: L = $4C ldi R16, $4C ;L in R16 sbci R16, $41 ;danach R16 = $0B = 11 ldi R17, 8 muls R16, R17 ;multipliziere. Ergebnis in R1 und R0 mov ZH, R1 mov ZL, R0 rcall Lcd_out So musste das, denk ich, gehen... Ich probiers mal aus, und sag dann bescheid.... Danke für die Hilfe!
Ach komm. Eine Multiplikation mit 8 ist einfach ein 3 maliges Schieben nach links.
> man löscht die zeichen die man nicht braucht einfach raus, und > subtrahiert das Zeichen mit dem Wert der ersten Stelle. Das ist doch schon passiert. Der gepostete Zeichensatz fängt mit dem ersten Zeichen an, dass eine graphische Repräsentierung hat. Noch mehr würde ich nicht rausstreichen. Denn irgendwann brauchst du so Dinge wie ! # oder Ziffern oder dergleichen.
Klar! Es ist ja auch nicht so gemeint, dass die Tabelle mit "A" anfängt... Das war jetzt nur ein Beispiel. Es Geht darum, dass man Strings als Wert und nicht als Label betrachtet und mit diesem Wert einen verweis auf die Grafik-Rouitine des zeichens macht. Da ist es egal, mit welchen Zeichen du anfängst. Wichtig ist, dass du das Schema der Ascii-tabelle einhälst und die Subtraktion mit deinem Anfangswert übereinstimmt. Ich tüftel da mal was aus, und stells dann rein... Übrigens kann man den zeichensatz von Oben so nicht verwenden, weil die Zeichen liegend dargestellt werden, also dafür gedacht waren, dass das Display steht... (Oder das Display von Chrtistoph wird anders angesteuert werden... Keine Ahnung) Gruß Waldemar
> weil die Zeichen liegend dargestellt werden
Wo liegt denn da das Problem?
Dann malst du halt die Pixel nicht nebeneinander
sondern übereinander.
Wenn du darauf spekulierst, dass du einfach nur die Bytes
aus dem Zeichensatz zum Display schaufeln musst, dann
vergiss es gleich wieder. Auf einem Grafikdisplay will
ich den Text an jeder beliebigen Position stehen haben.
Da is nix mit Byte rüberkopieren.
Mhh, recht hast du... Dan kann man gleivh ein Text-Display nehmen... Mein Display ist glaub ich auch ein bisschen komplizierter anzusteuern. Hier mal ein Schema (Hab das Datenblatt grad nicht da...) Column 0 - 63 Column 0 - 63 ------------------------------------------------- Page 0 - - - ------------------------------------------------- Page 1 - Hallo Welt - - ------------------------------------------------- Page 2 - - - ------------------------------------------------- Page 3 - - - ------------------------------------------------- Page 4 - - - ------------------------------------------------- Page 5 - - - ------------------------------------------------- Page 6 - - - ------------------------------------------------- Page 7 - - - ------------------------------------------------- CS1=1 CS2=1 Ich kann die Bytes so auf den Pages Beliebig verschieben. Will ich einen Buchstaben aber zwischen zwei Pages schreiben, muss man des die Bits wohl mit ner Schiebefunktion so hinschieben, das sie passen... Ist halt viel Hirnarbeit, müsste aber gehen. Für meine Zwecke würde die Fixierung durch die Pages wahrscheinlich aber reichen...
Meistens brauchst du ja kein High-Speed beid der Anzeige. D.h. deine erste Funktion ist eine Setzte Pixel an Position X/Y Funktion. Diese Funktion kümmert sich um die Pages und was sonst noch an Hardware-Besonderheiten vorhanden sind, um für darüberliegende Software-Schichten einen einzigen logischen Screen mit was weiss ich wievielen Pixel in X und Y anzubieten. Diese Funktion benutzt du dann weiter um bei der Ausgabe eines Characters die entsprechenden Pixel zu setzen. Die Zeichen- Ausgabefunktion muss sich dann um solche Dinge nicht mehr kümmern.
Mhh, du meinst, dass ich da ne subroutine schreiben soll, wo ich dass genaue Pixel angebe, wo es Beginnen soll, und das programm mir dann selber ausrechnet, auf welcher Page sich das befindet und wie er die Bytes splitten/schieben muss...?
Exakt: void SetPixel( unsigned int Row, unsigned int Column ); void ClearPixel( unsigned int Row, unsigned int Column ); ev. ist auch eine Funktion void TogglePixel( unsigned int Row, unsigned int Column ); wünschenswert: Ist das Pixel gesetzt, dann wird es gelöscht, ist es gelöscht, wird es gesetzt. Dies ist zb interessant, wenn du Text über einer Graphik ausgibst. Dunkle Pixel auf dunkel Untergund sieht man sonst so schlecht :-) Diese 3 Funktionen, sind die einzigen, die über die ganze Page-Geschichte Bescheid wissen. Alle anderen Ausgabefunktionen stützen sich auf diese Funktionen und benutzen sie wenn ein Pixel zu setzen bzw. zu löschen ist.
Ähhm, sorry, kann kein C programmieren... gibts so was auch in Assembler? Ansonstn muss ich's halt selber errechnen und programmieren...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.