Forum: Compiler & IDEs 4X20 LCD SPINNT


von Andrea S. (Gast)


Lesenswert?

Guten Tag.

Ich habe ein 4x20er LCD-Display an einen ATmega32 angeschlossen, um ihn
im 4-Bit-I/O-Modus zu betreiben.
Die lcd.h habe ich wie folgt angepasst:
#define XTAL 4000000
#define LCD_LINES           4
#define LCD_DISP_LENGTH    20
#define LCD_LINE_LENGTH  0x13
#define LCD_START_LINE1  0x00
#define LCD_START_LINE2  0x20
#define LCD_START_LINE3  0x40
#define LCD_START_LINE4  0x60
#define LCD_WRAP_LINES      0
#define LCD_IO_MODE      1
#define LCD_PORT         PORTA

Wenn ich nun folgende Befehle ausführe:
#include"lcd.h"
int main(void)
{ lcd_init(LCD_DISP_ON_CURSOR_BLINK);
  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");
  while(1); }
erscheint auf dem Display nur:
++--------------------+
||A                   |
||                    |
||C                   |
||                    |
++--------------------+

Was ist da los?
Liegt es an der Library?
Oder an meinen Defines?
Oder an was ganz anderem?

von Klaus (Gast)


Lesenswert?

Welches Display?
Welche Bibliothek hast du verwendet?

Schreibt das Display nur 'A' und 'C' in die erste und dritte Zeile
oder wo ist das Problem? :-)

von Andrea S. (Gast)


Lesenswert?

> Welches Display?

"EA DIP204-4" von Reichelt

> Welche Bibliothek hast du verwendet?

Die von Peter Fleury

> Schreibt das Display nur 'A' und 'C' in die erste und dritte
Zeile
oder wo ist das Problem? :-)

Genau das ist das Problem.
Eigendlich sollte die Ausgabe so aussehen:
++--------------------+
||A                   |
||B                   |
||C                   |
||D                   |
++--------------------+

von Sascha (Gast)


Lesenswert?

Hi,

versuch es mal damit. Beachte die LCD_START_LINE von Zeile 2 und 4!

#define LCD_START_LINE1  0x00     /* DDRAM address of first char of
line 1 */
#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 */
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of
line 4 */

Mfg Sascha

von Andrea S. (Gast)


Lesenswert?

Jetzt sieht's so aus:

++--------------------+
||A                   |
||        C           |
||B                   |
||        D           |
++--------------------+

Irgendwie auch nicht besser...

von Mike (Gast)


Lesenswert?

Dann bleibt dir wohl nichts anderes übrig, als die lcd_init (...)
verstehen zu lernen und anhand deines Datenblattes anzupassen ...

Es gibt zwar viele Display-Controller, die sich HDD...-kompatibel
nennen, doch irgendwie hat doch jeder seine Macke.

von Alex (Gast)


Lesenswert?

Hallo Andrea,

hattest du dir schon die Mühe gemacht, dir die Startadressen aus dem
Datenblatt zu suchen?
Ich habe mal mit einem 4*20 Display von Reichelt gearbeitet. Dort waren
die Startadressen der Zeilen:

#define LCD_START_LINE1  0x00
#define LCD_START_LINE2  0x40
#define LCD_START_LINE3  0x10
#define LCD_START_LINE4  0x50

Im Zweifel aber immer ins eigene Datenblatt schauen, ist doch nicht so
schwierig :-)

von Andrea S. (Gast)


Lesenswert?

> hattest du dir schon die Mühe gemacht, dir die Startadressen aus dem
> Datenblatt zu suchen?
> Ich habe mal mit einem 4*20 Display von Reichelt gearbeitet. Dort
waren
> die Startadressen der Zeilen:

> #define LCD_START_LINE1  0x00
> #define LCD_START_LINE2  0x40
> #define LCD_START_LINE3  0x10
> #define LCD_START_LINE4  0x50

> Im Zweifel aber immer ins eigene Datenblatt schauen, ist doch nicht
so
> schwierig :-)

Ich habe ins Datenblatt geschaut. Ich hab's mir sogar 10 mal
durgelesen, weil ich den Eindruck hatte, etwas vergessen zu haben.
Im Datenblatt stehen bei mir aber die Startadressen, die in meinem
ersten Beitrag zu sehen sind. Wenn du willst kann ich ein Beweisphoto
posten.
Deine Startadressen sind scheinbar auch nicht korrekt, da die Ausgabe
jetzt noch ein Stück verwirrender aussieht:
++--------------------+
||A               C   |
||    C               |
||B               D   |
||    D               |
++--------------------+
Scheinbar habe ich jetzt auch zwer Cursor: Jeweils einer hinter jedem
D.

