74HC595 und 4 Digits

//LostGhost-2020.06.03



#include <Arduino.h>
#include <stdint.h>

/*
int latch=3;  //74HC595  pin 9 STCP
int  clock=4; //74HC595  pin 10 SHCP
int data=2;   //74HC595  pin 8 DS
*/


 //  -    A
//  | |   FB
//   -    G
//  | |   EC
//   -    D

#define NUM_OF_DIGITS 4

int latch = 3; //74HC595 	pin 9 STCP
int STCP = 4; //74HC595 	pin 10 SHCP
int data = 2; //74HC595 	pin 8 DS
const int nbrDigits= 4; // the number of digits in the LED display
                             //dig 1 2 3 4
const int digitPins[nbrDigits] = {  5,6,7,8};
struct Zahl_t
{
int Zahl[4];
} sZahl;

int MRPin = 9;
// 	DP G F E D C B A
//0: 1 1 0 0 0 0 0 0 0xc0
//1: 1 1 1 1 1 0 0 1 0xf9
//2: 1 0 1 0 0 1 0 0 0xa4
//3: 1 0 1 1 0 0 0 0 0xb0
//4: 1 0 0 1 1 0 0 1 0x99
//5: 1 0 0 1 0 0 1 0 0x92
//6: 1 0 0 0 0 0 1 0 0x82
//7: 1 1 1 1 1 0 0 0 0xf8
//8: 1 0 0 0 0 0 0 0 0x80
//9: 1 0 0 1 0 0 0 0 0x90
unsigned char table[] =
{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};




void Display(int id, unsigned char num);

void DisplayNumber(Zahl_t Value);
void DisplayDigit(uint8_t num, int  digit);
void screenOff();

void setup() {
 	Serial.begin(38400);
 	pinMode(latch, OUTPUT);
 	pinMode(STCP, OUTPUT);
 	pinMode(data, OUTPUT);
	pinMode(MRPin, OUTPUT);
 	
    screenOff();
     
	sZahl.Zahl[0]  = 5;
	sZahl.Zahl[1]  = 6;
  sZahl.Zahl[2]  = 7;
	sZahl.Zahl[3]  = 8;

	  	 DisplayNumber(sZahl);
}
void loop() {
	DisplayNumber(sZahl);

}


//Function to display a nmuber on 4 digit 7 segments (maximum  9999)
void DisplayNumber(Zahl_t Value)
 {
	 
    //  display the value corresponding to each digit
    // leftmost digit is 0, rightmost  is one less than the number of places
    for( int digit = nbrDigits-1; digit  >= 0; digit--)
    {
        DisplayDigit(Value.Zahl[digit], digit) ;
		
    }
 
  
}

//Function  to display on one seven segments digit
void DisplayDigit(uint8_t num, int  digit) 
{
  //screenOff();
  
 // Serial.print(num); Serial.print("--"); Serial.println(digit);

  digitalWrite(digitPins[digit], HIGH);


  digitalWrite(MRPin, HIGH);
  digitalWrite(latch,LOW);
  shiftOut(data,STCP,MSBFIRST,table[num]);
  digitalWrite(latch,HIGH);
  
  digitalWrite( digitPins[digit], LOW );
  delay(4);
  digitalWrite( digitPins[digit], HIGH );
  
  digitalWrite(MRPin, LOW);
}


void screenOff() 
{ 
   for (int i = 0; i < 4; i++)
  digitalWrite( digitPins[i], LOW);
  
}

/*
void Display(int id, unsigned char num)
{
   digitalWrite(MRPin, HIGH);
	digitalWrite(latch, LOW);
 	shiftOut(data, cs, MSBFIRST, table[num]);
	    Serial.print(num);
	    Serial.print(" ------ ");
      	Serial.println(table[num],HEX);

 	digitalWrite(latch, HIGH);
 	for (int j = 0; j < NUM_OF_DIGITS; j++) digitalWrite(dPins[j], LOW);
 	digitalWrite(dPins[id], HIGH);
   digitalWrite(MRPin, LOW);
}
*/

