multifunction shield 7 segment strange behavior

Hi I got a Multifunction shield with a 4 digit 7 segment display and wanted to try it.
So I tried to run the following code:

const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};
 
#define latch 4
#define clk 7
#define data 8

void WriteNumberToSegment(byte segment, byte value){
  digitalWrite(latch,LOW);
  shiftOut(data, clk, MSBFIRST, SEGMENT_MAP[value]);
  shiftOut(data, clk, MSBFIRST, SEGMENT_SELECT[segment] );
  digitalWrite(latch,HIGH);
}
void sevenseg(int inumber){
  //Eine For Schleife, denn eine Pause mit delay
  //ist nicht möglich. Hier muss "nur" die Zeit durch
  //den max Wert der For Schleife angepasst werden.
  WriteNumberToSegment(0 , inumber / 1000); 
  WriteNumberToSegment(1 , (inumber / 100) % 10);
  WriteNumberToSegment(2 , (inumber / 10) % 10);
  WriteNumberToSegment(3 , inumber % 10); 
}
void setup() {
  // put your setup code here, to run once:
  pinMode(latch,OUTPUT);
  pinMode(clk,OUTPUT);
  pinMode(data,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
 for(int i =0;i<20;i++){
  sevenseg(i);
  delay(500);
 }
}

the display flickers for the 10 100 and 1000 digit with the delay time. The first digit is a lot brighter than the other ones.
and even worse: the numbers count 0 1 2 3 4 9 8 7 8 9 10 11 12 13 14 19 18 17 18 19
So I guess this line: const byte SEGMENT_MAP = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; is wrong
Thanks for your help

I am away from the Arduino at the moment but I seem to remember that the shield can short on the USB connector so it would be worth checking that

You just fixed the number problem. Thanks alot.
The problem that the 3 digits for X0 X00 and X000 flicker for just a very short time still remains. (thats why they are darker) Any Idea on that?

Try this code

/* FILE:    ARD_Multifunction_Shield_Seven_Segment_Example
   DATE:    28/05/14
   VERSION: 0.1
   
REVISIONS:

28/05/14 Created version 0.1

This is an example of how to use the 4 digit seven segment display on the Hobby 
Components Arduino compatible Multi Function experimenter shield (HCARDU0085).

This example sketch will display a decimal number on the seven segment LED display 
which will increment by one wever 100ms.

You may copy, alter and reuse this code in any way you like, but please leave
reference to HobbyComponents.com in your comments if you redistribute this code.
This software may not be used for the purpose of promoting or selling products 
that directly compete with Hobby Components Ltd's own range of products.

THIS SOFTWARE IS PROVIDED "AS IS". HOBBY COMPONENTS MAKES NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ACCURACY OR LACK OF NEGLIGENCE.
HOBBY COMPONENTS SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR ANY DAMAGES,
INCLUDING, BUT NOT LIMITED TO, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY
REASON WHATSOEVER.
*/


/* Define shift register pins used for seven segment display */
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
 
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};


unsigned long Cur_ms_Count; // Stores the current time in ms
unsigned long Last_ms_Count; // Stores the last time in ms the counter was last updated
int Count; // Stores the value that will be displayed

void setup ()
{
  /* Set DIO pins to outputs */
  pinMode(LATCH_DIO,OUTPUT);
  pinMode(CLK_DIO,OUTPUT);
  pinMode(DATA_DIO,OUTPUT); 
  
  /* Initiliase the registers used to store the crrent time and count */
  Cur_ms_Count = millis();
  Last_ms_Count = 0;
  Count = 0;
}

/* Main program */
void loop()
{
 
  /* Get how much time has passed in milliseconds */
  Cur_ms_Count = millis();
  
  /* If 1000ms has passed then add one to the counter */
  if(Cur_ms_Count - Last_ms_Count >= 1000)
  {

    Last_ms_Count = Cur_ms_Count;
    
    if(Count < 9999)
    {
      Count++;
    } else
    {
      Count = 0;
    }
  }
  
  /* Update the display with the current counter value */
  WriteNumber(Count);
}


/* Write a decimal number between 0 and 9999 to the display */
void WriteNumber(int Number)
{
  WriteNumberToDigit(0 , Number / 1000);
  WriteNumberToDigit(1 , (Number / 100) % 10);
  WriteNumberToDigit(2 , (Number / 10) % 10);
  WriteNumberToDigit(3 , Number % 10);
}

/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToDigit(byte digit, byte Value)
{
  digitalWrite(LATCH_DIO,LOW); 
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[digit] );
  digitalWrite(LATCH_DIO,HIGH);    
}

that works thanks. So the delay function was the problem?
Edit: Just tested it. The delay function is the problem.
So I just have to use something like your loop to delay.

It is important when multiplexing displays to keep them updated as frequently as possible. The delay() function stops everything for a period of time.