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
voiddelay_ms(uint16_t);
7
voiddigit(uint8_t,uint8_t);
8
intmain(void);
9
10
constint8_tnumbers[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
voiddelay_ms(uint16_tms)
27
{
28
for(uint16_tt=0;t<=ms;t++)
29
_delay_ms(1);
30
}
31
32
voiddigit(uint8_twert,uint8_tpin)
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
intmain()
41
{
42
DDRD=0xFF;// PortB alles als Ausgang
43
DDRC|=(1<<DDC0)|(1<<DDC1);// PortC 0..1 als Ausgang
Das eine Digit wird 5ms angezeigt, das andere 2005ms.
Logisch, daß das erste nur kurz flackert.
Mit Delay machst Du Dich nur selber verrückt (ist ernst zu nehmen).
Lerne erstmal Timerinterrupt, dann kannst Du nämlich richtig
Multiplexen.
Peter
Bei diesem Code kannst du nicht von "Flackern" sprechen, das dürfte eher
ein "Aufblitzen" im 2-Sekunden-Takt sein...
Benjamin S. schrieb:> Die letzte While-Schleife scheint da das problem zu sein.
Nein, dein Programmkozept ist das Problem.
Aufblitzen beschreibt die Sache schon eher.
Ich wollt es erstmal mit dem _delay_ms lernen, bevor ich die
Timerinterrupts angehe.
Was könnte man den noch optimieren oder alles über den Haufen werfen?
Benjamin S. schrieb:> Ich wollt es erstmal mit dem _delay_ms lernen
Niemand verbietet Dir, den komplizierten Weg zu gehen.
Benjamin S. schrieb:> oder alles über den Haufen werfen?
Das mußt Du eh. Also lieber sofort, bevor Du noch mehr Arbeit investiert
hast.
Peter