TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: sensey82 en 19 de Marzo de 2010, 13:21:30

Título: Hacer password sin teclado matricial
Publicado por: sensey82 en 19 de Marzo de 2010, 13:21:30
Hola a todos.
Es mi primer post en este foro y soy bastante nuevo en esto. Tengo un problema a la hora de realizar un pasword de entrada para una aplicacion.  el gran problema es que consume mucha memoria y me acaba petando el compilador CCS. la idea es que con un numero de 4 cifras i mediante 2 pulsadores de + y - respectivamente ir formando este numero. con otro pulsador pasariamos de unidades a decenas etc. el gran problema es que uso 4 variables para las 4 cifras i otras 4 que van en el main que son las a comparar. cabe destacar que la salida es a LCD de 4 filas... os dejo el trozo de la rutina del pasword i la de la comparacion a ver que me podeis decir como hacer-lo... la gran ventaja es ahorrarse el teclado maatricial. qualquier aporte es bueno


//RUTINA DEL PASSWORD

void pass(void){
do{

printf(lcd_putc,"\fintro pass");
printf(lcd_putc,"\n%u%u%u%u",c1 c2 c3 c4);
delay_ms(20);

   if (input(PIN_B0)==1){
   delay_ms(30);
   p++;
   delay_ms(50);     
   }
   if (p==10){
   p=0;   
   }
   if (input(PIN_B5)==1){
      comppass();
   }

switch (p){
      case 0:
         if (input(PIN_B3)==1){
         delay_ms(20);
         c1++;
         }
         if (input(PIN_B4)==1){
         delay_ms(20);
         c1--;     
         }
         if (c1==10 || c1==255){
         c1=0;
         }
         break;
      case 1:
         if (input(PIN_B3)==1){
         delay_ms(20);
         c2++;
         }
         if (input(PIN_B4)==1){
         delay_ms(20);
         c2--;
         }
         if (c2==10 || c2==255){
         c2=0;
         }
         break;
      case 2:
         if (input(PIN_B3)==1){
         delay_ms(20);
         c3++;
         }
         if (input(PIN_B4)==1){
         delay_ms(20);
         c3--;
         }
         if (c3==10 || c3==255){
         c3=0;
         }
         break;
      case 3:
         if (input(PIN_B3)==1){
         delay_ms(20);
         c4++;
         }
         if (input(PIN_B4)==1){
         delay_ms(20);
         c4--;
         }
         if (c4==10 || c4==255){
         c4=0;
         }
         break;
      case 4:
         p=0;
         break;
     
}
}while (c9==0);
}

//RUTINA COMPARAR PASSWORD
void comppass(){                         
if ((c1==c5 && c2==c6 && c3==c7 && c4==c8)==1){     
   c9=1;
}
}
Título: Re: Hacer password sin teclado matricial
Publicado por: MLO__ en 19 de Marzo de 2010, 14:07:27
 :?

Porque dices que te consume mucha memoria el usar el teclado matricial? Lo que si usa es todo un puerto  :mrgreen:

Creo que el método de los pulsadores es algo incomodo para ingresar el password. Tienes la rutina del teclado matricial? podríamos revisar el código a ver si se merma el consumo de memoria.

Saludos
Título: Re: Hacer password sin teclado matricial
Publicado por: septiembre_negro en 19 de Marzo de 2010, 20:32:01
Para que puedan ayudarte mejor deberías postear el código completo e indicar que modelo de micro este usando.
Esto lo digo por que  el pedazo de código que posteas cabe muy fácil  por ejemplo en un 16f877
Título: Re: Hacer password sin teclado matricial
Publicado por: BrunoF en 19 de Marzo de 2010, 21:28:37
Si el problema es de optimizacion, se me ocurre que solo necesitarias, 2 bytes para almacenar el codigo(4 bits por digito) y solo un bit para comprobar si el password coincide.

Por ejemplo, cuando el usuario ingresa el primer digito, inicializar la variable BOOLEANA a TRUE.
Luego procedes a comparar el primer digito, y a continuacion iras comparando los 3 digitos restantes. Si en alguna de estas 4 comparaciones, el resultado no es el esperado(lo que equivale a que el digito no coincide con el del pass) cambias la variable booleana a FALSE.

Si al ingresar el 4to digito y compararlo, el pass ingresado habra sido el correcto solo si la variable booleana vale TRUE.

Simplificando:
Inicializar variable a TRUE;
Comparar el valor ingresado digito a digito con el del pass. Si en algun momento el digito no corresponde con el pass, cambiar la variable a FALSE;
si luego de comparar el 4to digito, la variable aun vale TRUE, permitir acceso, sino...tu ya sabras que hacer...

Saludos.
Título: Re: Hacer password sin teclado matricial
Publicado por: sensey82 en 20 de Marzo de 2010, 17:32:07
hola! gracias por los aportes.
aki el gran problema es ke uso el 16F877 i de momoria va bien pero el programa es muy grande ya ke es el control de un hivernadero y no lo pondre todo para no marearos  ;P  Probare lo de ir comparando variable kon variable asi optimizaria la memoria. la variable de salida de comparacion de password ya es booleana pero las otras 8 no.. yo creo que ahi esta el problema. Por otro loado no uso el teclado matricial devido a que me consume unn puerto y vouy justo de entradas y salidas y no me cabe ya que no dispongo de suficientes patillas. ya os comentare
Título: Re: Hacer password sin teclado matricial
Publicado por: septiembre_negro en 20 de Marzo de 2010, 23:14:08
Mmm quizás te saque de líos la posibilidad de utilizar un teclado por i2c con un expansor de puertos o si estas en la posibilidad de agregar un pic mas que controle el teclado y envié la tecla pulsada al pic maestro por puerto serie