Primero separemos los trabajos que tenemos:
- Lectura de botones
- Contador ( Decrementar cada xx tiempo )
- Mostrar en display
Dependiendo de donde tengas cada funcion puede que tengas problemas o no.
Vamos a pensarlo de 2 formas distintas.
Si usamos interrupciones:
Mientras el microcontrolador se queda encerrado en un bucle dentro del programa principal debido a que tenes presionado el boton, al ocurrir una interrupcion de un Timer ( en el cual paso una parte de tiempo), el microcontrolador guarda la posicion de la instruccion que estaba ejecutando ( bucle infinito ) y ejecuta el codigo de la interrupcion, cuando termina el codigo de la interrupcion vuelve al programa principal o a donde habia guardado esa posicion de instruccion. De esa forma mientras tenes el boton presionado la interrupcion se ejecuta. Por lo cual no afectaria en nada lo que pongas en tu rutina principal.
En este metodo la interrupcion, supongamos que interrumpe cada 100ms, y queremos que descuente cada 1 segundo, entonces al contar 10 interrupcion procedo a restar el contador.
Por lo cual el contador NO se ve afectado.
Si tenemos el codigo de muestra de display en otra interrupcion de otro Timer ( o en el mismo que el anterior ), veriamos que el mostrar en el display TAMPOCO se veria afectado.
SIN interrupcion:
En este caso tendrias problemas si tu codigo se queda encerrado esperando que sueltes el boton, nada de lo demas se va a ejecutar, por lo tanto se veria afectado el contador.
¿ Es posible hacer un codigo en el cual no quede encerrado ? Si. Si podes hacerlo. Aunque para mantener un valor correcto de tiempo, lo mejor es que uses una interrupcion para tu contador. Sino al decrementar puede que tarde distinto de la ves que decremento con anterioridad.
Termino medio, solo contador en uan interrupcion
Supongamos que decido usar solo 1 Timer y su interrupcion, y lo uso unicamente para el contador. Que reduce 1 cada 1 segundo. Empiezo con un valor 9.
El codigo que se encarga de mostrar el valor esta junto con el de los botones, en la rutina principal.
Presiono un boton que es para incrementar el valor y lo tengo presionado por 4 segundos.
Lo que voy a notar mientras esta presionado es que El display solo muestra un solo valor, en caso de que sea multiplexado solo un display va a estar encendido. Esto por que al tener presioando el boton no dejo que se ejecute la parte de muestra del display.
Al momento de soltarlo luego de esos 4 segundos, el contador al estar en la interrupcion continua ejecutando, por lo tanto al soltar el boton comienza a ejecutarse el codigo de muestra en los displays, por lo que el numero pasaria de 9 a 5 ( por esos 4 segundos que pasaron ).
El contador siguio contando. El problema aca fue que no se muestra a tiempo.
Puse este ejemplo por que cuando hablas de "afecta al contador" lo podes percibir de 2 formas, uno es el contador interno y lo otro es lo que ves que serian los displays. Que al ver solo el display te parece que no funcione pero por detras si lo hace.