No entiendo a que te referis con multiplexado... Que es lo que queres multiplexar? un display 7 segmentos?
Deberias tambien poner una descripcion de que queres que haga tu programa para asi entender al mismo.
Tus problemas son los delays claramente. Pero pienso que hay mas problemas o tal ves estas no estas usando algunas herramientas de C.
Cosas que me parecen mal..
kbd_init();
port_b_pullups (true);
bit_clear(trisb,0);
bit_clear(trisb,1);
bit_clear(trisb,2);
bit_clear(trisb,3);
bit_clear(trisb,4);
bit_clear(trisb,5);
bit_clear(trisb,6);
bit_clear(trisb,7);
set_tris_c(0b11100000);
kbd_init() realiza el cambio de algunos tris.. estas seguro de que puerto esta cambiando? Asi no lo cambias de nuevo con tus bit_clear y set_tris
Luego de eso comenzas a cambiar los tris de los demas puertos como es el B y el C, pero curiosamente el unico que tiene el FAST_IO es el D, entonces si en algun momento haces input_pin(PIN_B0) ese pin se va a convertir en entrada. Si vas a setear los tris vos, entonces ponelos a todos como FAST_IO, y asi el compilador no lo cambia a su gusto, sino que respeta lo que vos queres.
Para cambiar los tris tenes set_tris_x(), EJemplo para tu caso del PORTB seria set_tris_b(0); y le carga a todo el puerto el valor 0, es decir todas salidas. Por que hacerlo uno por uno como lo haces ?
Entonces ahi tendrias mal el orden si es que no sabes que hace KBD. Y podrias resumir todo en 3 lineas y no tanto.
//----------- pin_c0:microfono /
//----------- pin_c1:apertura < ENTRADAS
//----------- pin_c2:movimiento \
output_low(pin_c3);//buzzer /
output_low(pin_c4);//rele |
output_low(pin_c5);//rgb rojo < SALIDAS
output_low(pin_c6);//rgb verde |
output_low(pin_c7);//rgb azul \
Esta como muchas mas otras.. si usas el FAST_IO(C) y haces ouput_c(0); tendrias el mismo resultado, es decir se mantendrian como entradas las que deben y todo eso pasa a ser 1 sola linea.
char a;//primer caracter de la contraseña
char b;//segundo caracter de la contraseña
char c;//tercero caracter de la contraseña
char d;//cuarto caracter de la contraseña
Cuando se trata de que ingresan numeros o letras, es mejor usar un array, es decir
unsigned char contrasena[4] = {1,2,3,4}; //Contraseña inicia con los valores 1234
Ya que tomar el valor y actuar usualmente es repetitivo, observaras para tu caso que para a,b,c y d haces exactamente lo mismo.. Entonces podriamos poner un for y compactar eso.
reint0:
Intenta evitar hacer saltos con un goto, C provee las herramientas suficientes como para hacerlo sin esto.. Muy pocos casos vi donde se ha usado. Y hablando de codigos muchos mas complejos
-------------------------------------------------------
Cuando comparas una contraseña, existe un potencial problema.. si vos das aviso de cual es erroneo la contraseña no sirve para nada por que seria facil de sacar. Ejemplo supongamos que la contraseña es 1234, presiono el 1 y me da correcto, presiono 1 de vuelta y me dice incorrecto, aca podria hacer 2 cosas comenzar del principio o si estoy avisando que esta mal, avizar y quedarme donde estoy que es lo que haces.
Si comienzo del principio, le estoy avisando al atacante que la contraseña ese valor es incorrecto, entonces solo debe probar como maximo 10 combinaciones 10 ,11 ,12 ,13 ..., 19 hasta que uno le de valido y pueda seguir...
El proceso correcto es tomar los 4 valores sin decir NADA.y una ves esten los 4 valores compararlos con la contraseña.Existen muchas mas precauciones a tomar pero para el momento es suficiente.
--------------------------------------------------------
Dividir el problema en distintas etapas..
- Detectar la contraseña
- Compararla
- Actuar
--------------------------------------------------------
unsigned char contrasena_detectada[4] = {0,0,0,0}; // Donde va a ir la contraseña ingresada
const char contrasena[4] = {1,2,3,4}; // Contraseña guardada y a comparar
char letra = 0; // Variable donde voy a almacenar lo leido del teclado
char letra_anterior = 0; // Variable que mantiene el valor de la ultima tecla presionada, asi no cuenta 2 veces lo mismo
bool contra_correcta = false; // Variable para saber si luego de la comparacion fue correcto o no lo ingresado
void main(void)
{
unsigned char indice = 0;
setup()
while(1)
{
// Tomamos los valores!
while(1)
{
//Guardamos el valor en unavariable
letra = kbd_get();
// Revisamos que hay algo presionado, y que sea distinto a lo detectado anteriormente
if( letra != 0 && letra != letra_anterior)
{
// Guardo contraseña
contrasena_detectada[indice];
// Aumento el indice
indice++;
// Entraron todos los valores?
if(indice >= sizeof(contrasena);
{
//Salgo del while
break;
}
}
// Guardo el ultimo valor ingresado asi si alguien mantiene presionado el boton no cuenta 2 veces
letra_anterior = letra;
}
// Ya tengo guardado las cosas, ahora a comparar
contra_correcta = true;
for(indice = 0; indice < sizeof(contrasena); indice++)
{
if(contrasena[indice] != contrasena_detectada[indice])
{
contra_correcta = false;
break;
}
}
// Actuo ahora que se el resultado
if(contra_correcta == true)
{
}
}
}
No recuerdo si el kbd retorna enteros o caracteres, sino solo tendrias que reemplazar
const char contrasena[4] = {1,2,3,4};
por
const char contrasena[4] = {'1','2','3','4'};