Hallo Khan,

Ich kann nur anhand deines Codes vermuten was passiert ist:

1.) Du hast den bisherige Code mit mit RA1=0 und RA0=0 entwickelt.
Das heißt du hast das Display mit 4 Zeilen á 64 Zeichen initialisiert.
Das entspricht nicht den realen Gegebenheiten, funktioniert aber
vermutlich trotzdem.

Jede Zeile hat damit im Controller 64 Bytes, der DDRAM ist komplett
aufgeteilt. Von den 64 Bytes zeigt das Display allerdings nur 48 an,
16 Bytes sind "verloren".

Das spiegelt sich direkt in SetCursorPos() wieder. Die zweite Zeile
beginnt z.B. bei Adresse 64 im Speicher, SetCursorPos() setzt den
Cursor also an diese Stelle.

2.) Zur Nutzung des CGRAMs hast du den Controller plötzlich mit
RA1=1, RA0=0 initialisiert. Das ist schon der grundlegende Fehler.
Dadurch ist der Speicher anders aufgeteilt. Das DDRAM ist jetzt in
Zeilen mit je 48 Zeichen aufgeteilt (die natürlich direkt
hintereinanderliegen).

Schreibt jetzt also dein setCursorPos() an den Anfang der 3. Zeile
so wird der Cursor weiterhin an Speicheradresse 64 gesetzt. Durch
die geänderte Speicheraufteilung ist das aber nicht mehr der Anfang
der 2. Zeile sondern das 16. Zeichen der 2. Zeile (64-48 ).

Zur neuen Cursorberechnung deines Kollegen (nicht nur +=88, genau hinschauen):

Für Zeile 0..3 gilt folgende Formel:
Code:
x + y*48
Für Zeile 4..7 gilt folgende Formel:
Code:
x + (y-4)*48 + 24   =   x + y*48 - 4*48 + 24
Wird statt der Formel 4..7 die Formel 0..3 verwendet ergibt sich folgende Differenz:
Code:
[0..3] - [4..7]   =   x + y*48 - x - y*48 + 4*48 - 24   =   4*48 - 24   =   168.
Ist die Zeile also 4..7 muß von der Formel 0..3 nochmal 168 abgezogen werden. Da die Variable in C nur 8 Byte groß deklariert ist kann man statt 168 abzuziehen auch (256-16=88 dazuaddieren (durch Überlauf).


Ragnar