www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 4x20 LCD HD44780 - Zeilenumbruch - FleuryLib


Autor: Ed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich verzweifle gerade an der besagten Library. Ich schaffe es nicht, 
dass das Display eine Zeile nach der anderen vollschreibt. LCD läuft im 
4bit Modus an einem Atmega32 mit 4Mhz Quarzoszillator.

Zum Beispiel:
lcd_puts("1234567891234567891234567891234abcdefghijklmnopqrstuvwxyz........");

Liefert am Display:
12345678912345678912
jklmnopqrstuvwxyz...
34567891234abcdefghi
.....

Die interessanten Zeilen in der Library sehen so aus:
#define LCD_LINES  4  /**< number of visible lines of the display */
#define LCD_DISP_LENGTH 20 /**< visibles characters per line of the display */
#define LCD_LINE_LENGTH 0x40 /**< internal line length of the display    */
#define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
#define LCD_START_LINE2 0x14 /**< DDRAM address of first char of line 2 */
#define LCD_START_LINE3 0x40 /**< DDRAM address of first char of line 3 */
#define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
#define LCD_WRAP_LINES 1 /**< 0: no wrap, 1: wrap at end of visibile line 
Ich habe schon alle möglichen Kombinationen mit verschiedenen Adressen 
versucht. Bekomme das einfach nicht hin. Weiters ist mir nicht klar was 
"internal line lenght" meinen soll.

Bitte um Hilfe! Danke im Voraus!

Mfg Ed

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich verzweifle gerade an der besagten Library. Ich schaffe es nicht,
>dass das Display eine Zeile nach der anderen vollschreibt. LCD läuft im
>4bit Modus an einem Atmega32 mit 4Mhz Quarzoszillator.
>
>Zum Beispiel:
>
>lcd_puts("1234567891234567891234567891234abcdefghijklmnopqrstuvwxyz.... ....");

Für den Zeilenumbruch musst du schon selber sorgen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne die Lib nicht im Detail, aber vermutlich zählt sie
die Zeichen einfach nicht mit und schreibt den Text in
fortlaufende Adressen.
Dann sieht es eben so aus.

Wer sagt, daß ein automatischer sinnvoller Zeilenumbruch
stattfinden muß?

Autor: Ed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiters führt die falsche Zeilenreihenfolge dazu, dass
lcd_gotoxy(0,0);  
lcd_puts("A");
lcd_gotoxy(0,1);  
lcd_puts("B");
lcd_gotoxy(0,2);  
lcd_puts("C");
lcd_gotoxy(0,3);  
lcd_puts("D");

zu einer Ausgabe am Display führt die so aussieht:
A
C
B
D

Die Beschreibung von lcd_gotoxy(x,y) lautet:
/*
 @brief    Set cursor to specified position
 @param    x horizontal position\n (0: left most position)
 @param    y vertical position\n   (0: first line)
 @return   none
*/
extern void lcd_gotoxy(uint8_t x, uint8_t y);

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Ed,
Du weißt aber schon was die oben gezeigten Einstellungen bedeuten?

Probiere mal diese Daten
#define LCD_LINES  4  /**< number of visible lines of the display */
#define LCD_DISP_LENGTH 20 /**< visibles characters per line of the display */
#define LCD_LINE_LENGTH 20 /**< internal line length of the display    */
#define LCD_START_LINE1 0x80 /**< DDRAM address of first char of line 1 */
#define LCD_START_LINE2 0xC0 /**< DDRAM address of first char of line 2 */
#define LCD_START_LINE3 0x94 /**< DDRAM address of first char of line 3 */
#define LCD_START_LINE4 0xD4 /**< DDRAM address of first char of line 4 */
#define LCD_WRAP_LINES 1 /**< 0: no wrap, 1: wrap at end of visibile line 

So wird mein Display angesteuert und damit klappt es.

Gruß Harry

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte eben dein Eintrag gelesen, dann ist es doch ganz einfach:

Ändere einfach die 2 Zeilen in deiner Config
#define LCD_START_LINE2 0x14 /**< DDRAM address of first char of line 2 */
#define LCD_START_LINE3 0x40 /**< DDRAM address of first char of line 3 */

in 
#define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
#define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */


dann sollte es auch klappen!

Gruß Harry

Autor: Ed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die 2 Werte getauscht. Die Zeilenauswahl mit lcd_goto(x,y) 
funktioniert jetzt. Weiters kann ich mit "\n" im String eine Zeile 
tiefer springen.

Wenn ich über eine Zeile schreibe (ein String mit mehr als 20 Zeichen) 
springt er immer noch in die falsche Zeile (Zeilenreihenfolge 1-3-2-4).

Leider sind meine C-Kenntnise nicht umfangreich genug, um die Lib 
vollständig zu verstehen. Dann könnte ich feststellen, ob dies auf 
falschen Angaben bei Adressen oder Zeilenlängen zurückzuführen ist oder 
dies einfach nicht für 4 Zeilige Displays berücksichtigt wird.

Ich werde Strings >40 Zeichen vermeiden. Vielen Dank!

Mit freundlichen Grüßen
Ed

Autor: Ed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meine natürlich "Strings >20 Zeichen".
Sry

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.