Forum: Mikrocontroller und Digitale Elektronik In 2. Zeile von LCD springen


von Kike (Gast)


Lesenswert?

Hallo!

Bevor ihr mich abschiesst: Ja, ich habe das tutorial un zig andere posts 
zu diesem Thema gelesen. Aber ich schaff's trotzdem nicht.
Ich habe das LCD161A (Reichelt) welches ein 16x1 LCD ist.
Die ersten 8 Charaktere krieg ich hin, danach kommt nichts mehr.

Code:

           ldi temp1, 'a'     ; Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 'b'     ; Zeichen anzeigen
           rcall lcd_data

           .
           .
           .

     ldi temp1, 'h'     ; Zeichen anzeigen
           rcall lcd_data

     ldi temp1, 0b11000000    ; in zeile 2 springen (position 1)
           rcall lcd_command

           ldi temp1, 'i'     ; Zeichen anzeigen
           rcall lcd_data

     ldi temp1, 'j'     ; Zeichen anzeigen
           rcall lcd_data

           .
           .
           .

Das 'h' wird noch angezeigt, danach nichts mehr. Ich kapiers einfach 
nicht.
Kann mir bitte jemand helfen?

von Frank aus Köln (Gast)


Lesenswert?

Hallo Kike,

lt. datenblatt hast Du recht und musst als Adresse 0xC0 senden, was 
Deinem bin wert entspricht. Aber hast du mal versucht einfach weiter zu 
schreiben ? Evtl. könnte auch das "lcd_command" timing nicht stimmen.(zu 
schnell ?)
Ich habe leider so ein Display nicht zum testen hier, aber ich brech mir 
auch immer einen ab mit den Adressen. In diesem fall schreibe ich 
einfach weiter und schaue ab wann sich wieder was auf dem Display tut.

Gruß aus Köln

Frank

von Christian R. (mrrotzi)


Lesenswert?

Kike wrote:
> Ich habe das LCD161A (Reichelt) welches ein 16x1 LCD ist.

wie willst du bei einem 16x1 LCD in die 2. Zeile schreiben?

von Jack B. (jackbraun)


Lesenswert?

Es gibt zwei Möglichkeiten:

Wenn Dein LCD 2x8 organisiert ist, muß es 2-zeilig initialisiert werden.
Hast Du das gemacht?

Falls es aber ein echtes 1x16 LCD ist, springst Du mit C0Hex(Position 1)
in den nicht sichtbaren Bereich.

von Frank aus Köln (Gast)


Lesenswert?

Hallo Christian R.

laut Datenblatt muss er nach dem 8.ten zeichen die Adresse ändern,
was bei einem 2 oder 4 Zeiligen Display die 2.te zeile wäre.

Gruß aus Köln

Frank

von nobody (Gast)


Lesenswert?


von Frank aus Köln (Gast)


Lesenswert?

@nobody

schöne Seite, kannte ich noch nicht.

Gruß aus Köln

Frank

von Kike (Gast)


Lesenswert?

