4 Digit Display sinnvoll betreiben (Multiplexing) 74HC595

Hi,

ich habe aus nem alten Radiowecker folgendes geschlachtet:

Habs jetzt soweit das es mit zwei 74HC595 jedes LED schalten kann.

Ich hab ein wenig rumprobiert wie ich jetzt sinnvoll meine Code schreibe damit ich jede der vier Zahlen per Variable anzeigen kann.
=> Ich möchte die Segmente 1 bis 4 jeweils alle 10 Ziffern darstellen können.

Leider glaube ich, dass ich das viel zu kompliziert mache. Mir fällt aber keine Systematik ein wie ich die jeweiligen Segmente und Zahlen definiere und per Multiplexing abarbeite.

Mein erster Ansatz war:

Ich arbeite ohne Delay und lasse erst die Variable auf der ersten Ziffer, dann der zweiten usw per Multiplexing ablaufen.

  1. Ich definiere für jedes der 4 Ziffern welche Pins für welche Zahl geschaltet werden müssen und welche Werte ich dem shiftout geben muss.
  2. Ich arbeite dann halt für jede Ziffer die möglichen Werte durch.

Mal als Beispiel wie ich auf der ersten der 4 Ziffern eine 1 darstelle:

  if (segment1 = 1){
    // rechts oben wird angezeigt
    digitalWrite(a,LOW);
    digitalWrite(b,HIGH);
    shift11 = B0000010;
    shift12 = B0000000;
    
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, shift12);
    shiftOut(dataPin, clockPin, MSBFIRST, shift11);
    digitalWrite(latchPin, HIGH);
    
    // rechts unten wird angezeigt
    digitalWrite(a,HIGH);
    digitalWrite(b,LOW);
    shift11 = B0010000;
    shift12 = B0000000;
    
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, shift12);
    shiftOut(dataPin, clockPin, MSBFIRST, shift11);
    digitalWrite(latchPin, HIGH);
.
.
. und so alle 4 Segmente nacheinander abarbeiten
  }

Das ist aber 1 if abfrage für 1 Ziffer und gerade mal 1 Segment. Der Code wird riesig und hat doch viel zu viele if abfragen wenn ich das für jede Ziffer mache.

Also wie fasse ich das am besten zusammen?

dertester:
=> Ich möchte die Segmente 1 bis 4 jeweils alle 10 Ziffern darstellen können.

Geht nicht. Dem ersten Digit fehlt das F-Segment.

Das Ding scheint sehr speziell auf einen bestimmten Anwendungszweck zugeschnitten zu sein, zumindest deutet die interne Verdrahtung darauf hin. Ich würde das Ding wohl einfach entsorgen und mir ne Handvoll normale 7-Segment-Anzeigen nehmen....

Wie gesagt es ist aus einem Wecker und der muß Zahlen von 00:00 bis 24:59 anzeigen und darum ist Segnet F des linken Ziffer nicht notwendig.
Grüße Uwe

Das eine fehlt nur bei der ersten Ziffer mit den restlichen 3 Ziffern kann ich 0-9 darstellen.

Es ist halt echt blöd das ich teilweise bis zu drei mal das Shiftregister beschreiben muss um eine Ziffer zu multiplexen.
Wenn mir nix einfällt wie ich das etwas sauberer und einfacher programmiert bekomme bringt das leider nicht soviel.

Wäre aber schön, war halt kostenlos und Temp oder kleine Werte kann man ja dann anzeigen.

==
/OT
Bin jetzt über das S65 Display gestolpert und hab zufällig sogar zwei davon (ls020) rumliegen :slight_smile:
Jetzt muss ich mal schaun ob ich das hinbekomme. Ist leider nen ganzes Stück über meinem Horizont und extra den S65 Shield möchte ich nicht kaufen.
Vor allem da ich mit dem Ethernet-Shield schon Spi blocke und das glaub net gut zusammenspielt.

Das S65 Display braucht 10V für die Hintergrundbeleuchtung.

Grüße Uwe

Guck dir mal den MAX7219 an. Dazu gibt es die LedControl.zip der kann sogar 8 Stellen muxen. Allerdings muß das Display gemeinsame Kathoden haben. Wenn dir der MAX etwas zu überdimensioniert ist kannst du auch einen sogenannten BCD-7 Segment Decoder nehmen. Das spart ebenfalls Ausgänge ein. Denn du benötigst dann 4 Leitungen zum Decoder und eine pro Stelle zum muxen. Dabei hast du sogar noch die Wahl, ob du ein 74'er Derivat für gemeinsame Anode (z.B. 74LS247) oder einen 4000'er CMOS Typ (z.B. 4511) für gem. Kathode nimmst.

Gruß Gerald