7 segment multiplexed display

Hi,
I am little bit newbie to Arduino so I would be verry happy if you would help me :slight_smile:
I am making my stopwatch made out of my own 7 segment LED diplay, I have got there i HW driver for the display (IC 7447) and a memmory for the display to shine all the time.
Could you help me a little bit with the code?

Code: (working just for one place, I need to add the multiplexing)
// Piny pro display
#define A 1
#define B 2
#define C 3
#define D 4
#define CIF1 5
// #define CIF2 6
// #define CIF3 7
// #define CIF4 8
// #define CIF5 9
// #define CIF6 10

int timer = 0;

// Fce pro zobrazovani cislic
void digit0 () {
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
};

void digit1 () {
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
};

void digit2 () {
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
};

void digit3 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
};

void digit4 () {
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
};

void digit5 () {
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
};

void digit6 () {
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
};

void digit7 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
};

void digit8 () {
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
};

void digit9 () {
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
};

// Case fce pro zobrazeni cislic
void showDigit (int digit) {
switch (digit) {
case 0:
digit0 ();
break;

case 1:
digit1 ();
break;

case 2:
digit2 ();
break;

case 3:
digit3 ();
break;

case 4:
digit4 ();
break;

case 5:
digit5 ();
break;

case 6:
digit6 ();
break;

case 7:
digit7 ();
break;

case 8:
digit8 ();
break;

case 9:
digit9 ();
break;

default:
break;
};
};

// Setup fce pinu
void setup () {
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);

pinMode(CIF1, OUTPUT);
// pinMode(CIF2, OUTPUT);
// pinMode(CIF3, OUTPUT);
// pinMode(CIF4, OUTPUT);
// pinMode(CIF5, OUTPUT);
// pinMode(CIF6, OUTPUT);
};

// Loop fce
void loop () {
if (timer < 10) {
digitalWrite(CIF1, HIGH);
showDigit (timer);
delay (1000);
timer += 1;
}
else {
timer = 0;
digitalWrite(CIF1, HIGH);
showDigit (timer);
delay (1000);
timer += 1;
}
};

Thank you and have a nice day! :slight_smile:

Where exactly your problem for multiplexing, and what you call "memory for the display to shine all the time"?
I build something similar, a countdown timer with 4 digits 7 segments, but only with some 74hc595, i never used a IC7447.
there are an example for multiplexing 7 segments here.

And please use code's tag.

My problem with multiplexing is this one: I don´t know how to add the other display - so I could display numbers like 11,12,13...
And that hardware memory works like "storage" when Arduino will be writing to other displays, it does not effect the code.
74hc595 reads the code serial, my 7447 is bit more communistic and reads the code parallel on 4 wires (4bits), but I haven ´t got problem with that...

Allover my problem is that I am a newbie at programming :smiley:

I´ve done some progress :slight_smile:
Vid: Dropbox video

// Piny pro display
#define A 35
#define B 37
#define C 39
#define D 41
#define CIF1 53
#define CIF2 51
#define CIF3 49
#define CIF4 47
#define CIF5 45
#define CIF6 43

int tis = 0;
int destis = 0;
int sec = 0;
int dessec = 0;
int mit = 0;
int desmit = 0;
int x = 0;

// Fce pro zobrazovani cislic
void digit0 () {
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
};

void digit1 () {
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
};

void digit2 () {
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
};

void digit3 () {
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
};

void digit4 () {
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
};

void digit5 () {
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
};

void digit6 () {
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
};

void digit7 () {
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
};

void digit8 () {
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
};

void digit9 () {
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
};

// Case fce pro zobrazeni cislic
void showDigit (int digit) {
  switch (digit) {
    case 0:
    digit0 ();
    break;
    
    case 1:
    digit1 ();
    break;
    
    case 2:
    digit2 ();
    break;
    
    case 3:
    digit3 ();
    break;
    
    case 4:
    digit4 ();
    break;
    
    case 5:
    digit5 ();
    break;
    
    case 6:
    digit6 ();
    break;
    
    case 7:
    digit7 ();
    break;
    
    case 8:
    digit8 ();
    break;
    
    case 9:
    digit9 ();
    break;
    
    default:
    break;
  };
};

