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?
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
Kike wrote:
> Ich habe das LCD161A (Reichelt) welches ein 16x1 LCD ist.
wie willst du bei einem 16x1 LCD in die 2. Zeile schreiben?
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.
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
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...
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?
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 ....
>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.
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
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 ....
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... ...
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
Also irgendwo im Bereich ab 0x80 bis 0xff oder b10000000 bis b11111111 muss das Display irgenwas anzeigen, vorrausgesetzt die Timings stimmen. Gruß Frank
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....
Dann versuch doch mal das timing auf gaaaanz langsam runterzusetzen. Vieleicht bist Du nur zu schnell. Gruß Frank
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...
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
@ 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!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.