Auf LCD Zahlen links- und rechtsbündig

Hallo zusammen,

ich bastel gerade die LCD-Anzeigen für meine Terminals. Es soll auch eine Funktion geben, die die eingegebenen Gesamtringe anzeigt. Das Problem ist: das sind 4 Zahlenwerte mit 1 bis 3 Ziffern - hab ich keinen direkten Einfluss drauf - wovon 2 linksbündig (kein Problem) und 2 rechtsbündig angezeigt werden sollen. Und ich hab keine Ahnung, wie ich die Ziffernanzahl einer Zahl raus finden kann, um mir so die Cursorposition der ersten Ziffern auszurechnen.

Kann mir da jemand helfen? Bei Google hab ich immer nur was mit einer Zahl pro Zeile gefunden, aber damit komm ich nicht weit.

Vielen Dank schon mal

LG

Fipsi

z.B. so:

char buf[4];
  uint8_t num = 3;
  
  sprintf(buf, "%04u", num);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.println(buf);

Edit 2: Also erst die Zahlen auf ein Format bringen, dann schieben mit setCurso, ansonsten wird schwer und du musst alles einzeln bestimmen.

%4u füllt übrigens den String mit Leerzeichen auf.

% = platzhalter %04 = 0 auffüllen mit '0' für die nächsten 4 stellen von links an u = unsigned int (nur positve ganze zahlen)

Edit: Eine ganze Zeile bearbeiten

char buf[20];
  uint8_t num1 = 1;
  uint8_t num2 = 2;
  uint8_t num3 = 3;
  
  sprintf(buf, "%03u - %03u - %03u", num1, num2, num3);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.println(buf);

Okay, ich glaub, das hab ich so weit verstanden. Aber geht das auch, dass ich bei führenden Nullen (also bei "095") nur die letzten zwei Ziffern schreibe, führende Nullen als Leerzeichen?

LG

Fipsi

Einfach %3u schreiben dann wirds mit Leerzeichen aufgefüllt

Linksbündig ist dann %-3u

Okay, vielen Dank. Ich kann's jetzt gerade leider nicht testen, weil ich die Hardware dazu nicht fertig hab, Aber wenn ich's soweit hab, meld ich mich hier zurück, ob's geklappt hat.

Vielen Dank und LG

Fipsi

Warum schreibst du dir nicht einfach eine eigene Funktion? Das ist mit Basic wissen machbar. Für sowas braucht man noch nicht einmal zwingend sprinf.

Okay, ja, ich glaube, so sollte es ja gehen:

        lcd.clear();
	lcd.setCursor(0,0);
	LCDErgebnisWriter(ringe[0][0],1);
	lcd.write("          ");
	LCDErgebnisWriter(ringe[1][0],2);
	lcd.setCursor(0,1);
	LCDErgebnisWriter(ringe[2][0],1);
	lcd.write("          ");
	LCDErgebnisWriter(ringe[3][0],2);
[...]
void LCDErgebnisWriter(int ring, int seite)
{
  if (ring >= 100)
  {
    lcd.write(ring);
  }
  else if (ring < 100)
  {
    if (ring >= 10)
	{
	  if (seite == 2) {
	    lcd.write(" "); }
	  lcd.write(ring);
	  if (seite == 1) {
	    lcd.wirte(" "); }
	}
	else if (ring < 10)
	{
	  if (seite == 2) {
	    lcd.write("  "); }
	  lcd.write(ring);
	  if (seite == 1) {
	    lcd.write("  "); }
	}
  }
}

LG

Fipsi

Hallo,

es gibt doch in der LiquidCrystal-Library einfache Befehle für rechts- und linksbündige Ausgabe: rightToLeft bzw. leftToRight

Ich bin zwar keine Leuchte in Englisch, aber heißt das nicht, dass der dann tbierhcs mureh trhekrev (=> verkehrt herum schreibt)?

LG

Fipsi

Ja tut er, deshalb musst du zusätzlich den String in umgekehrter Reihenfolge ausgeben. Um Grunde spart man sich damit nur die Länge des Strings vorher zu ermitteln und an die richtige Cursorposition zu springen. Da man die Länge zum umkehren braucht spart man sich also eigentlich nur den Cursor.

Ich mag aber eigentlich sprintf, und zwar nicht nur für einzelne kurze Strings, sondern um damit die ganze Display Zeile zu bauen bevor irgendwas ausgegeben wird:

uint8_t wert1 = 16;
uint8_t wert2 = 9;
char buffer[17];
Sprintf(buffer, "%3i          %3i", wert1, wert2); //Zwischen den  Anführungszeichen stehen genau 16 Zeichen, oder wieviele das Display eben hat.
LCD.setCursor(0,0);
Lcd.print(buffer);
  1. macht es die Formatierung viel einfacher, die Rechtsbüdigkeit erledigt sich von selbst. Wichtig ist nur dass man alle Werte mit fixer Länge, hier "3" formatiert.
  2. wird so immer jedes Zeichen des Displays neu beschrieben, was Artefakte komplett verhindert ohne clear() zu benutzen. (clear() ist unglaublich langsam). Die paar Byte die temporär durch die theoretisch überflüssigen Leerzeichen in buffer belegt werden sind wohl auf den aller meisten Plattformen verschmerzbar. Wenn man die Anzeige an verschiedenen Stellen, in verschiedenen Funktionen zusammen bauen muss bietet sich ein 2D-array display[Zeile][Zeichen] an, das man von überall bearbeiten, und an zentraler stelle einmal pro loop auf das LCD übertragen kann. So spart man sich das umher springen mit dem Cursor, was nach meiner Erfahrung ebenfalls einen Geschwindigkeitsvorteil bringen kann.

Du kannst das aber auch in wenigen Zeilen selber machen.
Da du, wenn ich das richtig verstanden habe, nur positive ganze Zahlen ausgeben willst, geht das ganz einfach. Im Beispiel werden maximal dreistellige Zahlen (<999) in Drei Stellen ausgegeben.

unsigned int Wert;
lcd.setCursor(0,0);
if (Wert < 100) lcd.print(" ");  
if (Wert < 10)  lcd.print(" ");
lcd.println(Wert);

Falls du auch negative Zahlen ausgeben willst, wirds eine Zeile länger:
Und die dreistellige Zahl braucht 4 Stellen im Display (eine für das Vorzeichen)

int Wert;
lcd.setCursor(0,0);
if (abs(Wert) < 100) lcd.print(" ");  
if (abs(Wert) < 10)  lcd.print(" ");
if (Wert > 0)        lcd.print(" ");
lcd.println(Wert);

guntherb: Ich hab ja so ziemlich das, was du geschrieben hast, auch in meinen Code geschrieben - wir mein vorletzter Post hier zeigt.

LG

Fipsi