Estela multiplexando displays de 7 segmentos

Hola,

tengo un pequeño display de 7 segmentos con 4 dígitos, el cual se activa multiplexando los cátodos de los segmentos.

El caso es que uso la librería MsTimer2 con un valor de 4 milisegundos, y un transistor BC547P para activar/desactivar la toma de tierra en cada cátodo.

Funciona bien, excepto que hay un efecto estela bastante extraño… por ejemplo:

2152

Se muestra como:

2792

Es como si se dibujara parcialmente los segmentos del dígito que hay a la izquierda.

Si alguien sabe qué puede ser, se lo agradezco.

Adjunto código:

#define displayRefreshRate 5
#define displayBlinkRate 60

int displayCurrentDisplayedDigit;
int displayDigitSegments[10][7] = {{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,0,0,1,1} // 9
};
int displayDigitAnodePins = {0,1,3,4,5,6,7};
int displayDigitCatodePins = {10,11,12,13};

void intTo7Segment(int v, int *d1, int *d2) {
if (v<10) {
*d1 = 0;
*d2 = v;
return;
}

int x = 0;
x = abs(v/10);
*d1 = x;
d2 = v - (10x);

}

void digitDisplayValue() {
switch(displayCurrentDisplayedDigit) {
case 0:
intTo7Segment(viewDateTime.Hour, &d0, &d1);
displayShowDigit(displayCurrentDisplayedDigit, d0);
break;
case 1:
intTo7Segment(viewDateTime.Hour, &d0, &d1);
displayShowDigit(displayCurrentDisplayedDigit, d1);
break;
case 2:
intTo7Segment(viewDateTime.Minute, &d0, &d1);
displayShowDigit(displayCurrentDisplayedDigit, d0);
break;
case 3:
intTo7Segment(viewDateTime.Minute, &d0, &d1);
displayShowDigit(displayCurrentDisplayedDigit, d1);
break;
}
displayCurrentDisplayedDigit++;
if (displayCurrentDisplayedDigit>4)
displayCurrentDisplayedDigit=0;
}

void displayShowDigit(int digit, int value) {
for (int j=0;j<4;j++)
digitalWrite(displayDigitCatodePins[j], LOW);

digitalWrite(displayDigitCatodePins[digit], HIGH);

for (int i=0;i<7;i++)
digitalWrite(displayDigitAnodePins_, displayDigitSegments[value]);_
}
void setup() {
* for(int i=0;i<14;i++)*
* pinMode(i, OUTPUT);*

* MsTimer2::set(displayRefreshRate, digitDisplayValue);*
* MsTimer2::start();*

}
void loop() {
}

Por cierto, el montaje, a nivel de cableado y demás, lo hice como el del amigo Indaltronia: http://www.indaltronia.com/2009/07/controlar-4-displays-de-7-segmentos-con-arduino/