Multiplex 7Segment, eine Anzeige flackert, andere leuchtet richtig

OP #2016593
Lesenswert?

Hallo!

Ich möchte gern zwei 7-Segment-Anzeigen per Multiplex ansteuern.
Dabei soll eine Anzeige eine Null ausgeben, während die andere von 0 bis 
9 hochzählt.
Das Problem ist aber nun, dass die eine Anzeige (die gibt null aus) 
während des weiterschalten immer stark flackert. D.h. es kommt keine 
konstant leuchtende Anzeige zum vorschein.

Die letzte While-Schleife scheint da das problem zu sein.

Vieleicht könnt ihr mir helfen?

Danke schon im voraus

Hier der C-Code:
1
//gemeinsame Anode
2

3
#include <avr/io.h>
4
#include <util/delay.h>    // definiert _delay_ms() 
5

6
void delay_ms(uint16_t);
7
void digit (uint8_t, uint8_t);
8
int main (void);
9

10
const int8_t numbers [10] =
11
{
12
//    1gfedcba
13
  0b11000000,    // 0
14
  0b11111001,    // 1
15
  0b10100100,    // 2
16
  0b10110000,    // 3
17
  0b10011001,    // 4
18
  0b10010010,    // 5
19
  0b10000010,    // 6
20
  0b11111000,    // 7
21
  0b10000000,    // 8
22
  0b10010000,    // 9
23
};
24

25
// wartet ms Millisekunden
26
void delay_ms (uint16_t ms)
27
{
28
  for(uint16_t t=0; t<=ms; t++)
29
  _delay_ms(1);
30
}
31

32
void digit (uint8_t wert, uint8_t pin)
33
{
34
  PORTC |= (1 << PC0) | (1 << PC1);          // 0..1 High = Digits aus
35
  PORTD = numbers[wert];                // Zahl ausgeben
36
  PORTC &= ~(1 << pin);                // Low = entsprechendes Digit an
37
  _delay_ms (5);                    // Multiplex-Zeit
38
}
39

40
int main()
41
{
42
  DDRD = 0xFF;                    // PortB alles als Ausgang
43
  DDRC |= (1 << DDC0) | (1 << DDC1);          // PortC 0..1 als Ausgang
44
  
45
  while (1)  // Endlos
46
  {
47
    digit (0, PC0);
48
    digit (0, PC1);
49
    _delay_ms(2000);
50
    
51
    digit (0, PC0);
52
    digit (1, PC1);
53
    _delay_ms(2000);
54
    
55
    digit (0, PC0);
56
    digit (2, PC1);
57
    _delay_ms(2000);
58

59
    digit (0, PC0);
60
    digit (3, PC1);
61
    _delay_ms(2000);
62
  }
63
  return 0;
64
}

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