Forum: Mikrocontroller und Digitale Elektronik Hilfestellung LCD Display


von Zo R. (hsch1978)


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
}

: Bearbeitet durch User
von Andras H. (kyrk)


Lesenswert?

Mit sprintf geht es nicht?

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

He S. schrieb:
> Ich habe nur schwierigkeiten, wie man automatisch die führenden Nullen
> vermeiden kann

Indem du statt einer '0' ein Leerzeichen ausgibst, solange noch keine 
andere Ziffer aufgetreten ist.

von Zo R. (hsch1978)


Lesenswert?

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.

von Zo R. (hsch1978)


Lesenswert?

Wie kann ich eine Ziffer detektieren?

Beispiel 7023 => Die 0 ist ja auch eine Ziffer

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

He S. schrieb:
> Wie kann ich eine Ziffer detektieren?

Am ASCII Code. Warum machst du das nicht wie jeder normale Mensch 
sprintf? Hat dein Mikrocontroller nur 0,004 MHz Taktfrequenz, oder was 
ist los?

Beitrag #7396633 wurde vom Autor gelöscht.
von Stefan F. (Gast)


Lesenswert?

Hugo H. schrieb im Beitrag #7396633:
> 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.

von Veit D. (devil-elec)


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.

von Rainer W. (rawi)


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.

von Peter D. (peda)


Lesenswert?

He S. schrieb:
> Sobald eine 0 nach einer gültigen
> Zahl kommt wird die 2. Stelle nicht dargestellt.

Dann merke Dir eben, daß schon eine Ziffer !=0 erkannt wurde.

von Zo R. (hsch1978)


Lesenswert?

Ja so habe ich es auch mal umgesetzt

von Frank K. (fchk)


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

: Bearbeitet durch User
von Michael B. (laberkopp)


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 ?

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.