Lo que te estan pidiendo que realizes es un PWM ( cualqueir cosa busca que es en internet )
¿Como lo realizaria?
Fijo un frecuencia/periodo, suponete que 100Hz es decir 10ms Y quiero que el brillo tenga 10 escalones. Asi que tendria que ser 10ms/10 = 1ms
Procedo a crear una interrupcion con un timer de 1ms. Y crear 3 variables globales ( 1 para cada salida) de 8 bits que van a tener el numero de 0 a 10.
Entonces en la interrupcion cuento cuantas veces entro a la misma, con una simple variable nuevamente. Si alguna de las variables de salida es igual a mi contador procedo a encender la salida. Cuando llega a 10 la cuenta de mi interrupcion, lo cambio por 0 y apago todas las salidas. Algo asi:
if(contador >= 10)
{
contador = 0;
SalidaA = 0;
SalidaB = 0;
SalidaC = 0;
}
if( contador >= SalidaA ) { SalidaA = 1;}
if( contador >= SalidaB ) { SalidaB = 1;}
if( contador >= SalidaC ) { SalidaC = 1;}
contador++;
El codigo en la interrupcion va a ejecutarse constantemente, sin tu interaccion, lo que vos vas a poder cambiar es el brillo desde tu main, para cambiar el brillo, solamente necesitas poner de 0 a 10 en las variable SalidaX.
Si el brillo lo hace muy lento que se ve el parpadeo, deberias buscar una frecuencia mayor.