von Sascha (Gast)


Lesenswert?

Vielleicht liegts ja daran?

#define LCD_LINE_LENGTH  0x13     /**< internal line length of the
display    */


bei mir steht:
#define LCD_LINE_LENGTH  0x40     /**< internal line length of the
display    */


Ist auch ein 20*4

mfg sascha

von Andrea S. (Gast)


Lesenswert?

Nein, Das hat leider nichts verändert.

von Thorsten (Gast)


Lesenswert?

Bei meinem Display sind die Startadressen wie folgt:

#define LINE1 0x00
#define LINE2 0x40
#define LINE3 0x10
#define LINE4 0x50

von Alex (Gast)


Lesenswert?

Kannst du mal die Bezeichnung des Displaycontrollers heraus finden?

Schon mal mit dem Parameter LCD_WRAP_LINES rumgespielt, also mal auf 1
gesetzt?

von Andrea S. (Gast)


Lesenswert?

> Kannst du mal die Bezeichnung des Displaycontrollers heraus finden?

Laut Datenblatt ist es ein KS0073, der angeblich "NAHEZU 100% HD44780
KOMPATIBEL" ist

> Schon mal mit dem Parameter LCD_WRAP_LINES rumgespielt, also mal auf
1
> gesetzt?

Ja, der ändert aber auch nichts.

von Alex (Gast)


Lesenswert?

Jetzt wird mit einiges klar :-)

Da bist du nicht die einzige mit dem Problem, habe in einem anderen
Thread bereits eine Lösung gepostet:

http://www.mikrocontroller.net/forum/read-1-119278.html#new

Alex

von Andrea S. (Gast)


Lesenswert?

@Alex:
Ich habe mal deine modifizierte Version der Library ausprobiert, und da
seh ich auf dem Display das folgende:
++--------------------+
||A                   |
||        }}}}}}}}}}}}|
||C                   |
||        }}}}}}}}}}}}|
++--------------------+
Womit wir wieder am Anfang wären, mit dem Unterschied, dass jetzt
geschweifte Klammern aufgetaucht sind.
So langsam aber sicher verzweifle ich...

von Alex (Gast)


Lesenswert?

Tut mir leid, jetzt muss ich auch passen.

von mastercpp (Gast)


Lesenswert?

Öffne lcd.c, gehe in die Funktion lcd_init(uint8_t) (ganz am Ende der
Datei) und verschiebe die drei von Alex eingefügten Befehle, die sich
ganz am Ende der Funkton befinden direkt hinter das #endif.
Das sieht dann so aus:

[...]
    /* reset LCD */
    delay(16000);                           /* wait 16ms after power-on
    */
    lcd_write(LCD_FUNCTION_8BIT_1LINE,0);   /* function set: 8bit
interface */
    delay(4992);                            /* wait 5ms
    */
    lcd_write(LCD_FUNCTION_8BIT_1LINE,0);   /* function set: 8bit
interface */
    delay(64);                              /* wait 64us
    */
    lcd_write(LCD_FUNCTION_8BIT_1LINE,0);   /* function set: 8bit
interface */
    delay(64);                              /* wait 64us
    */
#endif
    lcd_command (0x2C);
    lcd_command (0x09);
    lcd_command (0x28);

    lcd_command(LCD_FUNCTION_DEFAULT);      /* function set: display
lines  */
    lcd_command(LCD_DISP_OFF);              /* display off
    */
    lcd_clrscr();                           /* display clear
    */
    lcd_command(LCD_MODE_DEFAULT);          /* set entry mode
    */
    lcd_command(dispAttr);                  /* display/cursor control
    */

}/* lcd_init */
[...]

von Andrea S. (Gast)


Lesenswert?

So funktioniert's. Danke an alle.

von Daniel H. (Gast)


Lesenswert?

Die Änderungen funktionieren super, aber ich nutze jetzt das EA DIP
204-6 - das hat noch eine Statuszeile wo man vordefinierte Symbole
anzeigen kann.
Hat jemand eine Idee, wie ich diese Symbole nutzen kann?

von Daniel H. (Gast)


Lesenswert?

Ich habe jetzt die *.h und die *.c auf das Display EA DIP 204-6
angepasst. Ich hoffe P. Fleury hat nichts dagegen, oder?
thx nochmal
Daniel

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.