Forum: Mikrocontroller und Digitale Elektronik Display Position bestimmen


von hkhkjhkjhl (Gast)


Lesenswert?

Hallo

ich habe ein 2 zeiliges  EA Dogm-162 Display wo mich interessieren würde 
wie ihr die Position bestimmt.

Wenn ihr einen Text in der ersten Zeile ausgibt, setzt ihr den Cursor 
dann wieder auf Position 0 und verschiebt ihn dann um 40 Zeichen damit 
es in die zweite Zeile kommt, oder gibt es einen einfacheren Weg.

MfG

von Karl H. (kbuchegg)


Lesenswert?

hkhkjhkjhl schrieb:

> ich habe ein 2 zeiliges  EA Dogm-162 Display wo mich interessieren würde
> wie ihr die Position bestimmt.

Welche Position? Und warum möchte man die bestimmen?
>
> Wenn ihr einen Text in der ersten Zeile ausgibt, setzt ihr den Cursor
> dann wieder auf Position 0 und verschiebt ihn dann um 40 Zeichen damit
> es in die zweite Zeile kommt, oder gibt es einen einfacheren Weg.

So ein LCD hat keinen Cursor, so wie du ihn von deiner Textverarbeitung 
her kennst. Du legst einfach fest wo du zu schreiben anfangen möchtest 
und gibst Zeichen aus. Das LCD beginnt dann ab dieser Stelle die Zeichen 
nacheinander auszugeben.
Einfach mal in der Doku nach "Set DDRAM Adress" schauen. Das ist im 
Prinzip eine direkte Cursor-Positionierung. Also so "Setze Cursor nach 
2. Zeile/1. Zeichen". Und ab dort wird dann ausgegeben.

von spess53 (Gast)


Lesenswert?

Hi

>...oder gibt es einen einfacheren Weg.

Ja. Es gibt den Befehl 'Set DDRAM Address'. Damit kannst du den Cursor 
an beliebiger Stelle platzieren.

Und die zweite Zeile beginnt bei 0x40, und nicht 40D.

MfG Spess

von hkhkjhkjhl (Gast)


Lesenswert?

Gemeint war der Befehl "Display or Cursor Shift". Das kann den Cursor um 
ein Zeichen verschieben. Und mit der for-Schleife um 40 Zeichen wäre die 
2. Zeile.

Bei Set DRAM Adress wieso gehen die Adressen von 0-39D und von 64-103. 
Was  ist mit den Adressen dazwischen?

von Karl H. (kbuchegg)


Lesenswert?

hkhkjhkjhl schrieb:
> Gemeint war der Befehl "Display or Cursor Shift". Das kann den Cursor um
> ein Zeichen verschieben. Und mit der for-Schleife um 40 Zeichen wäre die
> 2. Zeile.

Man kann natürlich auch immer alles auf die komplizierte Art machen.
Aber warum sollte man das tun wollen?

Bei deiner Methode muss man 40 Übertragungen zum LCD machen (Cursor Home 
und 40 mal Shiften) um das gleiche Ergebnis zu erhalten wie senn ich mir 
einfach die DDRAM Adresse ausrechne und mit 1 Befehl dem LCD mitteile.

Wenn du mit dem Lift vom 19. Stock und den 22. Stock fahren willst, 
fährst du ja auch nicht erst ins Erdgeschoss, nur damit du immer von der 
gleichen Statrposition aus zählen kannst.

> Bei Set DRAM Adress wieso gehen die Adressen von 0-39D und von 64-103.
> Was  ist mit den Adressen dazwischen?

Dieser Speicher wird nicht am LCD angezeigt. Die Adressen gibt es, sind 
aber quasi neben der Anzeigefläche.

Auf die Art fängt die 2.te Zeile IMMER bei der gleichen Adresse an, egal 
ob das LCD 16 oder 20 oder 40 Zeichen breit ist. (theoretisch)

von Ingo (Gast)


Lesenswert?

Man kann auch die Cursorposition auslesen. Hab ich noch nie gebraucht.

von spess53 (Gast)


Lesenswert?

Hi

>Man kann auch die Cursorposition auslesen. Hab ich noch nie gebraucht.

Aber nicht bei serieller Ansteuerung von DOG-Displays.

MfG Spess

von hkhkjhkjhl (Gast)


Lesenswert?

Ich habe im "Entry Mode Set"  das "Shift of entire display" auf High 
gesetzt.

Jedoch shiftet bzw. scrollt das Display nicht egal ob ich über 16 oder 
über 40 Zeichen einfügt.

Egal welchen Wert ich in das Entry Mode Set einfüge die Anzeige bleibt 
immer gleich. Es ändert sich überhaupt nichts.

Muss das scrollen programmiert werden?

MfG

von Werner oder was (Gast)


Lesenswert?

hkhkjhkjhl schrieb:
> Bei Set DRAM Adress wieso gehen die Adressen von 0-39D und von 64-103.

