con banderas lo resuelves,Saludos lo intente por tu meto pero no funciona.
creas tantas banderas según las teclas, y cada vez que el usuario presione, se colocas en 1 la bandera correspondiente, luego al final del escaneo, revisas las banderas y sabrás cual tecla es.
con banderas lo resuelves,Saludos lo intente por tu meto pero no funciona.
creas tantas banderas según las teclas, y cada vez que el usuario presione, se colocas en 1 la bandera correspondiente, luego al final del escaneo, revisas las banderas y sabrás cual tecla es.
Implemente un for con 5 ciclos de 500 ms, tiempo para ingresar la combinación le he puesto una sencilla de momento "puros unos". solo me enciende los leds espera el segundo y luego me imprime el contador que me confirma es correcta la combinación, y solo imprime el cero pues no lee el for los pulsos. Aquí mi código.
#include <16F873a.h>
#include <stdlib.h>
#fuses XT, NOWDT
#use delay(clock=4000000)
#use RS232(BAUD=9600,BITS=8,XMIT=PIN_C6,RCV=PIN_C7)
int cont=0,b1=0,b2=0,b3=0,b4=0;
void main (){
while(true)
{
delay_ms(3000);
output_high(pin_b0);
output_high(pin_b1);
output_high(pin_b2);
output_high(pin_b3);
delay_ms(1000);
for(int i=0;i<5;i++);
{
if(input(pin_c0)==1)
{
b1=1;
}
if(input(pin_c1)==1)
{
b2=1;
}
if(input(pin_c2)==1)
{
b3=1;
}
if(input(pin_c3)==1)
{
b4=1;
}
delay_ms(500);
}
if(b1==1 && b2==1&& b3==1 && b4==1)
{
cont=1;
}
output_low(pin_b0);
output_low(pin_b1);
output_low(pin_b2);
output_low(pin_b3);
printf("\fContador: %u", cont);
}
}
Es decir que la persona debe poner el codigo de 4 digitos en 3 segundos ?, nuevamente te pido que me expliques como queres que funcione, no que tengas que leer en intervalos (no te pido lo que tenes que hacer para que funcione como queres), sino desde el putno de vista de una persona que lo usa:Si he sido ambiguo me disculpo, como habrán notado soy estudiante y nuevo en pics.
Ejemplo:
Pone el codigo de 4 digitos, si pasan 10seg desde la ultima pulsacion se borra todo y comeinza de 0. Si es correcto se acciona un bit de un puerto, si es erroneo se acciona otro bit. Los puertos de entradas son RB0 al RB4. Eso nomas te estoy pidiendo.
( aquí es donde esta mi problema generar una tarea que acepte las pulsaciones para que al término del tiempo (los 3 segundos), salga del scaneo y compruebe la combinación, si resulta correcta el contador se pone en 1.Eso no es un problema, son muchos problemas y están mal definidos.
Este es un problema típico de máquina de estados.
Una vez que la máquina de estados está clara, sólo hay que programarla en cualquier lenguaje.
Algunos programadores con experiencia pueden programar directamente una máquina de estados sin haberla dibujado ni haberla imaginado. Los resultados no suelen ser muy buenos, así que imagínate en tu caso que no tienes experiencia.
Ya que estás aprendiendo, lo mejor es comenzar haciéndolo bien.
He podido ver algunas chapuzas bastante grandes y que han costado retrasos y una buena cantidad de dinero por lanzarse a programar sin analizar antes el problema.
Analizar los estados de la máquina no es sencillo la primera vez. Te propongo los siguientes:
Situación inicial
Primera tecla pulsada
Segunda tecla pulsada
Tercera tecla pulsada
Todo el código correcto
Ahora tienes que definir qué tareas se hacen en cada uno de los estados y qué condición es necesaria para pasar de un estado a otro.
Código: C
int8 patron[4]={0b0001,0b0010,0b0100,0b1000}; int8 i,indice; int8 valoranterior, valoractual; itn1 codigocorrecto while(1) { // Muestro lo que debe introducir for( i=0 ; i < sizeof patron; i++) { output_c(patron[i]); delay_ms(800); } //Espero que se suelten todos los botones //Agregar aca el codigo para eso codigocorrecto = 0; valoranterior = 0; // Procedo a leer los pulsadores por un tiempo de 60 x 50ms = 3000ms // Si quisiera auemntar el tiempo, aumentaria el valor que debe alcanzar i, ejemplo // si quisiera 6s aumentaria la condicion del for a i < 120 ( 120x50ms = 6000ms ) for( i=0, indice=0; i < 60; i++) { // Compruebo primero que lo presionado sea distinto a la anterior pasada del for valoractual = LecturaPort & 0b1111; if (valoractual != valoranterior) { //Si es distinto entra aca, de esa forma yo se que algo cambio desde lo que se presiono antes //Este es el caso en que se presione un boton o muchos o directamente se suelten todos // No debo tomar cuando se suelten todos, asi que pregunto que para entrar posea algo presionado if(valoractual != 0) { //Aca hay algo presionado, solo me queda confirmar que lo presionado sea lo mismo que mostramos //Por eso compruebo en orden que se cumpla if(patron[indice] == valoractual) { //Si entro aca quiere decir que el valor que se presiono fue correcto // Asi que aumento el indice para el proximo valor a presionar indice++; // En caso de que se pusieron todos los valores entonces salgo y marco como correcto if(indice>=sizeof patron) { //Codigo Completo codigocorrecto=1; break; } } else { //Aca se introdujo otro valor no correcto //Procedo a salir break; } } } delay_ms(50); valoranterior = valoractual; } if(codigocorrecto == 1) { //Aca lo del codigo correcto } else { //Aca lo del codigo incorrecto } }
Personalmente me gustaria mas una solucion con un timer, pero aca tenes una solucion con delays.