Danke für die Antworten!
Klappen tut es noch nicht:(
Ich hab' im Datenblatt gesehen dass das LCD eine interne initialisation 
macht und hab' mir gedacht dass meinen init vielleicht nicht ganz funzt 
und die "default init" bleibt. Dann hab' ich gesehen das diese "default 
init" ein 1-zeiligas LCD einstellt und hab' gedacht: 'Bingo, das wird's 
sein!' Jedoch wird auch 'Display Off' eingestellt aber ich sehe ja die 
erste Zeile, was ja bedeutet das meine init geklapt hat und 'display on' 
geschaltet wurde, und somit auch 2-zeilig....
Hier meine init:

lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne powerupwait
           ldi temp1, 0b00000011        ; muss 3mal hintereinander 
gesendet
           out PORTA, temp1             ; werden zur Initialisierung
           rcall lcd_enable             ; 1
           rcall delay5ms
           rcall lcd_enable             ; 2
           rcall delay5ms
           rcall lcd_enable             ; und 3!
           rcall delay5ms
           rcall lcd_enable
           rcall delay5ms
           ldi temp1, 0b00101000        ; 4Bit  2 Zeilen  5x8
           rcall lcd_command
           ldi temp1, 0b00001100       ;Display ein/Cursor aus/kein 
Blinken
           rcall lcd_command
           ldi temp1, 0b00000100        ; inkrement / kein Scrollen
           rcall lcd_command
           ret

Ich weiss nicht mehr wo ich den Fehler suchen soll...

von Kike (Gast)


Lesenswert?

Ich hab' jetzt das gemacht was Frank weiter oben meinte: einfach weiter 
schreiben. Was rauskommt ist das in den ersten 8 feldern Zeichen sind, 
die im Program fast am Ende sind. Doch die zweiten 8 Felder sind immer 
noch leer....
Kann mir bitte jemand helfen?

von Der Hubert (Gast)


Lesenswert?

Solange Du nicht erklärst, wie Du bei einem einzeiligen Display in die 
2.  (nichtvorhandene) Zeile schreiben willst, wird da wohl keiner helfen 
können ....

von fnah (Gast)


Lesenswert?

>Solange Du nicht erklärst, wie Du bei einem einzeiligen Display in die
>2.  (nichtvorhandene) Zeile schreiben willst, wird da wohl keiner helfen
>können ....
ist doch schon laengst geklaert, es ist intern als 2x8 organisiert.
wer lesen kann ist klar im vorteil.

von Frank aus Köln (Gast)


Lesenswert?

Wenn Du das Display anschliesst, also ohne Initialisierung, siehst Du 
dann den obligatorischen "schwarzen Balken" ?
Ist der dann durchgehend, also alle 16 Segmente an ?
Nicht das das Display defekt ist.

Gruß

Frank

von Der Hubert (Gast)


Lesenswert?

Nein, das hast Du nicht ....

Du hast zwar was von 2zeilig geschriebn aber nicht, daß es eigentlich 
ein 2x8 Display ist.

Und ich kann immer noch nicht erkennen, wo hier Deine 2. Zeile sein soll 
....

http://www.reichelt.de/bilder/web/bauelemente/A500/LCD161A.jpg

Entweder handelt es sich bei Deinem Teil nicht um ein 16x1 von Reichelt 
oder die haben da noch was im Programm, was bei mir trotzdem immer 16x1 
anzeigt, obwohl es 8x2 sein sollte ....

von Der Hubert (Gast)


Lesenswert?

Ok, ich gestehe ....

von Hannes L. (hannes)


Lesenswert?

Der Hubert wrote:
> Solange Du nicht erklärst, wie Du bei einem einzeiligen Display in die
> 2.  (nichtvorhandene) Zeile schreiben willst, wird da wohl keiner helfen
> können ....

Das stimmt so nicht...
Die meisten 1x16-LCDs sind als 2x8-LCDs organisiert. Meist stimmt das 
Timing nicht, da der Benutzer versucht, den AVR möglichst schnell zu 
takten (das bringt ja Power, wie beim PC, meiner iss besser als 
Deiner...), aber nicht in der Lage ist, das LCD-Timing anzupassen. 
Andererseits soll es auch LCDs geben, die es etwas gemütlicher brauchen.

Da ich exakt dieses LCD nicht habe und vermutlich auch nicht kaufen 
werde, kann ich Dir keinen wirklich funktionierenden Treiber 
schreiben...

...

von Der Hubert (Gast)


Lesenswert?

Das Dingen sind 2 Displays je 8 Zeichen hintereinander ....

von Michael U. (Gast)


Lesenswert?

Hallo,

2 Sachen fallen mir auf: Du sendest nicht 3x sondern 4x die 0x03 im 
Init.

Die 4. schaltet das Display eigentlich schon in den 8Bit/1Zeile-Mode.

Danach sendest Du dann im 4Bit Mode 4Bit/2Zeilen.
Die unteren 4Bit dürfte das Display ignorieren, weil es bei diesem 
Befehl noch im 8Bit-Mode ist.

Ändere das mal wie folgt:


           ldi temp1, 0b00000011        ; muss 3mal hintereinander
gesendet
           out PORTA, temp1             ; werden zur Initialisierung
           rcall lcd_enable             ; 1
           rcall delay5ms
           rcall lcd_enable             ; 2
           rcall delay5ms
           rcall lcd_enable             ; und 3!
           rcall delay5ms

-->        ldi temp1, 0b00000010        ; 4-Bit-Mode einschalten
-->        out PORTA, temp1

           rcall lcd_enable
           rcall delay5ms

           ldi temp1, 0b00101000        ; 4Bit  2 Zeilen  5x8
           rcall lcd_command
           ldi temp1, 0b00001100       ;Display ein/Cursor aus/kein
Blinken
           rcall lcd_command
           ldi temp1, 0b00000100        ; inkrement / kein Scrollen
           rcall lcd_command
           ret


Sollte so klappen.

Gruß aus Berlin
Michael


von Frank aus Köln (Gast)


Lesenswert?

Also irgendwo im Bereich ab 0x80 bis 0xff oder b10000000 bis b11111111 
muss
das Display irgenwas anzeigen, vorrausgesetzt die Timings stimmen.

Gruß

Frank

von Kike (Gast)


Lesenswert?

Wenn ich Vss, Vcc und Vee anschliesse, und sonst nichts, kommt ein 8 
Feld langer Balken, also genau die 8 Felder, die später den Text zeigen. 
Aber im Datenblatt steht dass bei Spannungsanschluss intern resetet 
wird, und bei diesem reset wird auf ein einzeiliges display gestellt, 
womit es doch Sinn macht dass nur 8 Felder beim Spannungsanschluss 
gesehen werden, oder?

Ich hab' jezt auch probiert mal den Text auf blinkend zu setzen, funzt 
nicht. Deshalb nehme ich mal an dass es irgendetwas mit LCD_COMMAND 
zutun hat. Der code ist vom tutorial von dieser Seite. Ich habe auch 
gelesen dass die verschiedenen LCD Kontroller nicht immer 100% 
kompatibel sind. Nur weiss ich jetzt nicht mehr was ich tun kann bzw. 
muss....

von Frank aus Köln (Gast)


Lesenswert?

Dann versuch doch mal das timing auf gaaaanz langsam runterzusetzen.
Vieleicht bist Du nur zu schnell.

Gruß

Frank

von Andreas K. (oldcoolman)


Lesenswert?

Hallo,
kann man nicht durch Kontrastaufdrehen sehen,ob die 2. Zeile
(also die 2. 8Zeichen)richtig initialisiert sind?

Gruß
Andi

ups..hab wohl zu lange gelesen und ned aktualisiert...

von Spess53 (Gast)


Lesenswert?

Hi

>ist doch schon laengst geklaert, es ist intern als 2x8 organisiert.
>wer lesen kann ist klar im vorteil.

In der Tabelle im Datenblatt steht aber nur 'First Line'

Wer lesen kann ...!!!

MfG Spess

von Kike (Gast)


Lesenswert?

@  Michael U.

Danke Michael!!! Das war die Stelle!! (Man kommt sich immer so blöd vor 
wenn der Fehler erst mal gefunden ist...Ich kann nicht mehr bis 3 
zählen...)

Und danke auch an alle anderen für eure Hilfe!!

von Thomas Strauß (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Kike,

ich hab das selbe Display LCD161A. Das hat einen KS0066 unter schwarzem 
Epoxy und läuft als 2-Zeilen-Display. Die 1.Zeile wird von 0-7 
addressiert. Die zweite von 40h bis 47h.

Wenn man von 0-15 (0-0fh) adressiert, bleiben die letzten 8 Zeichen auf 
der Strecke.

Gruß Thomas
Anhang - Datenblatt

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.