Autor Tema: Teclado y LCD con pic15F4550 (solo ejecuta un if)  (Leído 2570 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ginnie

  • PIC10
  • *
  • Mensajes: 4
Teclado y LCD con pic15F4550 (solo ejecuta un if)
« en: 12 de Mayo de 2015, 20:56:37 »
Hola, soy nueva en el foro y he tenido un problema que se me ha hecho complicado resolver.
Resulta que tengo un programa para leer una tecla desde el keypad y mostrarlo en la lcd, con dos condiciones para cuando es A y para cuando no es A, pero solo ejecuta una de las dos y a la segunda nunca entra, aún cuando presiono la tecla A en el keypad la muestra normalmente en la LCD y no realiza la sentencia, agradecería su ayuda.
18F4550
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#fuses HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN,XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=20000000)
#include   <LCD_FLEX.c>
#define use_porta_lcd_flex TRUE
#define use_portb_kbd TRUE
#include <kbd.c>
#include <stdlib.h>
#include <stdio.h>


char tecla;
int i=0;

void inicio(){
lcd_init();
port_b_pullups(TRUE);
lcd_gotoxy(1,1);
lcd_putc(" INICIO");
delay_ms(1000);                                             
lcd_putc("\f");     
lcd_putc("NUMERO:");
lcd_gotoxy(1,2);
lcd_putc("(A) --> GUARDAR");
lcd_gotoxy(7,1);

kbd_init();

while(i<1){
     
        tecla=kbd_getc();   
             
         if (tecla!= 0){
       
         
       
       if(tecla!="A"){
          printf(lcd_putc,"%c", tecla);
         
         }
       if (tecla=="A"){
         lcd_putc("VALOR INGRESADO");
         i=1;
        }
       
    }   
     
  }
 
}


void main(){
inicio();
}

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Teclado y LCD con pic15F4550 (solo ejecuta un if)
« Respuesta #1 en: 12 de Mayo de 2015, 22:22:48 »
Probaste hacerlo asi?, soy muy novato pero siempre hice el codigo empezando por void main

Código: [Seleccionar]

void main(){

while(i<1){
     
        tecla=kbd_getc();   
             
         if (tecla!= 0){
       
         
       
       if(tecla!="A"){
          printf(lcd_putc,"%c", tecla);
         
         }
       if (tecla=="A"){
         lcd_putc("VALOR INGRESADO");
         i=1;
        }
       
    }   
     
  }


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Teclado y LCD con pic15F4550 (solo ejecuta un if)
« Respuesta #2 en: 13 de Mayo de 2015, 01:49:20 »
Tal como te dijeron, no tiene sentido hacer esa llamada desde el main.
Tambien deberias tener un bucle infinito el cual no tenes


Código: C
  1. #fuses HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN,XT,NOWDT,PUT,BROWNOUT,NOLVP
  2. #use delay(clock=20000000)
  3. #include   <LCD_FLEX.c>
  4. #define use_porta_lcd_flex TRUE
  5. #define use_portb_kbd TRUE
  6. #include <kbd.c>
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9.  
  10. char tecla;
  11.  
  12. void main(){
  13. lcd_init();
  14. port_b_pullups(TRUE);
  15. lcd_gotoxy(1,1);
  16. lcd_putc(" INICIO");
  17. delay_ms(1000);                                              
  18. lcd_putc("\f");      
  19. lcd_putc("NUMERO:");
  20. lcd_gotoxy(1,2);
  21. lcd_putc("(A) --> GUARDAR");
  22. lcd_gotoxy(7,1);
  23.  
  24. kbd_init();
  25.  
  26. while(1){
  27.      
  28.         tecla=kbd_getc();    
  29.              
  30.         if (tecla!= 0)
  31.         {
  32.                if (tecla=="A")
  33.                {
  34.                    lcd_putc("VALOR INGRESADO");
  35.                }
  36.                else  // Cualquier cosa que no sea una A
  37.                {
  38.                    printf(lcd_putc,"%c", tecla);
  39.                }
  40.         }
  41.    }
  42. }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Teclado y LCD con pic15F4550 (solo ejecuta un if)
« Respuesta #3 en: 13 de Mayo de 2015, 09:00:29 »
Citar
También, por un funcionamiento correcto te recomiendo que una vez que has leído la tecla y has utilizado la opción, borres la variable. De no ser así, esta condición if (tecla!= 0) siempre se cumpliría.
No ya que:

tecla=kbd_getc();

esta antes, y si no hay nada presionado devuelve un '\0'

Lo unico malo que tiene el codigo es que se va a repetir constantemente, o puede jugar con un delay, o puede utilizar una variable en la que guarde el ultimo boton presionado y este limite la entrada mas de una ves
« Última modificación: 13 de Mayo de 2015, 09:07:27 por KILLERJC »

Desconectado hortoedro

  • PIC10
  • *
  • Mensajes: 19
Re: Teclado y LCD con pic15F4550 (solo ejecuta un if)
« Respuesta #4 en: 15 de Mayo de 2015, 05:06:18 »
Hola, soy nueva en el foro y he tenido un problema que se me ha hecho complicado resolver.
Resulta que tengo un programa para leer una tecla desde el keypad y mostrarlo en la lcd, con dos condiciones para cuando es A y para cuando no es A, pero solo ejecuta una de las dos y a la segunda nunca entra, aún cuando presiono la tecla A en el keypad la muestra normalmente en la LCD y no realiza la sentencia, agradecería su ayuda.
18F4550
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Código: [Seleccionar]
#fuses HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN,XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=20000000)
#include   <LCD_FLEX.c>
#define use_porta_lcd_flex TRUE
#define use_portb_kbd TRUE
#include <kbd.c>
#include <stdlib.h>
#include <stdio.h>


char tecla;
int i=0;
int j=0; //Inicializamos y declaramos la variable j como entero y de valor 0;

void inicio(){
lcd_init();
port_b_pullups(TRUE);
lcd_gotoxy(1,1);
lcd_putc(" INICIO");
delay_ms(1000);                                              
lcd_putc("\f");      
lcd_putc("NUMERO:");
lcd_gotoxy(1,2);
lcd_putc("(A) --> GUARDAR");
lcd_gotoxy(7,1);

kbd_init();

while(i<1){
    
        tecla=kbd_getc();    
            
         if (tecla!= 0){
        
        
        
       if(tecla!="A"){
          printf(lcd_putc,"%c", tecla);
        
         }
         if (tecla=="A"){
         lcd_putc("VALOR INGRESADO");
         j=1; //Le  fijamos el valor j=1;
         //si lo que quieres es crear un contador para ver las veces que has pintado la A.
         //j=j+1;
        }
        
    }    
    
  }
  
}


void main(){
inicio();
}

No entiendo muy bien, para que le das el valor de i=1 cuando has mostrado el valor por pantalla. Imagino que será una bandera que utilizas para decir que has pintado la A en el LCD. Para ello puedes declarar otra variable "j" y darle el valor de 1 cuando la hayas pintado. De esta manera la i siempre será 0 tal y como declaraste, así nunca dejará de entrarte al while para pintar todas las veces que quieras en el LCD.

Saludos

« Última modificación: 15 de Mayo de 2015, 05:09:16 por hortoedro »

Desconectado ginnie

  • PIC10
  • *
  • Mensajes: 4
Re: Teclado y LCD con pic15F4550 (solo ejecuta un if)
« Respuesta #5 en: 23 de Mayo de 2015, 14:13:49 »
Hola, les agradezco a todos por sus respuestas, justo despues de publicar la pregunta me di cuenta del error y es que donde tenia los if los ponia de esta manera "" cuando en realidad solo era asi '' despues funciono perfectamente, lo que me comentaba de que no tenia caso que lo llamara desde el main es por que el programa sigue y lo uso en otra parte, y sobre la variable la almaceno par un futuro uso :) muchas gracias a todos les mando munchos saludos.


 

anything