binär uhr mit einer bit structur

Gast #2850589
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
Persönliche Seite #2850816
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.
Gast #2850872
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
Gast #2850881
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.
Gast #2850919
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.

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