Después de subir ese código me di cuenta de algunas variaciones interesantes (al menos para mi

) , como ya lo tenía escrito, lo comparto.
Las intrucciónes bit_set(x,
bit) y bit_clear(x,
bit) son eficientes cuando
bit es una constante, cuando es una variable genera un bucle donde va desplazando un '1'
bit veces.
Desde un enfoque friki, si esquivamos esto --> mejor.
Esto es casi lo mismo que el código anterior, pero es mas rápido y ocupa casi la mitad de memoria.
#define Tblink 100
portb = 0 ;
for(int8 i=0x80 ; i!=0 ; i>>=1){
for(int8 j=1 ; j!=i&&j!=0 ; j<<=1){
for(int8 k=0 ; k<2 ; k++){
portb |= j ; delay_ms(Tblink) ;
portb &= ~j ; delay_ms(Tblink) ;
}
}
portb|=i ;
}
Otro caso es si la secuencia de los leds fuese mas arbitraria. En ese caso sería necesario sí o sí tablas, como lo pensaste al principio,
solo que mas de una para diferenciar los leds encendidos siempre de los que parpadean.
Algo asi:
const int8 led_on[]={
0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000,
0b10000001,0b10000010,0b10000100,0b10001000,0b10010000,0b10100000,0b11000000,0b11000001,
0b11000010,0b11000100,0b11001000,0b11010000,0b11100000,0b11100001,0b11100010,0b11100100,
0b11101000,0b11110000,0b11110001,0b11110010,0b11110100,0b11111000,0b11111001,0b11111010,
0b11111100,0b11111101,0b11111110,0b11111111 };
const int8 led_off[]={
0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
0b10000000,0b10000000,0b10000000,0b10000000,0b10000000,0b10000000,0b10000000,0b11000000,
0b11000000,0b11000000,0b11000000,0b11000000,0b11000000,0b11100000,0b11100000,0b11100000,
0b11100000,0b11100000,0b11110000,0b11110000,0b11110000,0b11110000,0b11111000,0b11111000,
0b11111000,0b11111100,0b11111100,0b11111110 };
#define Tblink 100
for(int8 n=0 ; n<36 ; n++){
for(int8 i=0 ; i<2 ; i++){
portb = led_on[n] ; delay_ms(Tblink) ;
portb = led_off[n] ; delay_ms(Tblink) ;
}
}
portb=led_on[35] ;
Saludos.