Forum: Mikrocontroller und Digitale Elektronik LCD-Ansteuerung mit ATmega16


von Wowako (Gast)


Lesenswert?

Ich möchte ein 1*16 LCD-Display, mit Controller HD44780 im 4Bit-Mode 
ansteuern. Im Prinzip klappt es. Ich muss aber die Ausgabe nach jeweils 
8 Zeichen umschalten, damit die zweite Displayhälfte beschrieben werden 
kann. Hier der Auszug der Testsoftware:
int main(void)
{
  lcd_init();
  lcd_string("12345678");    // Ausgabe der ersten 8 Zeichen
  lcd_setcursor( 0, 2 );     // Umsetzen des Cursors
  lcd_string("abcdefg");     // Beschreiben der rechten Displayhälfte
 .
 .
 .
}

Meine Frage: Kennt jemand eine elegante Lösung, wie ich die Umsetzung 
nach den ersten 8 Zeichen umgehen kann und einen längeren Text (bis 16 
Zeichen) an einem Stück einschreiben kann?
Es wäre nett, wenn mir hier jemand weiterhelfen würde.
Besten Dank im Voraus.

Wowako

von Andreas W. (geier99)


Lesenswert?

Wowako schrieb:
> Meine Frage: Kennt jemand eine elegante Lösung, wie ich die Umsetzung
> nach den ersten 8 Zeichen umgehen kann und einen längeren Text (bis 16
> Zeichen) an einem Stück einschreiben kann?
1
 int main(void)
2
{
3
   lcd_init();
4
   lcd_string("12345678abcdefg");    // Ausgabe der ersten x Zeichen
5
.....

von Wowako (Gast)


Lesenswert?

Hallo Andreas,

danke, genau da liegt ja der Hund begraben.
Wenn ich die Zeile in
"lcd_string("12345678abcdefg");"
ändere wir nur "12345678" angezeigt. Die restlichen rechten 8 Stellen 
sind blank.

von pedro (Gast)


Lesenswert?

1
int lcd_putchar(char c, FILE *unused){
2
  static bool nl_seen;
3
4
  if (c == '\r')  //set cursor to second line  {
5
      dogm_gotoxy(0, 1);
6
  }
7
  else if (nl_seen && c != '\n')  {
8
  /*
9
  * First character after newline, clear display and home cursor.
10
  */
11
    
12
  dogm_clear();
13
  dogm_gotoxy(0,0);
14
15
  nl_seen = false;
16
  }
17
18
  if (c == '\n'){
19
      nl_seen = true;
20
  }
21
  else if (c != '\r')  {
22
      dogm_putc(c);
23
  }
24
25
  return 0;
26
}

Ich habe das mit Steuerzeichen gelöst. Danach wurde diese Funktion auf 
printf() gelinkt.
1
  //linking stdout to EA DOGM162L-A Display
2
  static FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);
3
  stdout = &lcd_str;  //Standardausgabe auf obigen Stream setzen
Den String kann man dan mit printf("1. Linie\n2. Linie\r") ausgeben.

von Wowako (Gast)


Lesenswert?

Danke, ich werde es mal ausprobieren.
Aber was ist die Ursache für dieses Verhalten?

von Peter D. (peda)


Lesenswert?

Es gibt LCDs 1*16, die intern als 2*8 verschaltet sind.

Dann brauchst Du eine LCD-Lib, die die Zeichen mitzählt und einen 
Zeilenumbruch macht, z.B.:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=102296


Peter

von Wowako (Gast)


Lesenswert?

Hallo Peter,

deine Erklärung mit der internen Verschaltung ist richtig.

Nur mit:

" Dann brauchst Du eine LCD-Lib, die die Zeichen mitzählt und einen
Zeilenumbruch macht, z.B.:

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...";

kann ich leider nicht viel Anfangen. Wäre es möglich mir hier genauere 
Infos zu geben?

Herzlichen Dank

Wowako

von Peter D. (peda)


Lesenswert?

Wowako schrieb:
> kann ich leider nicht viel Anfangen. Wäre es möglich mir hier genauere
> Infos zu geben?

Unten in dem Beitrag sind 2 Links zum Downloaden, der 1. ist für 
verschiedene LCDs.
Und dann definieren:
1
#define LCD_2X8       // some 1x16 are wired as 2x8


Peter

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.