Autor Tema: menú lcd y keypad(teclado 4x4) ccs c  (Leído 9244 veces)

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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
menú lcd y keypad(teclado 4x4) ccs c
« en: 04 de Septiembre de 2009, 17:57:38 »
hola de nuevo, bueno ahora estoy realisando un menú para mi keypad, LCD y pic16F877a en ccs c, pero tengo una duda, y espero que me la puedan resolver.
como puedo hacer un código que me diga:
se a pulsado key?¿?¿ si, entonces i++ (i incrementa 1), no, i sigue igual. bueno esto da mención a que necesito detectar si cualquier tecla del keypad (teclado 4x4) se a pulsado.

mmm necesito esto para que el menú entre a una parte y poder desarrollar un par de líneas de código, y el cual no e podido, por que todo lo que ago me incrementa el i muy rápido o simplemente no lo incrementa, les explico. por ejemplo
if(key=='A'){
   string=key;
   i++;
   b=i-1;
   numero=atof(string);
}
key: es el valor del keypad pulsado.
pero en esto tengo problema por que quiero que se quede adentro del if asta que aprete la D del keypad, y que el i valla incrementado a medida que presiono una tecla (números) después de la A, esto es para que la tecla presionada se valla guardando en un lugar adentro del string, por ejemplo si presionamos la A del keypad accedo a mi string, y a medida que voy presionando un numero el i va incrementando en 1 y el numero pulsado se guarda en la posición del i adentro de mi string, bueno el la variable numero es para ver que numero se esta formando dentro de mi string.
uff espero averme explicado bien, bueno saludos.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: menú lcd y keypad(teclado 4x4) ccs c
« Respuesta #1 en: 05 de Septiembre de 2009, 12:02:02 »
pon el esquema  si no no sabremos ni como lo tienes conectado el keypad...
tambien pon el codigo que asta ahora tengas echo...
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: menú lcd y keypad(teclado 4x4) ccs c
« Respuesta #2 en: 05 de Septiembre de 2009, 16:14:33 »
Cierto primero pon el esquema para depronto entender mejor lo que quieres decir.

Mira lo que puedes hacer es ir guardando lo que preciona el teclado en un bufer, y ademas hacer un antirebote para que no se guarde muchas veces la misma tecla.

algo asi como esto:

for(i=0;i<10;i++){
bufer=leerTeclado();
}

algo asi!!


Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: menú lcd y keypad(teclado 4x4) ccs c
« Respuesta #3 en: 05 de Septiembre de 2009, 16:14:52 »
hola bueno a qui esta el codigo

Código: [Seleccionar]
unsigned char key;   //Variable global tecla
char string[6];
float numero=0;
int i,b;
// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////
#INT_RB
void interrupt_keypad()              
{
   delay_ms(30);              //Antirrebote....
   key=read_keypad();         //Asigna la tecla pulsada
   clear_interrupt(INT_RB);   //Limpia bandera RBIF
}
// Programa Principal /////////////////////////////////////////////////////////
void main()
{    
   lcd_init();
   enable_interrupts(INT_RB);      //interrupcion INT_RB activada
   enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
   init_keypad();
  
   string[b]=key;
   i++;
   b=i-1;
   numero=atof(string);

   printf(lcd_putc,"tecla:%i num:%f",b,numero); // Imprimimos la Tecla pulsada
   lcd_gotoxy(1,1);      
 }
      

saludos

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: menú lcd y keypad(teclado 4x4) ccs c
« Respuesta #4 en: 06 de Septiembre de 2009, 10:09:52 »
Le agregue algunas cosas a tu codigo:
    nuevo_key es una bandera que sube cuando hay una nueva tecla.
El funcionamiento seria esa: ingresas la 'A', despues 4 teclas mas. Inmediatamete ves el resultado del printf y entras denuevo al bucle.

Código: C
  1. unsigned char key;   //Variable global tecla
  2. char string[6];
  3. float numero=0;
  4. int i,b;
  5. int nuevo_key; /* indica que tenemos una nueva tecla */
  6.  
  7. // Interrupcion RB4 - RB7
  8. #INT_RB
  9. void interrupt_keypad()              
  10. {
  11.    delay_ms(30);              //Antirrebote....
  12.    key=read_keypad();         //Asigna la tecla pulsada
  13.    clear_interrupt(INT_RB);   //Limpia bandera RBIF
  14.    nuevo_key = 1;
  15. }
  16. // Programa Principal
  17. void main()
  18. {
  19.    int num_tecla;
  20.    lcd_init();
  21.    enable_interrupts(INT_RB);      //interrupcion INT_RB activada
  22.    enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
  23.    init_keypad();
  24.    
  25.    // el programa se queda en este bucle
  26.    num_tecla = 0;
  27.    while(1) {
  28.       nuevo_key=0;
  29.       while(nuevo_key == 0)
  30.          /* esperamos una tecla */;
  31.       if(key != 'A')
  32.          continue; /* si no es una 'A' volvemos al inicio del while */
  33.       /* esperamos 4 teclas... */
  34.       for(i=0; i<4; i++) {
  35.          nuevo_key = 0;
  36.          while(nuevo_key == 0)
  37.              /* esperamos una tecla */;
  38.          string[i] = key;
  39.       }
  40.       string[i] = 0;
  41.       lcd_gotoxy(1, 1);
  42.       // Imprimimos la Tecla pulsada
  43.       printf(lcd_putc,"tecla:%i num:%f\n",num_tecla++,atof(string));
  44.    }
  45.  }
@fabianjsm is on twitter

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: menú lcd y keypad(teclado 4x4) ccs c
« Respuesta #5 en: 06 de Septiembre de 2009, 16:55:13 »
hola fabianjm gracias por el codigo lo estoy revisando y me a surguido varias ideas, te comentoque lo que quiero hacer es no limitar la cantidad de digitos de ingreso, y presionar A para acceder a este menú y D para salir de este menu.
saludos y gracis de nuevo

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: menú lcd y keypad(teclado 4x4) ccs c
« Respuesta #6 en: 06 de Septiembre de 2009, 17:27:49 »
hola otra ves bueno ya encontre la solucion a mi problema aqui se las dejo:

Código: [Seleccionar]
unsigned char key;   //Variable global tecla
char string[6];
float numero=0;
int i,b,m;

// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////
#INT_RB
void interrupt_keypad()               
{

   key=read_keypad();         //Asigna la tecla pulsada   
   clear_interrupt(INT_RB);   //Limpia bandera RBIF
   if(key=='A'){m=60;}
   m++;
}
// Programa Principal /////////////////////////////////////////////////////////
void main()
{     
   lcd_init();
   enable_interrupts(GLOBAL);      //todas las interrupciones activadas
   enable_interrupts(INT_RB);      //interrupcion INT_RB activada
   init_keypad();

if(m>=60){
   string[b]=key;
   i++;
   b=i-1;
if(key=='D'){m=0;}
}
numero=atof(string);
   
   lcd_gotoxy(1,1);
   printf(lcd_putc,"tecla:%c num:%f",key,numero); // Imprimimos la Tecla pulsada
     
 }

bueno lo que hace esto es:
mediante un teclado 4x4 y una LCD, captura los digitos pulsado por el keypad y forma un numero con dos decimales, para ingresar este numero se tiene que presionar la 'A' y para salir del ingreso del numero se presiona la 'D'. el numero se va formando mediante los digitos pulsados por ejemplo pulsamos el 1, luego el 2 luego 3 ...4 ..4...5,5..5 esto se veria visualisado en la LCD 123445,55