Weil das so ist.

von Karl H. (kbuchegg)


Lesenswert?

hkhkjhkjhl schrieb:
> Ich habe im "Entry Mode Set"  das "Shift of entire display" auf High
> gesetzt.
>
> Jedoch shiftet bzw. scrollt das Display nicht egal ob ich über 16 oder
> über 40 Zeichen einfügt.

Das tut es auch nicht.
Shift Display shiftet das ganze Display (so wie ich das Datenblatt 
gelesen habe). Allerdings nicht weil der Cursor über den rechten Rand 
rauskommt.

Und ich hab ehrlich gesagt bis heute keinen einzigen Anwendungsfall 
gefunden, bei dem man diese Funktion sinnvoll einsetzen könnte. Für 
Laufschriften könnte das eventuell nützlich sein, ich mach sie trotzdem 
lieber konventionell.

von spess53 (Gast)


Lesenswert?

Hi

>Muss das scrollen programmiert werden?

Manchmal geht es auch mit Handauflegen.

Aber mal ernsthaft, du solltest mal etwas langsamer machen. Nimm dir das 
Datenblatt vo0m Displaycontroller und versuche es in Ruhe zu verstehen.

Du hast auch schon bemerkt, das man u.U. zwischen den Instruction Tables 
umschalten muss?

MfG Spess

von hkhkjhkjhl (Gast)


Lesenswert?

>Wenn du mit dem Lift vom 19. Stock und den 22. Stock fahren willst,
>fährst du ja auch nicht erst ins Erdgeschoss, nur damit du immer von der
>gleichen Statrposition aus zählen kannst.

Das nicht aber ich denke es wär so einfacher gewesen als zuerst die 
Zeichen vom Text zu zählen und um die Differenz zu erhöhen damit ich in 
die nächste Zeile komme.


>Shift Display shiftet das ganze Display

Das komische ist dass es das auch nicht macht. Egal welchen Wert ich 
einfüge es fängt immer bei Position 0 an.

D.h. wenn der Text größer als 16 Zeichen ist würdest du das selber 
programmieren dass der Text scrollt.

von spess53 (Gast)


Lesenswert?

Hi

>D.h. wenn der Text größer als 16 Zeichen ist würdest du das selber
>programmieren dass der Text scrollt.

Text passend machen oder ein anderes Display benutzen. Es sei den du 
willst mit dem Display spielen. Die Displays können übrigens nur 
horizontal scrollen. Also praktisch unbrauchbar.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

hkhkjhkjhl schrieb:
>>Wenn du mit dem Lift vom 19. Stock und den 22. Stock fahren willst,
>>fährst du ja auch nicht erst ins Erdgeschoss, nur damit du immer von der
>>gleichen Statrposition aus zählen kannst.
>
> Das nicht aber ich denke es wär so einfacher gewesen als zuerst die
> Zeichen vom Text zu zählen und um die Differenz zu erhöhen damit ich in
> die nächste Zeile komme.

Das muss doch auch keiner!

Wir wissen doch, bei welcher Adresse die 2.te Zeile anfängt! Die setze 
ich und gut ists. Wenn man die Adressberechnung dann noch einer Funktion 
anvertraut, dann kann man die Funktion aufrufen mit: Ich möchte gerne in 
der 2.ten Zeile, 8. Spalte anfangen Text auszugeben.
Die Funktion rechnet aus diesen Angaben die DDRAM Adresse aus und setzt 
das LCD auf diese Position an, so dass die nächsten Ausgabe dann auch 
wirklich dort beginnt. Wieviel Text ich vorher an welcher Stelle auch 
immer ausgegeben habe, ist doch völlig uninteressant. Jetzt will ich in 
der 2.ten Zeile, 8.te Spalte schreiben, und dieser ANgabe entspricht 
eine DDRAM Adresse, die man berechnen kann.

> D.h. wenn der Text größer als 16 Zeichen ist würdest du das selber
> programmieren dass der Text scrollt.

Wenn ich haben will dass er scrollt: Ja, klar.

Der springende Punkt: Man will ja meistens haben, dass nur die erste 
Zeile scrollt und die 2.te nicht (bzw. umgekehrt). Und spätestens da 
macht das LCD auf keinen Fall mehr mit.

Auch wenn ich den Text
"***** 12345 The quick brown fox jumps over the lazy dog 67890 *****"
durch eine LCD Zeile scrollen lassen will, komm ich mit dem LCD Speicher 
alleine nicht weit, weil der Text nun mal zu lang ist. (Und wenn nicht, 
dann konstruier ich halt noch einen längeren)

von hkhkjhkjhl (Gast)


Lesenswert?

