A pesar de que optimizaste al máximo el código tome solo estos detalles y los otros los guardare para posibles ideas, ya que, se nota que mi nivel de programación es algo(por no decir muy muy
) bajo y se que para ser el primer proyecto en pic, se tengas errores de esta clase.
Nadie nacio sabiendo, todo se gana con la practica, si ves que en tu codigo tenes muchas veces repetido un mismo pedazo de codigo (la misma forma) pero distintas variables, quiere decir que existe alguna forma de mejorarlo.
Una cosa que no nombre es que al array con los numeros, le agregue el "const" en su definicion, esto es para que el compilador sepa que como es constante y no se va a modificar, lo ponga en la FLASH, sino debe ponerlo en la RAM, y para eso necesita tener los valores en la FLASH para luego pasarlos a la RAM, en resumen, terminas ocupando RAM y sin querer espacio de FLASH, con el "const" le digo que lo ponga en la FLASH y que tome de alli los valores.
Tengo una duda en esta lectura input_A()&0b00111000) >> 3; No entiendo muy bien el porque ">>3" Se debe a la posición de la lectura ya que los puertos van del RA0 al RA6, y como estoy entrando un dato binario y usando mascara para leer justamente eso el dato no se lee bien, es como por decir una corrección de la lectura, pero hasta hay se.
Mas que una correccion, lo que busco obtener yo es un numero de 0 a 7 de esos 3 bits. El problema que se encuentran desde el bit 3 al 5, Cuando hago la AND siguen quedando en esas posiciones. es decir:
PORTA = xxaa axxx (x los valores que quiero quitar, y a los valores que me interesan)
Hago la AND con 0011 1000
El resultado es: 00aa a000
Haciendo un desplazamiento a la derecha 3 veces " >> 3 " hago que esos bits queden asi: 0000 0aaa
Ahora si ambos valores son numeros de 0 a 7, y sumarlos es viable y facilmente como podes ver.
Otra duda es saber si existe un forma de hacer que el delay sea el exacto para poder visualizar el numero/letra, ya que, si los quito me la muestra apresuradamente y colocando un delay(500...100....2..1) no logro sino en los 2 ultimo ver parte del numero/letra mas no completo. Muchas Gracias.
Los delays son un gran problema, la idea siempre es minimizar su uso, asi como esta realizado el programa, implica que cualquier cosa que pongas en tu loop principal va a afectar en el tiempo que se muestra. Antes vos lo tenias para que muestre por 2 segundos en los cuales mientras muestra NO se puede ejecutar nada, terminado eso lee los botones y se encierra nuevamente al mostrar y eso es un problema. Que pasaria si en tu codigo de los botones tenes un delay de 1s, eso significa que tendrias 2s mostrandose y 1s sin mostrar, y vuelve a repetirse, se ve ahora el problema?
¿Cual es la mejor solucion para esto?
Independizar los tiempos. Usar un Timer, este Timer lo configuras para que cada 5ms por ejemplo llame a una funcion (que es la de interrupcion) entonces, cuando es el momento de actualizar el display lo hace por mas que estaba ejecutando cualquier cosa dentro del loop infinito. En realidad deja en pausa el loop infinito y atiende la interrupcion. Pero como la rutina de interrupcion es rapida parece como si estuviera ejecutandose simultaneamente.
El codigo quedaria algo asi:
#INT_TMR1
void interrupcion_tmr1(void)
{
set_timer_1(0); // Valor a determinar, por ahora ponemos 0
output_B(NumeroMatriz[valorAmostrar][k]);
output_D(NumeroMatriz[MATMOV][k]);
k++;
if(k==8) { k=0;} // Si se paso que vuelva a comenzar
}
Y en tu main, unicamente le tendrias que dar inicio al Timer y luego nada mas, la funcion "mostrar" estaria ahi en la interrupcion. Entonces...
Ese codigo se ejecuta cada 5ms (si es que configuramos el Timer para 5ms), por lo tanto no necesitas ningun delay, de querer cambiar el valor a mostrar, en tu loop principal le asignas el valor a la variable "valorAmostrar", obviamente a esa variable hay que hacerla global (declararla fuera del main) y ponerle el
volatile (asi obligamos al compilador que siempre lo lea, usalo cuando tengas variables que se usan tanto en la interrupcion como en el main).
Y listo, ahora en tu main no tenes mas la funcion "mostrar", podes poner delays y siempre se va a ver correctamente. Lo unico "complejo" que tiene esto es que tenes que configurar el Timer al comienzo del main ( despues de los set_tris por ejemplo ).