La unica forma de ahorrar programa en ese caso es no repetir tanto lo mismo.
Pienso que la forma mas simple es la que propone
remi04. Con algunas modificaciones, quedaria asi:
void led( int8 repetir, int8 led1, int8 led2, int8 led3) {
for(i=0;i<=repetir;i++){
output_a(0b0011); //pisos
output_b(led1); //puertos de leds
delay_ms(time2);
output_a(0b0101);
output_b(led2);
Delay_ms(time2);
output_a(0b0110);
output_b(led3);
delay_ms(time2);
}
}
Y tu programa en el main quedaria asi:
while(true){
for(j=0;j<=7;j++){
led(3,0b10000000,0b00010000,0b00000010);
led(3,0b01000000,0b00010000,0b00000001);
led(3,0b00001000,0b00010000,0b00100000);
led(3,0b00000100,0b00010000,0b00000000);
led(19,0b00000010,0b00010000,0b10000000);
led(19,0b00000001,0b00010000,0b01000000);
led(19,0b00100000,0b00010000,0b00001000);
led(19,0b00000000,0b00010000,0b00000100);
Por supuesto esto esta realizado con delays, y lo mejor como dice
Picuino, seria usar interrupciones para dejar al micro haciendo otra cosa, sino facilmente el 95% del tiempo del micro se encuentra haciendo nada y no se utiliza, por ende se desaprovecha mucho del mismo. Pero si no tenes nada mas que hacer que eso nomas, entonces no hay problema.
Seguramente sea una mejora respecto al tamaño de codigo, pero no creo que llegue a ser una mejora demasiado grande, lo que si ganas es facilidad para realizar nuevas combinaciones.
Otra de las formas es usar punteros, el cual podrias llegar a reducir el codigo (funciones/instrucciones) escrito en C bastante mas, pero que no se si mejoraria en gran cantidad su tamaño, ademas tenes el costo de escribir los valores de los patrones a realizar en otro lado.