Bei sizeof nehme ich doch den Inhalt von data. Es zeigt aber immer nur 2 
an. Wie kann ich die Größe vom string herauslesen.
1
lcd string ("juhuuuuuuuu");
2
3
void lcd_string( const char *data )
4
{
5
    int zeichen;
6
    zeichen = sizeof(*data);
7
8
    while( *data != '\0' )
9
        lcd_data( *data++ );
10
}

von Karl H. (kbuchegg)


Lesenswert?

hkhkjhkjhl schrieb:
> Bei sizeof nehme ich doch den Inhalt von data. Es zeigt aber immer nur 2
> an. Wie kann ich die Größe vom string herauslesen.

Ähm.
Du brauchst ein C-Buch

http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C

Ausserdem kommt hierbei ....

>     zeichen = sizeof(*data);

... 1 raus.

data ist ein Zeiger auf einen char
also ist *data der char selber.

Und ein char hat definitionsgemäss eine sizeof von 1

von hkhkjhkjhl (Gast)


Lesenswert?

Das kannte ich auch aber dachte es muss auch mit sizeof gehen. Danke

von Karl H. (kbuchegg)


Lesenswert?

Nur dann, wenn du den String auch in Form eines Arrays zur Verfügung 
hast. Das hast du aber nicht. In der Funktion hast du nur einen Pointer 
zum String. Du kannst zwar die sizeof vom Pointer feststellen (die ist 
bei dir 2), aber das hilft dir nichts, wenn du die Stringlänge selber 
wissen willst.

von hkhkjhkjhl (Gast)


Lesenswert?

Ich würde gerne die Zeichen im Speicher zählen. Jedoch beim SPI ist R/W 
fix auf HIGH.

Habt ihr eine Idee wie man auf den Speicher zugreifen kann.

MfG

von spess53 (Gast)


Lesenswert?

Hi

>Habt ihr eine Idee wie man auf den Speicher zugreifen kann.

Geht mit SPI nicht. Du kannst dir aber einen Shadow-Ram (Abbild des 
DDRAM) im RAM des Controllers anlegen.

MfG Spess

von hkhkjhkjhl (Gast)


Lesenswert?

Würdest du ein char_array oder malloc verwenden

von spess53 (Gast)


Lesenswert?

Hi

>Würdest du ein char_array oder malloc verwenden

Da ich in Assembler programmiere , keins von beiden. Außerdem halte ich 
das bei Textdisplays für überzogen. Bei Grafikdisplays sieht das u.U. 
anders aus.

MfG Spess

von hkhkjhkjhl (Gast)


Lesenswert?

Wie verschiebt ihr die erste Zeile um eine Stelle nach links dass aber 
die zweite Zeile nicht beeinflusst wird.

von Karl H. (kbuchegg)


Lesenswert?

Den Text drüberschreiben, eben um 1 Stelle versetzt.

Wenn der Text
"The quick brown fox jumps over the lazy dog"

auf einem Display mit 8 Zeichen scrollen soll, dann wird eben im ersten 
Durchgang

"The quic"

ausgegeben.
Im nächsten Durchgang kommt der Cursor wieder vorne hin und ausgegeben
"he quick"

dann wieder Cursor nach vorne und
"e quick "

" quick b"

usw. usw.

Ist doch für einen µC eine leichte Übung mit Schleifen, das zu 
erreichen.
Hinweis: Wenn der Text von der Seite auch noch reinscrollen soll, ist es 
eine Möglichkeit, den zu scrollenden Text mit einer entsprechenden 
Anzahl Leerzeichen beginnen und enden zu lassen.

von Jobst M. (jobstens-de)


Lesenswert?

Also, wenn ich wirklich 'Mätzchen' auf dem Display machen wollen würde, 
würde ich mir im RAM des Controllers für jedes Zeichen auf dem Display 
ein Byte im RAM reservieren, darin 'herummalen' und regelmässig auf das 
Display kopieren.

Diese ganzen eingebauten Schiebefunktionen des Displays habe ich bisher 
nur einmal genutzt: Als ich zum ersten Mal so ein Display in der Hand 
hatte und damit herumgespielt habe.

Irgendwelche Menüs oder Ausgabewerte kann man auch 'on the fly' 
zusammenstellen und ausgeben. Das komplette Display, bei jedem Event.


Gruß

Jobst

von lcd-ler (Gast)


Lesenswert?

Also eine Idee von mir war den Cursor um eine Stelle nach links zu 
verschieben und den ganzen Text wieder neu ausgeben.

Oder was noch ginge wäre die SCROLL-Funktion zu aktivieren. Da aber die 
erste und zweite Zeile verschoben werden müsste ich das irgendwie durch 
UND und ODER verknüpfen damit die zweite Zeile gleich bleibt.
1
char zeile_1[60];
2
.
3
.
4
//Timer Interrupt
5
setze_position(); //Cursor um eine Stelle nach links verschieben
6
lcd_string_ausgeben(zeile_1);
7
.
8
.

Für was würdest du Schleifen benützen?

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
Noch kein Account? Hier anmelden.