// Setup fce pinu
void setup () {
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  
  pinMode(CIF1, OUTPUT);
  pinMode(CIF2, OUTPUT);
  pinMode(CIF3, OUTPUT);
  pinMode(CIF4, OUTPUT);
  pinMode(CIF5, OUTPUT);
  pinMode(CIF6, OUTPUT);
};

// Loop fce
void loop () {
while(desmit < 10) {
  mit = 0;
  showDigit (mit);
    digitalWrite(CIF5, HIGH);
    x = 0;
    digitalWrite(CIF5, LOW);
  
while(mit < 10) {
  dessec = 0;
  showDigit (dessec);
    digitalWrite(CIF4, HIGH);
    x = 0;
    digitalWrite(CIF4, LOW);
  
while(dessec < 6) {
  sec = 0;
  showDigit (sec);
    digitalWrite(CIF3, HIGH);
    x = 0;
    digitalWrite(CIF3, LOW);
  
while(sec < 10) {
  destis = 0;
  showDigit (destis);
    digitalWrite(CIF2, HIGH);
    x = 0;
    digitalWrite(CIF2, LOW);
  
while(destis < 10) {
  tis = 0;
  showDigit (tis);
    digitalWrite(CIF1, HIGH);
    x = 0;
    digitalWrite(CIF1, LOW);
  
while(tis < 10){
    showDigit (tis);
    digitalWrite(CIF1, HIGH);
    x = 0;
    digitalWrite(CIF1, LOW);
    delay (10);
    tis += 1;
}
destis += 1;
showDigit (destis);
    digitalWrite(CIF2, HIGH);
    x = 0;
    digitalWrite(CIF2, LOW);
}
sec += 1;
showDigit (sec);
    digitalWrite(CIF3, HIGH);
    x = 0;
    digitalWrite(CIF3, LOW);
 showDigit (dessec);
    digitalWrite(CIF4, HIGH);
    x = 0;
    digitalWrite(CIF4, LOW);   
}
dessec += 1;
showDigit (dessec);
    digitalWrite(CIF4, HIGH);
    x = 0;
    digitalWrite(CIF4, LOW);
}
mit += 1;
showDigit (mit);
    digitalWrite(CIF5, HIGH);
    x = 0;
    digitalWrite(CIF5, LOW);    
}
desmit += 1;
showDigit (desmit);
    digitalWrite(CIF6, HIGH);
    x = 0;
    digitalWrite(CIF6, LOW);
}
};

P.S. each number is as big as my hand :slight_smile:
I am not against any improvement :slight_smile:

nice display, i wonder what kind of led you use, or if you build a box around yourself...

for the code you should use something like that:

unsigned long time;
unsigned long start;
void setup() {
Serial.begin(9600);
start = millis();
}

void loop() {
time = millis()-start;
int time_min=((time/1000)/60);
int time_sec=(time/1000)-(time_min*60);
int time_hun=(time/10)%100;

int hun=(time_hun)%10;
int dec_hun=(time_hun/10)%10;

int sec=(time_sec)%10;
int dec_sec=(time_sec/10)%10;


int dec_min=(time_min/10)%10;
int min_=(time_min)%10;

Serial.print(dec_min);
Serial.print(min_);
Serial.print(" : ");
Serial.print(dec_sec);
Serial.print(sec);
Serial.print(" : ");
Serial.print(dec_hun);
Serial.print(hun);
Serial.println(" ");

delay(543);
}

That example show time in serial, but you have each digit to show, and you can use delay.

I bought thame in sale, it´s some kind of bargraph, name: AEG11C7113*A FAC3018-BD0743, I could not found datasheet so I have to improvise a bit :smiley: