Bueno, aunque con meses de retardo, he querido aportar algo que funcionaría en un PIC16F84A. La frecuencia sería de unos 50 Hertz. Cuando se presiona un pulsador, la frecuencia baja unos microsegundos pero el efecto es inapreciable. Ahí va el código:
/*
* Nombre del proyecto:
LED multicolor
* Autor
jirardiyo
* Descripción:
LED tricolor que reproduce 256^3 colores (algo más de 16 millones)
El color se controla con seis pulsadores
El LED se conecta a 1, 2 y 3 del puerto A y a GND
Los pulsadores van conectados al puerto B, patillas de 0 a 5
El LED tricolor se puede sustuir por tres LEDs, rojo, verde y azul.
* Diseñado para:
MCU: PIC16F84A
Tarjeta: Hay que construirla
Oscilador: XT, 04.0000 MHz
Compilador: mikroC v5.0
*/
#define rLED PORTA.F1
#define gLED PORTA.F2
#define bLED PORTA.F3
#define rPulUp PORTB.F0
#define rPulDw PORTB.F1
#define gPulUp PORTB.F2
#define gPulDw PORTB.F3
#define bPulUp PORTB.F4
#define bPulDw PORTB.F5
void main() {
unsigned char i, rValue, gValue, bValue = 0;
PORTA = 0b00000000; // LEDs apagados
TRISA = 0b11110001; // salidas: RA1 ~ RA3
PORTB = 0b11111111; // ningún pulsador accionado
TRISB = 0b00111111; // pulsadores: RB0 ~ RB5
while(1) {
if(i==0) {
if(rValue > 0) rLED = 1;
if(gValue > 0) gLED = 1;
if(bValue > 0) bLED = 1;
}
else {
if(rValue == i) rLED = 0;
if(gValue == i) gLED = 0;
if(bValue == i) bLED = 0;
}//endif(i==0)
if(rPulUp == 0 && rValue < 254) rValue++;
if(rPulDw == 0 && rValue > 0) rValue--;
if(gPulUp == 0 && gValue < 254) gValue++;
if(gPulDw == 0 && gValue > 0) gValue--;
if(bPulUp == 0 && bValue < 254) bValue++;
if(bPulDw == 0 && bValue > 0) bValue--;
i++;
}//endwhile(1)
}
la programación va un poco a lo bruto, pero así se entiende mejor.
Saludos cordiales.