TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado 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;
}
}
-
:?
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
-
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
-
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.
-
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
-
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