Autor Tema: almacesar string y este imprimirlo en una variable  (Leído 2269 veces)

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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
almacesar string y este imprimirlo en una variable
« en: 31 de Agosto de 2009, 18:19:24 »
hola gente otra vez, ahora estoy trabajando con un keypad 4x4, pero el punto esque no puedo hacer que este almasene un sierto numero de varios digitos en una variable, e intentado con este codigo pero no logro imprimir todo los digitos pulsados.
espero que me puedan echar una manito gracias.

unsigned char key;   //Variable global tecla
int1 kbhit_tecla=0;  // Para saber si se ha pulsado alguna tecla.
char string[6];
char valor;
int i,b;
// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////

#INT_RB
void interrupt_keypad()               
{   
   key=read_keypad();         //Asigna la tecla pulsada
   clear_interrupt(INT_RB);   //Limpia bandera RBIF
   string=key;
/* Ahora tenemos que dar el valor de cada una */
}
// Programa Principal /////////////////////////////////////////////////////////
void main()
{     
   lcd_init();
   enable_interrupts(INT_RB);            //interrupcion INT_RB activada
   disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
   init_keypad();
   i++;
   printf(lcd_putc,"%c  %i  %c",key,b); // Imprimimos la Tecla pulsada
   lcd_gotoxy(1,1);
}

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: almacesar string y este imprimirlo en una variable
« Respuesta #1 en: 31 de Agosto de 2009, 19:43:53 »
Debes asignar de este modo

Código: C
  1. string[i] = read_keypad();         //Asigna la tecla pulsada
  2.    clear_interrupt(INT_RB);   //Limpia bandera RBIF
@fabianjsm is on twitter

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: almacesar string y este imprimirlo en una variable
« Respuesta #2 en: 31 de Agosto de 2009, 22:13:44 »
hla cambien lo que me dijiste y aun no logro hacer que una variable "valor" tome los números que se le asigno ala keypad ósea por ejemplo 1-2-3-4, y que valor sea 1234 (mil doscientos treinta cuatro)(valor=1234;).

Desconectado yopepe

  • PIC10
  • *
  • Mensajes: 19
Re: almacesar string y este imprimirlo en una variable
« Respuesta #3 en: 02 de Septiembre de 2009, 01:03:33 »
Citar
hla cambien lo que me dijiste y aun no logro hacer que una variable "valor" tome los números que se le asigno ala keypad ósea por ejemplo 1-2-3-4, y que valor sea 1234 (mil doscientos treinta cuatro)(valor=1234;).

La verdad no se si soy yo, pero no entiendo muy bien en que cosa tenés el problema. Para almacenar las teclas pulsadas, haciendo como te indicó fabianjm no deberías tener problemas. Ahora, suponiendo que con variable "keypad" te estás refiriendo a la variable "string", que es la que va almacenando los valores pulsados, no vas a poder almacenarla en la variable "valor" porque no tienen los mismos tamaños, y si con variable "keypad" te estás refiriendo a la variable "key", sí la vas a poder asignar, pero solo va a contener el último valor que lees del teclado (hago estas suposiciones porque no veo la asignación de "valor" en el código que pusiste).

Tema aparte, lo que podes hacer para guardar las teclas pulsadas en formato numérico es usar la funcion atol, que está en la stdlib.h (esto siempre y cuando uses el compilador CCS, para otros no sabría decirte). Dale una mirada a la ayuda del compilador acerca de esta función y de última nos preguntás. Corregíme si algo de todo lo entendí mal, y en tal caso explayate un poquito más de como es la operación que queres realizar.

Un saludo.

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: almacesar string y este imprimirlo en una variable
« Respuesta #4 en: 02 de Septiembre de 2009, 03:43:51 »
Ademas de lo citado por yopepe, parece que la variable 'i' que utilizas como indice para string no esta inicializada, la interrupcion INTR_RB nunca ocurrira porque desabilitaste todas las interrupciones, la llamada a init_keypad (si es lo que el nombre sugiere) deberia ir antes de enable_interrupts, te posicionas con gotoxy despues del printf, y despues del gotoxy el main termina abruptamente. Ademas parece que en la asignacion deberias incrementar 'i' de este modo: string[i++] =...
Si quisieras mostrar todo despues de la cuarta tecla por ejemplo, podrias hacer algo asi:

