Hola amigos, gracias por sus respuestas.
Bueno, cuando te estaba elaborando la respuesta, hicimos una revisión junto a mi compañero y descubrimos el problema: un divisor de voltaje mal calculado que estaba dando 10.9 voltios en vez de 5v en los 3 pines de entrada (incluyendo el A0 de la multiplexación)…. Pienso que ese es el problema de por que el hardware no funcionaba correctamente. Pero de cualquier manera les voy a poner los segmentos de códigos solicitados por si aún así hay problemas en el software.
Antes que nada quiero explicar que el hardware es básicamente una matriz de leds de 3 filas (A0, A1 y A2)*10 columnas (puerto b completo + A6 y A7), donde las 3 filas se atienden con el clásico transistor que alimenta todos los leds de la fila mientras se completa la escritura del display con los 10 pines de las columnas. Además de esto las 3 entradas y master clear, las entradas son A0 (multiplexado i/o), A3 y A4.
Yo necesitaba 3 pines de entrada y solo me quedaban 2 libres para leer entradas, entonces decidí usar el pin que faltaba de la primera fila, ya que al ser un display, el mismo enciende primero la primera fila, luego la segunda y finalmente la tercera. El algoritmo básicamente coloca en el valor cero (0) una variable “leer_s” cada vez que se enciende la fila 1, y pone el valor 1 cuando esta fila está apagada o las otras están encendidas. Esta variable la reviso cuando voy a leer los 3 pines que necesito, y solo se leen si la variable está en 1.
El código es un poco extenso, por eso voy a poner los fragmentos de código que tienen que ver con la lectura/escritura del pin en cuestión.
El pin específico es A0, que lo definí como “stop”
La parte que tiene que ver con la escritura es, en este caso switch es una variable con valores de 0, 1 ó 2 y es que define que fila se va a “encender”, notar que en el caso de fila 1 ( case(0)) la variable leer?s vale 0, indicando de esta manera al módulo más abajo que no puede leer, ya que la lectura solo es con leer_s igual a 1:
Escritura:
*********************************************
switch(i)
{
case(0):
output_high(fila1);
leer_s = 0; //Indica que no se debe leer las señales
break;
case(1):
output_high(fila2);
leer_s = 1;
break;
case(2):
output_high(fila3);
leer_s = 1;
break;
}//Cierre del switch fila
**************************************
La parte que tiene que ver con la lectura es la siguiente:
********************************************
if((antirebote == 0)&&(leer_s == 1)) //esta es la parte que define si leer o no el pin A0 (stop)
{
if((!input(stop)) && (!input(derecha)) && (!input(izquierda)))//
apagado_s = 1;//
else
apagado_s = 0;//
////////////////////////////////////////////////////////////////////////////////
if((input(stop)) && (!input(derecha)) && (!input(izquierda)))//Condición exclusiva de STOP
stop_s = 1;//Activado izquierda
else
stop_s = 0;//
Bueno, muchísimas gracias por su ayuda y si en el código hay error por favor, corríjanme, pero creo que el fallo es de hardware (aun no lo he corregido pero va una resistencia de 14K (según cálculos) donde estaba puesta una de 1k.
Saludos cordiales