arduino clock

i have been working on making an arduino alarm clock using a 4 seven segment display, the display has 4 ground wires for each seven segment and common anodes. i have 4511 decoder to turn the 4 bit number into something that can displayed. i have connected the grounds of the display to the collectors of 4 transistors the bases of these transistor is then connected to 4 pins on the arduino

so far i have been able to display the same number on every display at the same time but when i try to make it display one number then wait and then display another number the numbers flash up instead of staying on constantly like when i display one

sorry its badly explained its tricky to put it into words, i have included my code below, this code will only display one number on every display can someone help me to display a different number on every display and to change the number without having to go back into the program.

hopefully i have been clear enough

thanks in advance

int ledPin[] = {7,8,9,10};
int Anumber= 2;
int Bnumber = 3;
int Cnumber = 4;
int Dnumber = 5;
int a;
int b;

void setup()
{
pinMode (Anumber, OUTPUT);
pinMode (Bnumber, OUTPUT);
pinMode (Cnumber, OUTPUT);
pinMode (Dnumber, OUTPUT);
for (int i =0;i<4;i++)
{
pinMode(ledPin*, OUTPUT);*

  • }*
    }
    void loop() {
  • displayBinary(3);*
    }
    }
    void displayBinary(byte numToShow)
    {
  • for (int i =0;i<4;i++)*
  • {*
  • if (bitRead(numToShow, i)==1)*
  • {*
    _ digitalWrite(ledPin*, HIGH);_
    _
    }_
    _
    else*_
    * {*
    _ digitalWrite(ledPin*, LOW);
    }
    }
    void (); {
    a = 5;
    b = 1;
    digitalWrite (Anumber, HIGH);
    delay(a);
    digitalWrite (Anumber, LOW);
    delay(b);
    digitalWrite (Bnumber, HIGH);
    delay(a);
    digitalWrite (Bnumber, LOW);
    delay(b);
    digitalWrite (Cnumber, HIGH);
    delay(a);
    digitalWrite (Cnumber, LOW);
    delay(b);
    digitalWrite (Dnumber, HIGH);
    delay(a);
    digitalWrite (Dnumber, LOW);
    delay(b);
    }
    }
    [/quote]*_

So you are suprised that you can't read it 5 mS ?

it will display one number like 1111 and i can read it fine

its when i try to add something like this

void loop() {
displayBinary(3);
delay(1000);
displayBinary(4);
}

in my head it supposed to display 3333 wait for 1 second then 4444 but it flashes 3333 then waits 1 second and flashes 4444

Please use the "#" CODE TAGS toolbutton to post code so it looks like this:

int ledPin[] = {7,8,9,10};
int Anumber= 2;
int Bnumber = 3;
int Cnumber = 4;
int Dnumber = 5;
int a;
int b;

void setup()
{
   pinMode (Anumber, OUTPUT);  
  pinMode (Bnumber, OUTPUT);
   pinMode (Cnumber, OUTPUT);
    pinMode (Dnumber, OUTPUT);
  for (int i =0;i<4;i++)
  {
    pinMode(ledPin, OUTPUT);
  }
}

void loop() {
 displayBinary(3);
}

}
void displayBinary(byte numToShow)
{
  for (int i =0;i<4;i++)
  {
    if (bitRead(numToShow, i)==1)
    {
      digitalWrite(ledPin, HIGH); 
    }
    else
    {
      digitalWrite(ledPin, LOW); 
    }
  }

void (); {
  a = 5;
  b = 1;
digitalWrite (Anumber, HIGH);
delay(a);
digitalWrite (Anumber, LOW);
delay(b);
digitalWrite (Bnumber, HIGH);
delay(a);
digitalWrite (Bnumber, LOW);
delay(b);
digitalWrite (Cnumber, HIGH);
delay(a);
digitalWrite (Cnumber, LOW);
delay(b);
digitalWrite (Dnumber, HIGH);
delay(a);
digitalWrite (Dnumber, LOW);
delay(b);
}
}

OK will do

I've fixed the problem now, it just needed re arranging
the code looks like this:

int ledPin[] = {7,8,9,10};
int Dnumber= 2;
int Cnumber = 3;
int Anumber = 4;
int Bnumber = 5;
int a;
int b;



void setup()
{
   pinMode (Anumber, OUTPUT);  
  pinMode (Bnumber, OUTPUT);
   pinMode (Cnumber, OUTPUT);
    pinMode (Dnumber, OUTPUT);
  for (int i =0;i<4;i++)
  {
    pinMode(ledPin[i], OUTPUT);
  }
}

void loop() {
  a = 5;
  b = 1;
digitalWrite (Dnumber, HIGH);
delay(a);
digitalWrite (Dnumber, LOW);
 displayBinary(4);
 delay(b);
 
digitalWrite (Bnumber, HIGH);
delay(a);
digitalWrite (Bnumber, LOW);
 displayBinary(2);
 delay(b);
 
 digitalWrite (Cnumber, HIGH);
delay(a);
digitalWrite (Cnumber, LOW);
 displayBinary(3);
 delay(b);
 
 digitalWrite (Anumber, HIGH);
delay(a);
digitalWrite (Anumber, LOW);
 displayBinary(1);
 delay(b);
}

void displayBinary(byte numToShow)
{
  for (int i =0;i<4;i++)
  {
    if (bitRead(numToShow, i)==1)
    {
      digitalWrite(ledPin[i], HIGH); 
    }
    else
    {
      digitalWrite(ledPin[i], LOW); 
    }
  }
}

When working with seven segment displays with a common pin (either anode or cathode) you need to avoid using delay. The way the displays work is by flashing one digit really quickly, then flashing the next digit. When you flash the digits really quickly your eye can't tell. It is like using PWM on a LED (actually the exact same thing).

Try something similar to this psudeo code

void loop{
Check if time to update value (update is needed)

display segment 1
display segment 2
display segment 3 
display segment 4

}

This is called a state machine if you want to learn more.