Autor Tema: Ayuda ingreso de palabras teclado matricial  (Leído 1902 veces)

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

Desconectado Lagser

  • PIC10
  • *
  • Mensajes: 9
Ayuda ingreso de palabras teclado matricial
« en: 13 de Marzo de 2016, 20:11:31 »
Buenas tardes, es mi primer tema en este foro, estoy implementando en un código una manera de escribir nombres usando el estilo de escribir de los celulares de segunda generación 2(a,b,c),3(d,e,f),etc. Ya he logrado vincular cada numero a sus letras correspondientes, y estoy intentando que para validar la letra sea necesario pulsar * en el teclado, pero solo consigo que el programa se detenga al pulsarlo en vez de pedirme la siguiente letra.

El código lo llevo hasta acá:

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 4MHz)
#include <lcd.c>
#include <kbd.c>

char Teclado(){
char k,l=0;
int x=0,a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,v=10;
do{
     k=kbd_getc();
     x=k-48;
     if(x==2){
        b=0;c=0;d=0;e=0;f=0;g=0;h=0;
        l=97+a;
        lcd_gotoxy(v,1);
        lcd_putc(l);
        a=a+1;
        if(a==3)a=0;
     }   
     if(x==3){
        a=0;c=0;d=0;e=0;f=0;g=0;h=0;
        l=100+b;
        lcd_gotoxy(v,1);
        lcd_putc(l);
        b=b+1;
        if(b==3)b=0;
     }
     if(x==4){
        a=0;b=0;d=0;e=0;f=0;g=0;h=0;
        l=103+c;
        lcd_gotoxy(v,1);
        lcd_putc(l);
        c=c+1;
        if(c==3)c=0;
     }
     if(x==5){
        a=0;b=0;c=0;e=0;f=0;g=0;h=0;
        l=106+d;
        lcd_gotoxy(v,1);
        lcd_putc(l);
        d=d+1;
        if(d==3)d=0;
     }   
     if(x==6){
        a=0;b=0;c=0;d=0;f=0;g=0;h=0;
        l=109+e;
        lcd_gotoxy(v,1);
        lcd_putc(l);
        e=e+1;
        if(e==3)e=0;
     }
     if(x==7){
        a=0;b=0;c=0;d=0;e=0;g=0;h=0;
        l=112+f;
        lcd_gotoxy(v,1);
        lcd_putc(l);
        f=f+1;
        if(f==4)f=0;
     }
     if(x==8){
        a=0;b=0;c=0;d=0;e=0;f=0;h=0;
        l=116+g;
        lcd_gotoxy(v,1);
        lcd_putc(l);
        g=g+1;
        if(g==3)g=0;
     }
     if(x==9){
        a=0;b=0;c=0;d=0;e=0;f=0;g=0;
        l=119+h;
        lcd_gotoxy(v,1);
        lcd_putc(l);
        h=h+1;
        if(h==4)h=0;
     }
  }while(k!='*');
  return l;
}

void main(){
   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);
   Teclado();
   
}

De esa manera el programa solo me visualiza los números y se detiene luego de pulsar el *.
¿'Que me recomiendan para poder digitar palabra por palabra?
Gracias de antemano.
Adjunto el archivo de Proteus.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda ingreso de palabras teclado matricial
« Respuesta #1 en: 13 de Marzo de 2016, 23:16:24 »
Algo asi?, ojo lo hice en 30/45min, asi que debe tener errores a lo loco, pero creo que verias la logica.

Un problema de tu codigo es que no existe un loop infinito ( un while(1) )

Yo opte por escribir todo el texto de nuevo en el LCD, pero podes modificarlo para que escriba letra por letra.

La explicacion la podes encontrar en los comentarios, esta explicado para que sirve cada cosa. Y solo puse ejemplos de las teclas:

'2' que deberia ser 'A','B','C'
'#' que lo use para borrar
'0' es el espacio.
'*' que es el caso de aceptar la letra cuando se presiona desde '1' a '9'.