Das ist nein Code für das 74HC595 und gemeinsamer Anode.
So weit funktioniert alles. Nur das Multiplexing das ansteuern der einzelnen Digits das funktioniert nicht. Das Display zeigt alle Ziffern richtig an (Habe da zum testen ein Delay programmiert gehabt) nur beim Letzen Digit wird auf allen 4 Anzeigen in dem Beispiel 4 fünfen angezeigt.
Also die Anzeige zeigt

8
77
666
5555
Ich habe mir ein Max7219 mit Anzeige bestellt ist ehe die bessere Lösung. Nur falls einer eine Idee hat wo mein Hirn ein Knoten hat, würde ich mich über eure Anregung freuen.

Ohne ein Schaltbild, auf dem man sieht wie das Ganze aufgebaut ist, kann man da garnichts sagen. Sieht so aus als hättest Du die 4 Schieberegister nicht einfach hintereinandergeschaltet, was mMn das einfachste wäre.

Sieht eher so aus, als habe @ats3788 nur 1 Schieberegister und möchte die 8 bit mit vier einzelnen Pins multiplexen. Da werden wohl diese nicht ausgeschaltet...

Schaltung zu zeigen wäre sicher sinnvoll :wink:

Ich hab jetzt ein paar mal drüber gelesen.
Soll das heissen, das das letzte Digit immer 5 ist? Also 8 5, 77 5, 6665?

Hallo,

die Pinbezeichnung bzw. Kommentare stimmen irgendwie nicht bzw. ist durcheinander gewürfelt. STCP kann ja nicht gleichzeitig SHCP sein. Saubere Namen sind das A & O. Entweder Benennung wie im Datenblatt oder Benennung nach Funktion. Problem bei Benennung wie im Datenblatt ist das diese leider unter den Hersteller etwas abweichend ist. Selbst wenn das bei dir alles stimmt ist es für uns die nur den Sketch sehen verwirrend und wir wissen nicht ob nur der Kommentar falsch ist oder alles.

Desweiteren benötigt man einen sauberen Reset für die Initialisierung

const byte pinClock {4}; // SHCP .. shift register input clock
const byte pinLatch {3}; // STCP .. latch or storage register clock input
const byte pinData  {2}; // DS .... data serial input 
const byte pinReset {9}; // /MR ... master reset 

pinMode(pinClock, OUTPUT); 
pinMode(pinLatch, OUTPUT); 
pinMode(pinData,  OUTPUT); 
pinMode(pinReset, OUTPUT); 
  
/* Init 74HC595 */
digitalWrite(pinReset, HIGH);
digitalWrite(pinReset,  LOW);  // delete shift register
digitalWrite(pinReset, HIGH);
digitalWrite(pinLatch, HIGH);  // take over storage register
digitalWrite(pinLatch,  LOW);

Danach benötigt man den Resetpin im normalen Ablauf nicht mehr. Es wird nur noch die Latch Low-High Flanke für die Datenübernahme benötigt.

void foo ( ... )
{
  // irgendwas sinnvoll rausschieben //
  digitalWrite(pinLatch, HIGH);  // take over storage register
  digitalWrite(pinLatch,  LOW);
}

oder 

void foo ( ... )
{
  digitalWrite(pinLatch,  LOW);
  // irgendwas sinnvoll rausschieben //
  digitalWrite(pinLatch, HIGH);  // take over storage register
}

Ist gehüpft wie gesprungen.
Deine Pinbezeichung und Nummer kontrollierst du nochmal. Nach Korrektur schauste mal was passiert. Danach solltest du den Sketch aufräumen. Bspw. ist Nummer der Digits ist doppelt definiert.

Wenn es immer noch nicht funktioniert, dann bitte aufgeräumten Sketch und Schaltplan zeigen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.