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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren