problem with 7Segment 4digits display

hello , im new here and i dont really know if that question is right for this "room"...

i've been working with 7Segment 4digits display with arduino uno board and i cant make the numbers appear right , its like the number is displayed but there's a "back light" from the other leds of the 7Segment. i tryed to fix it by delaying the transition between that digits but
its not really giveing me the "clean" number display like digital clocks.

thanx in advance for any kind of help.

p.s:
english is not my native tongue so im sorry for any mistakes.

Please post your code & schematic so we have something to go on.

im also useing a 74HC595 shift register to control the segments ,
this is the code :

(code tags added by moderator)

int data = 2;
int latch = 4;
int clock = 3;
int digit_1 = 8;
int digit_2 = 9;
int digit_3 = 12;
int digit_4 = 11;
int DelayVal = 5;
int NumVal = B00000000;
void setup()
{
  pinMode(data , OUTPUT);
  pinMode(latch , OUTPUT);
  pinMode(clock , OUTPUT);
  pinMode(digit_1 , OUTPUT);
  pinMode(digit_2 , OUTPUT);
  pinMode(digit_3 , OUTPUT);
  pinMode(digit_4 , OUTPUT);
}
void DigitsOff()
{
  digitalWrite(digit_1 , LOW);
  digitalWrite(digit_2 , LOW);
  digitalWrite(digit_3 , LOW);
  digitalWrite(digit_4 , LOW);
}
void DigitDisplay(int num)
{
  switch(num)
  {
    case 0:
    NumVal = B10000000;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH); 
    break;
    
    case 1:
    NumVal = B11110010;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH);     
    break;
    
    case 2:
    NumVal = B01001000;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH);  
    break;
    
    case 3:
    NumVal = B01100000;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH); 
    break;
    
    case 4:
    NumVal = B00110010;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH);     
    break;
    
    case 5:
    NumVal = B00100100;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH); 
    break;
    
    case 6:
    NumVal = B00000100;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH); 
    break;
    
    case 7:
    NumVal = B11110000;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH); 
    break;
    
    case 8:
    NumVal = B00000000;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH); 
    break;
    
    case 9:
    NumVal = B00110000;
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , NumVal);
    digitalWrite(latch , HIGH); 
    break;
  }
}
void SwitchDigit(int digit)
{
  switch(digit)
  { 
    case 1 :
    digitalWrite(digit_1 , HIGH);
    digitalWrite(digit_2 , LOW);
    digitalWrite(digit_3 , LOW);
    digitalWrite(digit_4 , LOW);
    break;
    
    case 2 :
    digitalWrite(digit_1 , LOW);
    digitalWrite(digit_2 , HIGH);
    digitalWrite(digit_3 , LOW);
    digitalWrite(digit_4 , LOW);
    break;
    
    case 3 :
    digitalWrite(digit_1 , LOW);
    digitalWrite(digit_2 , LOW);
    digitalWrite(digit_3 , HIGH);
    digitalWrite(digit_4 , LOW);
    break;
    
    case 4 :
    digitalWrite(digit_1 , LOW);
    digitalWrite(digit_2 , LOW);
    digitalWrite(digit_3 , LOW);
    digitalWrite(digit_4 , HIGH);
    break;
  }
}
void DisplayNumber(int num)
{
    
  int a = num / 1000;
  int b = (num / 100) % 10;
  int d = (num / 10)% 10;
  int c = num % 10;
  SwitchDigit(1);
  DigitDisplay(a);
  delay(DelayVal);
  SwitchDigit(2);
  DigitDisplay(b);
  delay(DelayVal);
  SwitchDigit(3);
  DigitDisplay(d);
  delay(DelayVal); 
  SwitchDigit(4);
  DigitDisplay(c);
  delay(DelayVal);
}
void loop()
{
  DisplayNumber(NumVal);
}

It is your DigitDisplay routine.

It alters the value of NumVal - unless you want to something weird, it looks like you want to display some numbers. If so, you can use an array based on "num" to send out the segment data to the shift register.

Try something like this:

void DigitDisplay(int num)
{
  int seg_font[]={
    B11000000,             //'0'
    B11111001,             //'1'
    B10100100,             //'2'
    B10110000,             //'3'
    B10011001,             //'4'
    B10010010,             //'5'
    B10000010,             //'6'
    B11111000,             //'7'
    B10000000,             //'8'
    B10011000              //'9'
  };
    digitalWrite(latch , LOW);
    shiftOut(data , clock , MSBFIRST , seg_font[num % 10]);
    digitalWrite(latch , HIGH); 
}

I cannot be sure that the segment information is correct but it is not that difficult for you to create your own, if you want to display something else instead.

thanks , now it's much more simple.

Hello,
try this library I wrote recently:
http://laurent.le.goff.free.fr/blog/IMG/zip/sevenseg.zip