Gracias por la ayuda.
Al final lo he hecho mediante esta funcion basada en el código de Cucaracha (espero q no estes a favor de las patentes de SW

), la idea es la misma simplemente q en lugar de hacer restas sucesivas lo hago con una division y que sirve para mostrar hasta el 9999. Luego muestra por unos displays conectados a los puertos B y C el resultado.
void muestra_display(int valor_binario)
{
unsigned char byte0=0x00;
unsigned char byte1=0x00;
unsigned char byte2=0x00;
unsigned char byte3=0x00;
int valor_aux=0;
byte3=valor_binario/1000;
valor_aux=valor_binario%1000;
byte2=valor_aux/100;
valor_aux=valor_aux%100;
byte1=valor_aux/10;
valor_aux=valor_aux%10;
byte0=valor_aux;
PORTB=(byte1<<4)+byte0;
PORTC=(byte3<<4)+byte2;
}