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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.