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
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