Hilfestellung LCD Display

OP #7396471
Lesenswert?
• ▲
▼

Hallo,

ich nutze aktuell ein LCD Display mit insgesamt 8 Ziffern. Jede Ziffer besteht aus 7 einzelnen Segmente. Dieses Display werden über spezielle Segment und COM Leitung angesteuert.

Nun habe ich folgende Anforderung. Ich möchte zum Beispiel einen Wert von 0.001 Anzeigen. Jetzt kann es sein, dass der Anzeigewert plötzlich auf 10.000 sprint. Hier würde nun eine weitere Ziffer hinzugefügt. Es kann auch wiederum sein, dass der Anzeigewert wieder auf 0.002 springt. Das Anzeigen der Zahlen ist nicht so das Problem. Ich habe nur schwierigkeiten, wie man automatisch die führenden Nullen vermeiden kann, beziehungsweise wie eine weitere Ziffer hinzugefügt werden kann.

1
void LCD_Number(int value)
2
{
3
  int      i, com, bit, digit, div, neg;
4
  uint16_t bitpattern;
5
  uint16_t num;
6

7
  if (value >= NUM_VAL_MAX)
8
  {
9
    value = NUM_VAL_MAX;
10
  }
11
  if (value < NUM_VAL_MIN)
12
  {
13
    value = NUM_VAL_MIN;
14
  }
15
  if (value < 0)
16
  {
17
    value = abs(value);
18
    neg   = 1;
19
  }
20
  else
21
  {
22
    neg = 0;
23
  }
24

25
  LCD_LoadBusyWait();
26

27
  LCD_NumberOff();
28

29
  /* Extract useful digits */
30
  div = 1;
31
  for (digit = 0; digit < NUM_DIGITS; digit++)
32
  {
33
    num = (value / div) % 10;
34
    if ((neg == 1) && (digit == (NUM_DIGITS - 1)))
35
    {
36
      num = signIndex;
37
    }
38
    /* Get number layout of display */
39
    bitpattern = Segment_Numbers[num];
40
    for (i = 0; i < 7; i++)
41
    {
42
      bit = EFM_Display.Number[digit].bit[i];
43
      com = EFM_Display.Number[digit].com[i];
44
      if (bitpattern & (1 << i))
45
      {
46
        LCD_SegmentSet(com, bit, true);
47
      }
48
    }
49
    div = div * 10;
50
  }
51
  /* Sync LCD registers to LE domain */
52
  LCD_SyncStart(false, lcdLoadAddrNone);
53
  LCD_LoadBusyWait();
54
}
Beitrag #7396633 wurde von einem Moderator gelöscht.
Gast #7396638
Lesenswert?
• ▲
▼

Hugo H. schrieb:

Vielleicht weil er die Segmente einer 7-Segment-Anzeige ansteuern will?

Na und? sprintf() erzeugt einen String mit genau so vielen Stellen, wie das Display hat. Mit einer einfachen lookup Tabelle (array) oder einen switch/case übersetzt man dann die ASCII Zeichen in Bitmuster für den I/O Port.

#7396651
Lesenswert?
• ▲
▼

He S. schrieb:

Wie kann ich eine Ziffer detektieren?

Beispiel 7023 => Die 0 ist ja auch eine Ziffer

Wenn es ohne komfortable Formatierung wie sprintf oder dtostrf sein soll, dann musst du auf kleiner 10, kleiner 100, kleiner 1000 usw. prüfen, wenn 'wahr' einen Zähler inkrementieren, dann hast du die Anzahl der Leerstellen vor der gesamten Ziffer die du mit Leerzeichen schreibst.

#7396665
Lesenswert?
• ▲
▼

He S. schrieb:

Und wie ist es zum Beispiel mit dem Wert 7023? Die Zahl 7123 funktioniert mal soweit. Sobald eine 0 nach einer gültigen Zahl kommt wird die 2. Stelle nicht dargestellt.

Sollte sie aber. Die Ausgabe der '7' sollte in diesem Fall die Ausgabe von ' ' an Stelle von '0' abgeschaltet haben. Erst direkt vor Ausgabe einer neuen Zahl darf die Ersetzungsmimik wieder eingeschaltet werden.

#7397232
Lesenswert?
• ▲
▼

He S. schrieb:

Wie kann ich eine Ziffer detektieren?

Beispiel 7023 => Die 0 ist ja auch eine Ziffer

Fang von hinten an.

Belege Deinen Ausgangspuffer mit Space vor.

1
#define DIGITS 10
2
char lcdbuffer[DIGITS];
3
memset(lcdbuffer, ' ', DIGITS);

Dann interiere von hinten nach vorne

1
int p=DIGITS-1;
2
int d;
3
while((val)&&(p>=0))
4
{
5
  d=val%10;
6
  val/=10;
7
  lcdbuffer[p--]=d+'0';
8
}

Wenn die Schleife abbricht, ist nur so viel vom Buffer überschrieben, wie erforderlich. Anschließend könntest Du noch das Vorzeichen einfügen.

fchk

#7397334
Lesenswert?
• ▲
▼

Frank K. schrieb:

Wenn die Schleife abbricht, ist nur so viel vom Buffer überschrieben, wie erforderlich.

Hoffentlich stand was vor dem Dezimalpunkt.

while((val)&&(p>=0)&&(p>DIGITS-DECIMALS))

Anschließend könntest Du noch das Vorzeichen einfügen.

und vor allen Dingen die alten Ziffern der vorherigen grösseren Zahl ausradieren.

while((p>=0)) lcdbuffer[p--]=' ;

Hat jemand p als unsigned deklariert ?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.