Código: C
  1. char Mensaje[17];                       //Aqui se guarda el mensaje, tiene 16 lugares + 1 caracter nulo necesario para la string, 16 lugares para el LCD 2x16
  2. char BotonActual;                       // Mantiene el valor del boton que se esta procesando
  3. char BotonAnterior;                     // Mantiene el valor del boton que se leyo antes, evita que entre cuando se mantiene presionado
  4. unsigned char IndiceMensaje=0;          // Es el indice para saber que posicion de letra estoy modificando
  5.  
  6.  
  7. void Teclado(void)
  8. {
  9.  
  10.         while(1)                //Loop infinito, siempre debe existir un solo loop infinito
  11.         {
  12.                 BotonActual=kbd_getc();                                         //Tomo valor de boton
  13.                 if((BotonActual != 0) && (BotonAnterior != BotonActual))        //Si hay algo presionado y ademas no se mantuvo presionado el boton. Es decir se debe presionar otra cosa o soltar
  14.                 {
  15.                         switch(BotonActual)                                             // Actuo segun el boton presionado
  16.                         {
  17.                         case '2':
  18.                                 if(Mensaje[IndiceMensaje] >= 'A' && Mensaje[IndiceMensaje] < 'C')                               // Caso que sea 'A' o 'B', asi pasa a 'B' o 'C'
  19.                                 {
  20.                                         Mensaje[IndiceMensaje]++;
  21.                                 }
  22.                                 else if(Mensaje[IndiceMensaje] == 'C')
  23.                                 {
  24.                                         Mensaje[indiceMensaje] = '2';                   // Si era una C, entonces pasa al 1
  25.                                 }
  26.                                 else
  27.                                 {
  28.                                         Mensaje[IndiceMensaje] = 'A';                   // Caso que sea cualquier otro valor, ejemplo que se presiono antes un 4 y luego el 1, o en caso que este vacio el array, pone la primer letra del boton que es 'A'
  29.                                 }
  30.                                 break;
  31.  
  32.                         case '#':
  33.                                 // Tecla de Borrar, Podria haber puesto un ' ' o un '\0', esto depende de luego que necesitas hacer, recorda que para C una string termina con un '\0'
  34.                                 if(IndiceMensaje!=0)                                                    // Me aseguro que no este en el comienzo, no puedo ir para atras
  35.                                 {
  36.                                         Mensaje[IndiceMensaje] = '\0';                          // Caracter nulo
  37.                                         --IndiceMensaje;                                                // Voy al valor anterior
  38.                                 }
  39.                                 break;
  40.  
  41.                         case '0':
  42.                                 // Espacio, escribe el espacio y avanza un lugar, como si hubieras presionado el * tambien, si no queres esto, agrega un break luego de poner el espacio
  43.                                 Mensaje[IndiceMensaje] = ' ';
  44.                         case '*':
  45.                                 //Insertar letra, es decir avanza el puntero, y unicamente lo hace para cuando es menor de 16, 16 seria lo maximo que deberia llegar, para volver usar el borrar
  46.                                 if(IndiceMensaje<16) { IndiceMensaje++; }
  47.                                 break;
  48.                         }
  49.  
  50.                         lcd_gotoxy(0,0);                                // Finalmente escribo en el LCD todo el mensaje, no se si es correcto, no uso CCS
  51.                         printf(lcd_putc,"%s",Mensaje);
  52.                 }
  53.                 BotonAnterior = BotonActual;                    // Actualizo BotonAnterior, con el ultimo boton leido, asi de esa forma no acepta mientras se mantiene presionado.
  54.         }
  55. }

Observa que comparo con letras,, es decir

         case '1':

y no un numero:

         case 1:

que es lo que estas haciendo vos al restarle 48, como ves no hace falta, ademas me aseguro de no restarle a un '#' un 48 por ejemplo.
Se podria haber mejorado o buscado una mejor alternativa para tener los valores de las letras y no ir preguntando uno por 1 con tantos ifs, pero es lo que salio mas rapido.
« Última modificación: 13 de Marzo de 2016, 23:23:53 por KILLERJC »

Desconectado Lagser

  • PIC10
  • *
  • Mensajes: 9
Re:Ayuda ingreso de palabras teclado matricial
« Respuesta #2 en: 14 de Marzo de 2016, 20:03:58 »
Wow muchas gracias  :) , si tienes razón en lo de que hago uso de muchos Ifs pudiendo realizar todo de esa manera, me pondré a trabajar en eso, le agradezco mucho.


 

anything