Código: C
  1. void main()
  2. {  
  3.     i=0;  
  4.     lcd_init();
  5.     init_keypad();
  6.     enable_interrupts(INT_RB);
  7.     enable_interrupts(GLOBAL);
  8.     while(1) {
  9.         if(i==4) {
  10.             disable_interrupts(GLOBAL);
  11.             // aca tu codigo...
  12.             i=0;
  13.             enable_interrupts(GLOBAL);
  14.         }
  15.     }
  16. }
@fabianjsm is on twitter

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: almacesar string y este imprimirlo en una variable
« Respuesta #5 en: 02 de Septiembre de 2009, 03:58:25 »
Hola japifer_22, lo que yo hago para recibir por rs232 es usar unas cuantas variables e ir desplazandolas conforme van entrando carcateres hasta que llegue un caracter de inicio de calculo y creo lo puedes usar:

Código: C
  1. int8 byte_1;                                       ///BUFFER DE RECEPCION RS232
  2. int8 byte_2;                                       ///BUFFER DE RECEPCION RS232
  3. int8 byte_3;                                       ///BUFFER DE RECEPCION RS232
  4. int8 byte_4;                                       ///BUFFER DE RECEPCION RS232
  5. int8 byte_5;                                       ///BUFFER DE RECEPCION RS232
  6. int8 byte_6;                                       ///BUFFER DE RECEPCION RS232
  7. int8 byte_7;                                       ///BUFFER DE RECEPCION RS232
  8. int8 byte_8;                                       ///BUFFER DE RECEPCION RS232
  9. int8 byte_9;                                       ///BUFFER DE RECEPCION RS232
  10. int16 valor;                                       ///PARA CALCULAR VALOR DE ENTRADA RS232
  11. int16 frec;
  12. int16 pulso;
  13.  
  14.       byte_9 = byte_8;                             ///RUTINA DE RECEPCION RS232
  15.       byte_8 = byte_7;
  16.       byte_7 = byte_6;
  17.       byte_6 = byte_5;
  18.       byte_5 = byte_4;    
  19.       byte_4 = byte_3;
  20.       byte_3 = byte_2;
  21.       byte_2 = byte_1;
  22.       byte_1 = getc();      
  23.  
  24.  
  25.     if (byte_1 == 13)                               ///SE RECIBIO ENTER???
  26.        {
  27.        valor  = (byte_2 - 48);
  28.        valor += ((byte_3 - 48)*10);
  29.        valor  += (int16)(byte_4 - 48)*100;
  30.        valor += ((byte_5 - 48)*1000);
  31.        valor += ((byte_6 - 48)*10000);
  32.        if (byte_7 == 'T')frec = valor;
  33.        if (byte_7 == 'P')pulso = valor;
  34.        }
  35. }

Como resultado tengo un paso de ASCII a ENTERO, que es lo que quieres hacer

Ojala te sirva de algo.

Saludos.

A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado yopepe

  • PIC10
  • *
  • Mensajes: 19
Re: almacesar string y este imprimirlo en una variable
« Respuesta #6 en: 02 de Septiembre de 2009, 11:52:19 »
La verdad, simple y efectiva esa forma de hacerlo KALLITOS, ya la adjunto a mi librería para futuros usos :mrgreen: :mrgreen: Se agradece. Saludos.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: almacesar string y este imprimirlo en una variable
« Respuesta #7 en: 02 de Septiembre de 2009, 14:25:03 »
Que bueno que sea util  ;-)
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: almacesar string y este imprimirlo en una variable
« Respuesta #8 en: 02 de Septiembre de 2009, 16:41:40 »
hola gracias por las respuestas aver ahora con lo que me an dicho pondre mano a la obra y aver que sale gracias a todos

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: almacesar string y este imprimirlo en una variable
« Respuesta #9 en: 02 de Septiembre de 2009, 18:50:42 »
hola bueno les comento que lo que andava buscando era mas fasil de lo que pense, aqui les dejo 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()               
{
   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);
     
}
       

la linea numero=atof(string); lo hace todo, pero el punto ahora esque nesecito hacer un menu, me explico al presionar la A del keypad este tiene que entrar:

   string=key;
   i++;
   b=i-1;
   numero=atof(string);
asta que precione la D del keypad, que vendria siendo como un enter, y al precionar la B este tiene que entrar a otro menu:

   string1[c]=key;
   d++;
   c=d-1;
   num=atof(string1);
y al precionar la D sale del menu.


 

anything