That display is 4 separate segments. There are 8 segments per digit, and 4 common cathodes.
You connect the 8 segments and 4 cathodes to 12 IO and drive each digit sequentially. Here's some code I threw together to display numbers on that particular display.
note: this code isn't all that great, or even all that complete.
#include <TimerOne.h> // this is non-standard, download it from the arduino site
const int num_digits = 10;
const byte num_pins = 8;
const byte num_grounds= 4;
byte grounds[] = {3,2,1,0}; // g1,g2,g3,g4
byte segments[] = {9,6,13,12,11,8,7,4}; // A,B,C,D,E,F,G,P
byte num_to_display[]={0,0,0,0};
int led_nums[num_digits][num_pins]=
{
{1,1,1,1,1,1,0,0}, // 0
{0,1,1,0,0,0,0,0}, // 1
{1,1,0,1,1,0,1,0}, // 2
{1,1,1,1,0,0,1,0}, // 3
{0,1,1,0,0,1,1,0}, // 4
{1,0,1,1,0,1,1,0}, // 5
{1,0,1,1,1,1,1,0}, // 6
{1,1,1,0,0,0,0,0}, // 7
{1,1,1,1,1,1,1,0}, // 8
{1,1,1,1,0,1,1,0}, // 9
};
void setup()
{
int i;
for (i = 0;i < num_pins;i++)
{
pinMode(segments[i],OUTPUT);
if (i < num_grounds)
{
pinMode(grounds[i],OUTPUT);
digitalWrite(grounds[i],HIGH);
}
}
Timer1.initialize(550);
Timer1.attachInterrupt(updateDisplay);
}
void updateDisplay()
{
int g,d;
for (g = 0; g < num_grounds;g++)
{
for (d = 0;d < num_pins;d++) if(digitalRead(segments[d]) == 1) digitalWrite(segments[d], LOW); // clear used
digitalWrite(grounds[g],digitalRead(grounds[g])^1); // enable digit
for (d = 0;d < num_pins;d++) digitalWrite(segments[d], (led_nums[num_to_display[g]][d] == 1) ? HIGH : LOW); //write segments
digitalWrite(grounds[g],HIGH); // disable digit
}
}
void loop()
{
setDigits(1,2,3,4);
}
void setDigits(byte n1, byte n2, byte n3, byte n4)
{
num_to_display[0] = n1;
num_to_display[1] = n2;
num_to_display[2] = n3;
num_to_display[3] = n4;
}