Forum: Mikrocontroller und Digitale Elektronik LCD-Testprogramm Verständnisproblem


von Walter K. (satyrix)


Lesenswert?

Hallo Leute,

wenn ich folgenden Quellcode an mein 2 zeiliges LCD-Display (HD44870) 
übertrage erscheint in der ersten Zeile das Symbol * und in der zweiten 
Zeile die Zahl 42. Wie sehe ich, dass das Symbol * in die erste Zeile 
soll und wie mussich vorgehen, wenn ich das Symbol in der zweiten Zeile 
haben will.
Danke im Voraus


//
// Anpassungen im makefile:
//    ATMega8 => MCU=atmega8 im makefile einstellen
//    lcd-routines.c in SRC = ... Zeile anhängen
//
#include <avr/io.h>
#include <stdlib.h>
#include "lcd-routines.h"

// Beispiel
int variable = 42;

int main(void)
{
  lcd_init();

  // Ausgabe des Zeichens dessen ASCII-Code gleich dem Variablenwert ist
  // (Im Beispiel entspricht der ASCII-Code 42 dem Zeichen *)
  // http://www.code-knacker.de/ascii.htm
  lcd_data( variable );

  lcd_setcursor( 0, 2 );

  // Ausgabe der Variable als Text in dezimaler Schreibweise
  {
     // ... umwandeln siehe FAQ Artikel bei 
http://www.mikrocontroller.net/Articles/FAQ
     // WinAVR hat eine itoa()-Funktion, das erfordert obiges #include 
<stdlib.h>
     char Buffer[20]; // in diesem {} lokal
     itoa( variable, Buffer, 10 );

     // ... ausgeben
     lcd_string( Buffer );
  }

  while(1)
  {
  }

  return 0;
}

von Karl H. (kbuchegg)


Lesenswert?

Walter Klevenz schrieb:

> Zeile die Zahl 42. Wie sehe ich, dass das Symbol * in die erste Zeile
> soll

Das ist implizit.
Wird das LCD initialisiert beginnt es links oben in der ersten Zeile, 
erste Spalte mit der Ausgabe
(*)

> und wie mussich vorgehen, wenn ich das Symbol in der zweiten Zeile
> haben will.

Die Ausgabeposition nennt man allgemein den 'Cursor'. Dort wo der Cursor 
steht, wird das nächste Zeichen ausgegeben (und der Cursor wandert eine 
Position weiter)

Was in deinem Code erinnert dich vom Namen her an 'den Cursor' und 
könnte daher zur Steuerung bzw. gezielten Positionierung des 'Cursors' 
verantwortlich sein?

(*) Diese Aussage ist gleichwertig mit:
Nach dem Initialisieren steht der Cursor in Zeile 0, Spalte 0

von Walter K. (satyrix)


Lesenswert?

Vielen Dank,
also heißt das, dass bei der Erstinitialisierung der Cursor in Zeile 1 
an Position 0 steht. Wie sieht es aber aus, wenn ich bei dem Befehl
lcd_string( Buffer );
diese Ausgabe in Zeile 2 anzeigen lassen will und
lcd_data( variable );
lcd_setcursor( 0, 2 );
in Zeile 1 haben möchte?
Bei lcd_setcursor(0, 2 ); sieht man ja, dass Zeile 2 gemeint ist, aber 
bei dem anderen nicht.
Vielen Dank im Voraus!!

von Karl H. (kbuchegg)


Lesenswert?

Wie bereits gesagt, darfst du dir gerne nach dem lcd_init ein implizites 
lcd_setcursor dazudenken. Denn genau das ist der Zustand, in dem das LCD 
nach dem init ist. Und den kennst du, der ist immer nach dem Init so.

Deine Sequenz ist dann
1
  lcd_init();
2
  lcd_setcursor( 0, 1 );
3
4
  lcd_data( variable );
5
6
  lcd_setcursor( 0, 2 );
7
  ...
8
  lcd_string( Buffer );
9
}

jetzt noch ein bisschen die Leerzeile umgruppieren
1
  lcd_init();
2
3
  // Einzelzeichen ausgeben
4
  lcd_setcursor( 0, 1 );    // alle weitere ab Zeile 1/Spalte 0 ausgeben
5
  lcd_data( variable );
6
7
  // Zahl in String umwandeln und ausgeben
8
  lcd_setcursor( 0, 2 );    // alles weitere ab Zeile 2/Spalte 0 ausgeben
9
  ...
10
  lcd_string( Buffer );
11
}

wenn du jetzt die Einzelteile an anderen Stellen am LCD haben willst, wo 
wirst du daher eingreifen müssen?

Zuerst den Cursor positionieren .... dann ausgeben.

von Walter K. (satyrix)


Lesenswert?

Vielen Dank Herr Buchegger,

das habe ich verstanden dank Ihrer guten Erklärung.
Nun noch eine Frage: Wenn ich nun mehrere Variable verwenden will
wie z.B. int variable = 42;
         int variable1 = 52;
         int variable2 = 62;
Kann ich das dann auch irgendwie alles in einer Zeile (Kurzschreibweise)
unterbringen?
Außerdem noch:
Wie kann ich in C einen String deklarieren?
Vielen Dank im Voraus

von Karl H. (kbuchegg)


Lesenswert?

Walter Klevenz schrieb:
> Vielen Dank Herr Buchegger,

Huch!
Ich bin der Karl Heinz. Der "Herr" Buchegger ist mein Vater.


(Im Ernst: In Foren geht es nicht förmlich zu. Wir sind hier automatisch 
per Du)

> das habe ich verstanden dank Ihrer guten Erklärung.
> Nun noch eine Frage: Wenn ich nun mehrere Variable verwenden will
> wie z.B. int variable = 42;
>          int variable1 = 52;
>          int variable2 = 62;
> Kann ich das dann auch irgendwie alles in einer Zeile (Kurzschreibweise)
> unterbringen?

Vor allen Dingen brauchst du jetzt erst mal ganz dringend ein C-Buch!

  int a = 5, b = 8, c = 9, d, e = 43;

> Außerdem noch:
> Wie kann ich in C einen String deklarieren?

   lcd_string( "Hallo Welt" );

   char* test = "Hallo Welt";
   lcd_string( test );


   char test2[] = "Noch mal hallo"
   lcd_string( test2 );


String-Verarbeitung in C
(Das ist die Kurzfassung! Du brauchst trotzdem ein C-Buch)

von Walter K. (satyrix)


Lesenswert?

Hallo Karl Heinz,

nochmals vielen Dank für deine Hilfe!!
Ein C-Buch werde ich mir wohl noch zulegen!

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.