//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.