In 2. Zeile von LCD springen

Gast #598571
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?
Gast #598578
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
Gast #598749
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...
Gast #598875
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?
Gast #598895
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.
Gast #598896
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
Gast #598897
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 ....
#598901
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...

...
Gast #598903
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

Gast #598908
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....
Gast #598919
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
Gast #598922
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!!
Gast #601884
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren