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 | }
|