hallo,
ich möchte eine Binäruhr grafisch mittels Kreise auf einem LCD
darstellen, also nicht wie übvlich über LEDs an einem Port.
die Zeit kommt von Ulrich Radig AVR77 DCF Treiber;
1
volatileunsignedcharss=0;// Globale Variable für die Sekunden
2
volatileunsignedcharmm=0;// Globale Variable für die Minuten
3
volatileunsignedcharhh=0;// Globale Variable für die Stunden
gefüllt==1 für EIN
gefüllt==0 für AUS
1
Circle(x,y,radius,farbe,gefüllt)
nun möchte ich für die Kreise ein struct anlegen:
1
struct
2
{int8_thh_1_ziffer:1,//
3
hh_2_ziffer:1,//
4
mm_1_ziffer:1,//
5
mm_2_ziffer:1,//
6
ss_1_ziffer:1,//
7
ss_2_ziffer:1;//
8
}BinClock;
wie kann ich nun am besten die kreise füllen?
mit if und else is irgendwie zu doof vermute ich...
thx für euren input, sofern was kommt.
gruß Lufthackn
Deine struct erschließt sich mir nicht ganz. Jeder Eintrag ist ein
Bitfeld der Länge 1, welche Daten willst du darin speichern?
Wenn ich es richtig verstehe willst du doch die Bits der drei Variablen
ss, mm, hh als gefüllten oder nicht gefüllten Kreis darstellen?
Dann nimm doch einfach eine Schleife:
1
x=0;
2
y=0;
3
for(uint8_tbit=0x01;bit!=0;bit>>=1){
4
Circle(x,y,radius,farbe,(ss&bit)!=0);
5
x+=radius;
6
}
Dann solltest du acht Kreise nebeneinander angezeigt bekommen.
Für die anderen Variablen ebenso.
Die Bitschieberei benutz ich weil ein AVR nur effizient um ein Bit
schieben kann, also (1 << i) oder so ist nicht sehr effizient, wenn i
variable ist.
Es kann sein, dass die Reihenfolge der Bits verkehrt herum ist, aber
kann man ja leicht anpassen.
ich steh auf struct^^
deine schleife sieht sehr gut aus nur erschließt sie sich mir auf
denersten blick noch nicht logisch. Notlösung war bisher ne riesn
struct;
1
voidsek_update();
2
{// Funktion die jede Sekunde einmal ausgeführt wird ...
lufthackn schrieb:> ich steh auf struct^^
Naja, aber struct-Elemente kannst du halt nicht per Index, sondern nur
per Name ansprechen, und das führt zu so großen Codeblöcken wie bei dir,
mit massig Fallunterscheidungen. struct ist zwar was tolles, aber eben
nicht für jeden Anwendungsfall geeignet.
Oha, was für ein Anfänger....
Also vielleicht mal ein gutes C-Buch lesen. Und auch verstehen was bei
int8_t hh_1_ziffer :1
die Doppelpunkt 1 wirklich bedeutet.
Der Switch ist ja nur eine Bitabfrage. Das könnte man auch einfacher
machen, ganz ohne switch:
Circle( x_foo,y_foo ,3,1,(ziffer&1)?clr:clr2,1); // bit 0 (1)
Circle( x_foo,y_foo- 9,3,1,ziffer&2)?clr:clr2,1); // bit 1 (2)
Circle( x_foo,y_foo-18,3,1,ziffer&4)?clr:clr2,1); // bit 2 (4)
Circle( x_foo,y_foo-27,3,1,ziffer&8)?clr:clr2 ,1); // bit 3 (8)
Also einfach in dem Buch mal schauen, wie ein binäre Zahlendarstellung
geht, und wie die Bitoperatoren gehen.