Acerca del Timer 0 o Timer 1, seguramente no lo configuraste correctamente.
Respecto a las lineas que no tienen efecto:
switch(sw)
{
case 1: sw==1; //esta linea no tendra efecto
Cuando haces el switch de sw, supongamos que tiene el valor 1, va a entrar en cada caso a segun lo que tengas definido el case, es decir ese case
1:
Lo que sigue seria una instruccion y no influye en nada donde este ubicado, seria como poner:
case 1:
sw==1; //esta linea no tendra efecto
output_b(0b00000001);
Ahora esa linea es una comparacion, es sw igual a 1? SI lo es, y por eso entro antes a ese case, pero esa comparacion te devuelve un TRUE o FALSE, que no se usa en nada por lo tanto es obvio que esa linea no tiene sentido. Y que espero que veas cual es el porque. Con el case solamente basta.
En ves de usar esto:
if(sw==10)
{
set_timer0(0);
}
podrias usar el default del switch
switch(sw)
{
case 1:
// Instrucciones aca
break;
case 2:
// Instrucciones aca
break;
case 3:
// Instrucciones aca
break;
case 4:
// Instrucciones aca
break;
case 5:
// Instrucciones aca
break;
default:
// Aca entra cuando no se cumple NINGUNO de los anteriores case, es decir para el sw >= 6 en este ejemplo
break;
PD: Si usas arrays, tu programa se vuelve mucho mas corto. Me refiero a hacer un array de estas dimensiones [9][5] e int8, en resumen :
int8 Valores[9][5]=
{
{x,x,x,x,x},
{x,x,x,x,x},
{x,x,x,x,x},
{x,x,x,x,x},
{x,x,x,x,x}
};
Donde las x serian los valores en binario. Ejemplo usando tu case igual a 1 ( 0 en el array ): {0b010000, 0b111011,0b111011,0b010000,0b111111},