Te tiro un posible procedimiento:
- Configuras la interrupcion de un timer (ej. el T0) a un cierto tiempo (por ej. podrias configurar el timer en 50mSeg)
- Usando una variable global haces una cierta cuentas hasta llegar al tiempo que necesitas que tome una cuenta (ej. si la interrupcion del T0 salta c/50mSeg, para llegar a 1Seg debo realizar 20 cuentas).
- Una vez llegado a las 20 cuentas, levanto un flag y reseteo la cuenta (incluso podria usar la propia cuenta como flag, pero te puede resultar mas sencillo verlo asi)
- Cada vez que se levanta el flag, lo vuelvo a bajar, y resto uno a la cuenta que queres hacer (59 ... 0)
- Repito procedimiento una y otra vez, hasta que llego a cero, y reseteo el contador a 59 para volver a empezar.
Para los displays te recomiendo que uses una tabla (o vector), que te permita pasar de Bcd a 7 segmentos, simplemente elegi los 7 puertos que vas a usar, y armate una tabla que decodifique dicho numero, ej.:
unsigned char 7seg[10]={0x3f,....};
Entonces la idea de la tabla es por ej. entrar con 0 y salir con el valor adecuado en 7 segmentos, que si te tomas el trabajo es 0x3f si uso el puerto menos significativo como 'a' y el mas significativo 'g':
Código:
...
P2=7seg[0]; // Uso el puerto 2 como salida para los 7 segmentos
...
Yo tengo la tabla completa, pero estaria bueno que lo hagas vos 1 vez asi aprendes de donde salen esos numeros.
Por otro lado, antes de comenzar la programacion de los 7 segmentos, deberias tener listo el hard y en funcion de eso programar, como pista, podrias multiplexar los 2 7 segmentos, y deberas tener en cuenta que los puertos del 8051 no tiran mas de 250uA (creo que rondaba por ahi), asi que vas a tener que meterle algo en el medio.