Forum: Compiler & IDEs binär uhr mit einer bit structur


von lufthackn (Gast)


Lesenswert?

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
volatile unsigned char ss   = 0; // Globale Variable für die Sekunden
2
volatile unsigned char mm   = 0; // Globale Variable für die Minuten
3
volatile unsigned char hh   = 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_t hh_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

von André A. (nummer5) Benutzerseite


Lesenswert?

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_t bit = 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.

von lufthackn (Gast)


Lesenswert?

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
void sek_update();
2
  { // Funktion die jede Sekunde einmal ausgeführt wird ... 
3
    hh_foo =hh; mm_foo =mm; ss_foo =ss;
4
    bin_clock(hh_foo / 10, 32, 113, gr_clr, color); // 1.Ziffer Stunde
5
    bin_clock(hh_foo % 10, 57, 113, gr_clr, color); // 2.Ziffer Stunde
6
    bin_clock(mm_foo / 10,107, 113, gr_clr, color); // 1.Ziffer Minute
7
    bin_clock(mm_foo % 10,132, 113, gr_clr, color); // 2.Ziffer Minute
8
    bin_clock(ss_foo / 10,182, 113, gr_clr, color); // 1.Ziffer Sekunde
9
    bin_clock(ss_foo % 10,207, 113, gr_clr, color); // 2.Ziffer Sekunde
10
  }
11
12
13
void bin_clock(uint8_t ziffer, uint8_t x_foo, uint16_t y_foo, uint16_t clr, uint16_t clr2)
14
  {
15
    switch(ziffer)
16
          {          // circle( x,y,radius,stärke,farbe,fill)
17
          case 0: Circle( x_foo,y_foo   ,3,1,clr2,1); // bit 0 (1)
18
              Circle( x_foo,y_foo- 9,3,1,clr2,1); // bit 1 (2)
19
                        Circle( x_foo,y_foo-18,3,1,clr2,1); // bit 2 (4)
20
                        Circle( x_foo,y_foo-27,3,1,clr2,1); // bit 3 (8)
21
                break;
22
    case 1: Circle( x_foo,y_foo   ,3,1,clr ,1); // bit 0 (1)
23
                        Circle( x_foo,y_foo- 9,3,1,clr2,1); // bit 1 (2)
24
                        Circle( x_foo,y_foo-18,3,1,clr2,1); // bit 2 (4)
25
                        Circle( x_foo,y_foo-27,3,1,clr2,1); // bit 3 (8)
26
                break;
27
          case 2: Circle( x_foo,y_foo   ,3,1,clr2,1); // bit 0 (1)
28
            Circle( x_foo,y_foo- 9,3,1,clr ,1); // bit 1 (2)
29
                        Circle( x_foo,y_foo-18,3,1,clr2,1); // bit 2 (4)
30
                        Circle( x_foo,y_foo-27,3,1,clr2,1); // bit 3 (8)
31
                break;
32
    case 3: Circle( x_foo,y_foo   ,3,1,clr ,1); // bit 0 (1)
33
            Circle( x_foo,y_foo- 9,3,1,clr ,1); // bit 1 (2)
34
                        Circle( x_foo,y_foo-18,3,1,clr2,1); // bit 2 (4)
35
                        Circle( x_foo,y_foo-27,3,1,clr2,1); // bit 3 (8)
36
                break;
37
    case 4: Circle( x_foo,y_foo   ,3,1,clr2,1); // bit 0 (1)
38
            Circle( x_foo,y_foo- 9,3,1,clr2,1); // bit 1 (2)
39
                        Circle( x_foo,y_foo-18,3,1,clr ,1); // bit 2 (4)
40
                        Circle( x_foo,y_foo-27,3,1,clr2,1); // bit 3 (8)
41
                break; 
42
      case 5: Circle( x_foo,y_foo   ,3,1,clr ,1); // bit 0 (1)
43
            Circle( x_foo,y_foo- 9,3,1,clr2,1); // bit 1 (2)
44
                        Circle( x_foo,y_foo-18,3,1,clr ,1); // bit 2 (4)
45
                        Circle( x_foo,y_foo-27,3,1,clr2,1); // bit 3 (8)
46
                break;
47
    case 6: Circle( x_foo,y_foo   ,3,1,clr2,1); // bit 0 (1)
48
            Circle( x_foo,y_foo- 9,3,1,clr ,1); // bit 1 (2)
49
                        Circle( x_foo,y_foo-18,3,1,clr ,1); // bit 2 (4)
50
                        Circle( x_foo,y_foo-27,3,1,clr2,1); // bit 3 (8)
51
                break;
52
    case 7: Circle( x_foo,y_foo   ,3,1,clr ,1); // bit 0 (1)
53
            Circle( x_foo,y_foo- 9,3,1,clr ,1); // bit 1 (2)
54
                        Circle( x_foo,y_foo-18,3,1,clr ,1); // bit 2 (4)
55
                        Circle( x_foo,y_foo-27,3,1,clr2,1); // bit 3 (8)
56
                break;
57
    case 8: Circle( x_foo,y_foo   ,3,1,clr2,1); // bit 0 (1)
58
            Circle( x_foo,y_foo- 9,3,1,clr2,1); // bit 1 (2)
59
                        Circle( x_foo,y_foo-18,3,1,clr2,1); // bit 2 (4)
60
                        Circle( x_foo,y_foo-27,3,1,clr ,1); // bit 3 (8)
61
                break;
62
    case 9: Circle( x_foo,y_foo   ,3,1,clr ,1); // bit 0 (1)
63
            Circle( x_foo,y_foo- 9,3,1,clr2,1); // bit 1 (2)
64
                        Circle( x_foo,y_foo-18,3,1,clr2,1); // bit 2 (4)
65
                        Circle( x_foo,y_foo-27,3,1,clr ,1); // bit 3 (8)
66
                break;
67
         }
68
  }

ich ahnte das es auch einfacher geht -.-
thx

von Rrolf Magnus (Gast)


Lesenswert?

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.

von PittyJ (Gast)


Lesenswert?

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.

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.