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


von Ed (Gast)


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:
1
lcd_puts("1234567891234567891234567891234abcdefghijklmnopqrstuvwxyz........");

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

Die interessanten Zeilen in der Library sehen so aus:
1
#define LCD_LINES  4  /**< number of visible lines of the display */
2
#define LCD_DISP_LENGTH 20 /**< visibles characters per line of the display */
3
#define LCD_LINE_LENGTH 0x40 /**< internal line length of the display    */
4
#define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
5
#define LCD_START_LINE2 0x14 /**< DDRAM address of first char of line 2 */
6
#define LCD_START_LINE3 0x40 /**< DDRAM address of first char of line 3 */
7
#define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
8
#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

von holger (Gast)


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.

von Klaus W. (mfgkw)


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ß?

von Ed (Gast)


Lesenswert?

Weiters führt die falsche Zeilenreihenfolge dazu, dass
1
lcd_gotoxy(0,0);  
2
lcd_puts("A");
3
lcd_gotoxy(0,1);  
4
lcd_puts("B");
5
lcd_gotoxy(0,2);  
6
lcd_puts("C");
7
lcd_gotoxy(0,3);  
8
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:
1
/*
2
 @brief    Set cursor to specified position
3
 @param    x horizontal position\n (0: left most position)
4
 @param    y vertical position\n   (0: first line)
5
 @return   none
6
*/
7
extern void lcd_gotoxy(uint8_t x, uint8_t y);

von Harry S. (littlegonzo)


Lesenswert?

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

Probiere mal diese Daten
1
#define LCD_LINES  4  /**< number of visible lines of the display */
2
#define LCD_DISP_LENGTH 20 /**< visibles characters per line of the display */
3
#define LCD_LINE_LENGTH 20 /**< internal line length of the display    */
4
#define LCD_START_LINE1 0x80 /**< DDRAM address of first char of line 1 */
5
#define LCD_START_LINE2 0xC0 /**< DDRAM address of first char of line 2 */
6
#define LCD_START_LINE3 0x94 /**< DDRAM address of first char of line 3 */
7
#define LCD_START_LINE4 0xD4 /**< DDRAM address of first char of line 4 */
8
#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

von Harry S. (littlegonzo)


Lesenswert?

Hatte eben dein Eintrag gelesen, dann ist es doch ganz einfach:

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

dann sollte es auch klappen!

Gruß Harry

von Ed (Gast)


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

von Ed (Gast)


Lesenswert?

Ich meine natürlich "Strings >20 Zeichen".
Sry

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.