Guten Abend, wer kennt sich denn mit so einem Ding aus? Ich habe einen 8051 an so einen Controller geklemmt und komm an einer Stelle nicht weiter. Was funktioniert? Initialisierung, Display Löschen, Grafikbyte reinschreiben. Was nicht: Cursor positionieren. Ich habe das mal vereinfacht zum Testen. Mein Grafikbereich beginnt bei 0000. Vor der Main rufe ich die Folge lcd_send_data(0x00); lcd_send_data(0x06); lcd_send_cmd(0x24); auf, was den Cursor an die sechste Stelle der ersten Zeile bewegt. Toll!! Aber die Reihenfolge ist schon nicht wie in der Doku, erst kommt das LSB, dann das MSB. Das also wäre nun Adresse 0600 und nicht 0006, trotzdem bin ich da wo ich hin will. Nun will ich in die Mitte des Displays, also 16 Zeilen runter, jede hat 16 Byte. Heißt also 256 Bytes weiter,also 0106 etwa. Wenn ich nun aber 01 und 06 sende lande ich wieder in der ersten Zeile. Warum ?? Wenn ich den Bereich 0200 als Grafikbereich wähle geht gar nix, da lande ich wasweißichwo. Ich habe mehrerer Dokumente schon gefunden die alle irgendwie ähnlich sind und das genau so gemacht wie da angesagt. Bin aber nun steckengeblieben. Wer kann mal kurz den entscheidenen Tip geben? Danke, Gruss Thomas
Hallo, ich habe zwar keine Ahnung, wo Du die Daten her hast, aber das Datenblatt des T6963C sagt doch auch eindeutig bei Kommando 0x24: Data1: Low-Adress, D2 High-Adress... 0x24 setzt auch keinen Cursor, sondern den Adress-Pointer. Wo Du Dich dann auf dem Display rumtreibst, hangt davon ab, wie Du den Grafikbereich programmiert hast, also wie der darzustellende Bereich im Display-Ram abgebildet wird. Du hast die Anzahl Spalten auch richtig gesetzt? Du hast ein 96x32 Pixel Display? Lese ich zumindest aus Deinen Angaben (Mitte bei 16. Zeile und 16 Byte pro Zeile) raus? Gruß aus Berlin Michael
Hallo Michael, sehe ich genau so, wenn ich aber die richtige Reihenfolge einhalte lande ich immer in der ersten Zeile am Anfang. Den Grafikbereich habe ich bei 0000 hingelegt, ich sagte ja schon daß ich bei anderen Startadressen ganz woanders bin und nix sehe. Ich schreibe kontinuierlich rein, nach einigen Sekunden (wenn der Zwischenbereich wohl gefüllt ist) sehe ich dann etwas im Display. Ich habe (Code war angehängt) ein 128x64 Display. Dieses hat nach meinem Verständnis 16 Bytes pro Zeile und 64 Zeilen. Also sollte ich bei 256 (0x0100) in der 16. Zeile landen, stimmt das? Gruss aus Hofheim im Taunus unddank erst mal.. Thomas
Hallo nochmal, ich habs nochmal durchgespielt: erst 01, dann 06: erste Zeile, Zeichen 6 erst 06, dann 01: erste Zeile, Zeichen 1 (jeweils mit Zeichen 0 als ganz linkes). Hä?? Was sagt mir das nun? Ist meine Intitialisierung falsch? Thomas
Hallo, naja, mit den 128 stimmt natürlich, da konnte ich nicht kopfrechnen... Ist schon ein paar Tage her mit dem T6963C, also ivh versuche es mal: Du legst mit Set Graphic Home Address (0x42) den Beginn des Grafikbereiches fest, das ist also die Adresse, die links oben dargestellt wird. Dann mit Set Graphic Area (0x43) die Anzahl Spalten in der Zeile fest. Die ist maximal (Displaybreite deines Displays / Char Font Size), jenachdem, wie Du also FontSize eingestellt hast, 6 oder 8, bei 8 also 16, bei 6 sind es 21 Spalten, da werden die letzten Pixel nicht mehr dargestellt. Dann noch den Mode und Displaymode setzen, OR-Verknüpft, Grafik On, Text Off vermutlich, ich habe meins immer kombiniert mit Text und Grafik betrieben, weiß also jetzt nicht sicher, wie das Verhalten bei nur Grafik ist. Die erste Zeile beginnt dann bei Graphic Home Address, die nächste bei Graphic Home Address + Anzahl Spalten usw. Bei FonzSize = 8 ist das noch übersicht lich, bei 6 ist etwas mehr Rechnerei dabei im Grafikmode. Ansonsten zeig doch mal Deine Init-Routine, vielleicht fällt mir da noch was auf. Gruß aus Berlin Michael
Hallo, hab gerade gesehen, Source hing ja oben dran. Sieht eigentlich ganz gut aus. Gruß aus Berlin Michael
Hi Michael, ich hexe hier herum. Mit diesem Kommando lcd_send_data(0x06); //first low then high byte lcd_send_data(0xF0); lcd_send_cmd(0x24); komme ich ans zweite Viertel des LCDs, aber nicht in Spalte 6 sondern an den Anfang. Da sind doch schon MSB und LSB vertauscht, oder? Ich habe die INIT Routine auch nochmal verändert, von anderen abgeschrieben. Effekt ist derselbe. Mit dem F0 sollte ich doch SEITEN weit wegspringen, wieso sind die da vertauscht? Ich kann nicht weiter als das erste Viertel springen, wenn ich weiter als FF will komm ich wieder in der ersten Zeile heraus. Kann jemand das erklären? Gruss Thomas
Ach noch etwas: ich hab die Schaltung zweimalk mit zwei LCDs aufgebaut und bekomme zweimal dasselbe Ergebnis. HW Probleme sollten ausgeschlossen sein, Pin 18 ist auf Masse (8 Bit).
Hallo, Seiten weit wegspringen kannst Du schon deshalb nicht, weil das Display vermutlich nur 8k Ram hat, der Rest wird also zwangsweise nur gespiegelt. Wie sich da aber die interne Logik verhält, weiß ich nicht. Ja, 0x006 sollte die 6. Spalte der ersten Zeile sein, 0x0010 die 1. Spalte der zweiten Zeile, wenn Anzahl Spalten 16 ist und das Display im 8-Pixel-Mode. 0x03FF müßte die letzte Spalte der letzten Zeile sein, also rechts unten, wenn ich mich nicht wieder verrechnet habe. ;) Schreib das Ding doch mal Byte für Byte mit einer Warteschleife voll, damit Du zuschauen kannst, ob da ein System drin ist. Vom Sourcecode würde ich es nicht vermuten, aber kann es Timingprobleme geben? Bei meinem Display waren es zuerst auch die Speicherzugriffe, wo es einfach Pixelfehler gab, obwohl Init und Kommandos noch richtig erkannt wurden. Allerdings erst bei MemoryMapped-Zugriffen mit mehr als 12MHz... Gruß aus Berlin Michael
Hi, ich schreib ja alles voll ohne Ende, das LCD füllt sich schön von oben bis unten. Nur der Anfangspunkt ist nur im Bereich von 00 bis FF einstellbar, wenn ich weiter will (ja, 3FF ist das Ende) so lande ich immer wieder in der ersten Zeile. Und komisch ist auch daß ich den Pointer mit umgekehrten MSB-LSB setzen muss damit ich überhaupt irgendwo hin komme. Werde mal einen anderen Quarz versuchen (8051 mit 24MHz hab ich gerade), dann sollte es vielleicht langsamer laufen. Danke erst mal, werde mal löten... Gruss Thomas
Hallo, es geht, weiß nicht warum!! Wenn ich ein Array definiere und diese Funktion periodisch aufrufe läuft es, warum?? char test[2] test[0]= 0xFF; test[1]= 0x00; lcd_print(test, 0x2C, 0x05); while (1) { _wait_ms(20); lcd_print(test, 0x2C, 0x05); test[0]=user_cnt; usw...... Die Funktion lcd_print macht aber auch nichts anderes als das was ich stückweise definiert habe ausser send_command(0xC0). Habe ich aber auch probiert, hat nix geholfen. Nu sende ich die Zeichen mit 0x20 Differenz aus und sie landen da wo ich sie erwarte. Ich habe den Grafikbereich auf 0x200 gelegt und es geht. Häääää???? Kann mir das einer erklären? Gruss Thomas
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.