TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: SnowMan en 26 de Julio de 2019, 01:20:11

Título: AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: SnowMan en 26 de Julio de 2019, 01:20:11
Hola a todos, Gracias por su atencion.
Tengo un problema, es que no se como unir digitos de un vector, por ejemplo yo introduzco con el teclado matricial con la libreria kbd, que son caracteres y llenos el vector por cada caracter convirtiendolos en int, y quiero hacer una cifra como 125,350,1250, etc... mi vector lo lleno mediante un switch, y confirmo que cada espacio del vector se lleno, pero ahora no se como realizar esa cifras que quiero y cargarla a otra variable. alguien me podria ayudar a resolver este problema.
/////////////////////////////
Código: CSS
  1. static char cadena1[4];/// aqui lleno el vector en caracter
  2.     int cadena2[4];  // con este lo convierto a numero
  3.       int16 numerocadena; //////////// aqui quiero guardar la cifra como 125,350,1250,etc....
  4.  CHAR *k,c;
  5.  int16 D= atoi(k);  // esto convierte tambien de ascii a int
  6. int16 digito=0, digito0=0,digito1=0,digito2=0; // hago lo mismo que con int cadena2 por si las dudas xD

//////////////////////////
Esta funcion es para controlar el kbd_getc, ya que si lo uso normal no puedo imprimir nada.
Código: CSS
  1. char tecla_time(void) {
  2.    char c='\0';
  3.    unsigned int16 timeout;
  4.    timeout=0;
  5.    c=kbd_getc(); //Captura valor del teclado
  6.    while(c=='\0' && (++timeout< (KEYHIT_DELAY*100)))
  7.    {
  8.       delay_us(10);
  9.       c=kbd_getc(); //Captura valor del teclado
  10.    }
  11.    return(c);
  12. }
//////////////////////////
esta parte es del teclado.
Código: CSS
  1. void teclado (){
  2.  
  3.  
  4.    unsigned int16 i = 0;
  5.    static int8 a=1;
  6.    
  7.    
  8.    
  9.    
  10.    if (a==6){
  11.       for (i=0;i<4;i++) Cadena1[i] = ' ';          // LIMPIA la Cadena1
  12.       lcd_gotoxy(15,1);
  13.       printf(lcd_putc,"0");
  14.       delay_ms(500);
  15.       a=0;
  16.       delay_ms(500);
  17.       a=1;
  18.    }
  19.    
  20.    
  21.          
  22.            
  23.        if( k =='\0' ){
  24.        
  25.       switch (a){
  26.          case 1:
  27.          
  28.             lcd_gotoxy(15,1);
  29.             printf(lcd_putc,"1");
  30.             k=tecla_time();
  31.             D=(k - '0');
  32.             if ( k >= '0' && k<='9'){ cadena1[0]=D;  }
  33.             if ( k == 'A'){     a=2;  }
  34.             if (k == '#'){     digito=cadena1[0]; a=1;    break;    }
  35.              
  36.                
  37.             break;
  38.          case 2:
  39.             lcd_gotoxy(15,1);
  40.             printf(lcd_putc,"2");
  41.             k=tecla_time();  
  42.             D=(k - '0');
  43.             if ( k >='0' && D<='9'){ cadena1[1]=D;    }
  44.             if ( k == 'A'){  a=3;  }
  45.             if ( k == '#'){ digito0=cadena1[1];  a=2; break;   }
  46.             break;
  47.          case 3:
  48.             lcd_gotoxy(15,1);
  49.             printf(lcd_putc,"3");
  50.             k=tecla_time();
  51.             D=(k - '0');
  52.             if ( k >= '0' && k<='9'){ cadena1[2]=D; }
  53.             if ( k == 'A'){    a=4;  }
  54.             if ( k == '#'){   digito1=cadena1[2];a=3; break; }
  55.          
  56.             break;
  57.          case 4:
  58.             lcd_gotoxy(15,1);
  59.             printf(lcd_putc,"4");
  60.             k=tecla_time();
  61.             D=(k - '0');
  62.             if ( k >= '0' && k<='9'){ cadena1[3]=D;   }
  63.             if ( k == 'A'){     a=5;  }
  64.             if ( k == '#'){ digito2=cadena1[3]; a=4; break;}
  65.                
  66.             break;
  67.             case 5:
  68.            
  69.              aqui quiero imprimir el numero de cadena para confirmar que se hizo la cifra
  70.            
  71.            
  72.               for(int x=0;x<4;x++){cadena2[x]=cadena1[x];}
  73.  
  74.                for(int x=0;x<4;x++){
  75.                   printf(lcd_putc,"\fDigito: %u",cadena2[x]);
  76.                   //recargaTimer=(cadena2[0],cadena2[1],cadena2[2]);
  77.                  // recargaTimer=(cadena2);
  78.                   delay_ms(1000);
  79.                  
  80.                   }
  81.                
  82.              a=6;
  83.            default:
  84.              
  85.        break;
  86.    }
  87.        
  88.        
  89.        }
  90.    
  91.          
  92.          
  93. }
//////////////////////////////
y aqui el main
Código: CSS
  1. #include <16f877.h>
  2. #device adc=10
  3. #fuses XT,NOWDT,NOPROTECT,NOWRT,PUT
  4. #use delay(clock=4MHz)
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <lcd_c.c>
  9. #include "kbd_d 4x4.c"
  10.  
  11.  
  12. #define  KEYHIT_DELAY   200    //Tiempo de espera del teclado en milisegundos
  13.  
  14. void main(){
  15.  
  16.    set_tris_C(0b00001000);//0como salidas
  17.    set_tris_D(0b00000000);//0como salidas
  18.    
  19.    lcd_init();
  20.    kbd_init();
  21.    
  22.    
  23.    setup_adc(ADC_CLOCK_INTERNAL);
  24.    setup_adc_ports(AN0);
  25.    
  26.  
  27.  
  28.    
  29.    enable_interrupts(GLOBAL);
  30.    printf(lcd_putc,"\fPress A next \n Save #",);
  31.    DELAY_MS(1000);
  32.    printf(lcd_putc,"\f ",);
  33.    while(True){
  34.        
  35.       //int16 lectura;
  36.    
  37.      
  38.        DIR=13;
  39.        //Ubica el cursor del LCD
  40.  
  41.       lcd_gotoxy(1,2);
  42.      
  43.       printf(lcd_putc,"Tecla: %Lu %Lu %Lu %Lu",digito, digito0, digito1, digito2);
  44.      
  45.       lcd_gotoxy(1,2);
  46.      
  47.       while (DIR<14)
  48.       {
  49.                      
  50.          if(k!='\0'){
  51.             LCD_GOTOXY(DIR,1);
  52.             lcd_putc(k);
  53.             k='\0';
  54.             DIR++;
  55.          }
  56.  
  57.      
  58.        
  59.          
  60.           teclado();
  61.  
  62.       if(DIR>13)
  63.             LCD_PUTC("\f");
  64.          
  65.         //Lectura ADC
  66.         set_adc_channel(0);          //Selecciono el canal 0 (RA0)
  67.         delay_ms(1);                 //llamo retardo de 1 ms
  68.         bits=read_adc();            
  69.         ADC= ((70/(10*bits))-15); //Conversion de bits a
  70.         lcd_gotoxy(1,1);            
  71.         printf(lcd_putc,"Lux: %3.2g",ADC);//Muestra el valor numerico de la conversionconversion
  72.                    //
  73.     }// DIR*
  74.    
  75.      }// while
  76. }// main


Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: KILLERJC en 26 de Julio de 2019, 08:18:37
Uff que manera de complicarte la vida para tomar datos del teclado..... Esta bien lo que hiciste pero pienso que podria haber sido mas sencillo.

En ves de realizar todos los casos del switch por ejemplo... podrias haber usado una variable que incremente cuando sea necesario y punteros para manejarte con el array.

Supongamos que le llamo j a mi "indice", con esto bastaria:

Código: C
  1. lcd_gotoxy(15,1);
  2.             printf(lcd_putc,"%u",j);
  3.             k=tecla_time();
  4.             if ( k >= '0' && k<='9'){ cadena1[j]=k-'0';  }
  5.             if ( k == 'A'){     j++;  }
  6.             if (k == '#'){     digito=cadena1[j]; }
  7.             if(j<5){
  8.                  //Aca calculo
  9.                  j++; // O mejor j=0 para que comienze de neuvo
  10.             }

De todas formas es un ejemplo, ya que trataria de separar bien la funcion de tomar datos, y la calcular, asi si hay algun problema se donde ir.
Otra cosa que no entiendo es que decis que cadena1 es en caracteres, pero al cargarlos en el codigo anterior se hace con k-'0' que lo pasa a numeros

En fin hagamos un calculo sencillo de multiplicacion:

Código: C
  1. numerocadena=0;
  2. for(i=0;i<sizeof cadena1;i++) {
  3.   numerocadena *= 10;
  4.   numerocadena += cadena1[i] - '0';
  5. }

Realizando esto si tenes:

Código: C
  1. char cadena1[4]={'1','2','3','4'};
obtenes:

Código: C
  1. numerocadena = 1234;
Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: SnowMan en 26 de Julio de 2019, 11:42:07
Cuando ingreso valores para llenar el vector no me aumenta la j, y cuando imprimo el numerocadena me sale un numero 9648 al presionar una sola tecla por ejemplo el 2 y me sale 9668 no se porque, con punteros no sabre como hacerlo. casi no los e usado jejeje, aunque solo quiero es poder hacer un dígito grande ya que la librería del teclado solo permite ir ingresando un solo carácter, y si quiero formar 15 ,20,125, pero es lo unico que no se como formar el dígito. en mi anterior código si lo aguarda cada dígito, los guardo en diferentes variables pero no se como guardar digamos digito1 y digito2 para formar 20. y asi sucesivamente dependiendo la cantidad que quiero ingresar.
Código: CSS
  1. lcd_gotoxy(15,1);
  2.             printf(lcd_putc,"%Lu",j);
  3.             k=tecla_time();
  4.             if ( k >= '0' && k<='9'){ cadena1[j]=k-'0';  }
  5.             if ( k == 'A'){     j++;  }
  6.             if (k == '#'){     digito=cadena1[j]; }
  7.             if(j<5){
  8.                  //Aca calculo
  9.                  j=0; // O mejor j=0 para que comienze de neuvo
  10.             }
  11.             numerocadena=0;
  12.             for(i=0;i<sizeof cadena1;i++) {
  13.             numerocadena *= 10;
  14.             numerocadena += cadena1[i] - '0';
  15.             }
Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: KILLERJC en 26 de Julio de 2019, 13:55:01
Antes de escribir el codigo, ¿me podes decir para que usas la 'A' y para que el '#' ?

Dependiendo de eso modifico el codigo...
Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: SnowMan en 26 de Julio de 2019, 14:04:37
'#' la uso para verificar si el vector guardo el valor y lo imprime en digito, y también quería hacer que saliera y pidiera de nuevo un numero, y  'A' la uso para cambiar de switch case, ya que asi lo controlo, antes usaba a++; pero cambia muy rapido que no puedo ingresar valor en todo los espacios del vector. por eso la controlo con 'A'

para eso puse las variables ditio,digito0,digito1,digito2, que son donde compruebo que se guardo el numero en cada espacio del vector.
Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: KILLERJC en 26 de Julio de 2019, 17:04:16
Hagamoslo mas simple..... solo mostrar los 4 digitos luego de escritos en el LCD

Ojo, solo lo muestra cuando presiones los 4 botones... Asi cada ves:

Código: C
  1. #include <16f877.h>
  2. #device adc=10
  3. #fuses XT,NOWDT,NOPROTECT,NOWRT,PUT
  4. #use delay(clock=4MHz)
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <lcd_c.c>
  9. #include "kbd_d 4x4.c"
  10.  
  11.  
  12. #define  KEYHIT_DELAY   200    //Tiempo de espera del teclado en milisegundos
  13.  
  14. void main(){
  15.  
  16.     set_tris_C(0b00001000);//0como salidas
  17.     set_tris_D(0b00000000);//0como salidas
  18.  
  19.     lcd_init();
  20.     kbd_init();
  21.  
  22.  
  23.     setup_adc(ADC_CLOCK_INTERNAL);
  24.     setup_adc_ports(AN0);
  25.  
  26.     enable_interrupts(GLOBAL);
  27.     printf(lcd_putc,"\f ",);
  28.  
  29.     int8 j=0;
  30.     char ultimopresionado='\0';
  31.  
  32.     while(True){
  33.         k=tecla_time();
  34.         if(ultimopresionado != k ){
  35.             if ( k >= '0' && k<='9'){
  36.              cadena1[j]=k-'0';
  37.              j++;
  38.             }
  39.             if(j==sizeof cadena1){
  40.                 numerocadena=0;
  41.                 for(i=0;i<sizeof cadena1;i++) {
  42.                     numerocadena *= 10;
  43.                     numerocadena += cadena1[i] - '0';
  44.                 }
  45.                 lcd_gotoxy(1,1);
  46.                 printf(lcd_putc,"%Lu",numerocadena);
  47.                 j=0; // Comienza de nuevo
  48.             }
  49.         }
  50.         ultimopresionado = k; // Pequeña traba para que no tome varias veces el mismo numero
  51.     }// while
  52. }// main
Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: SnowMan en 27 de Julio de 2019, 04:39:44
si me guarda en el vector los dígitos ingresados pero cuando imprimo numerocadena me sale 65102 y solo presione un numero no se la razón.

pero lo que quiero hacer mas que nada es tengo el vector y ingreso en la posición[0]=1 y en la posición[1]=2, formar un 12 y imprimirlo igual si ingreso 3 posiciones y se ingresaron 1,2,3... poder formar 123, ya que el teclado no me deja escribir esa cifra y luego guardarla. trate de buscar con puntero pero no encontré como hacer eso. no se que método se utiliza para hacer cifras de un vector estático.
Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: KILLERJC en 27 de Julio de 2019, 12:24:09
Perdon fue un error mio... Junte los dos codigos y mientras los escribia me olvide de cambiar algunas cosas.. Me olvide de quitar un "- '0'" al convertirlo, que ya lo habia realizado antes
Ese error hacia que la conversion no fuera correcta.

Entonces voy a escribir dos codigos... con sus ventajas y desventajas
El primero este, y explicado:

Código: C
  1. while(True){
  2.         // Se lee la tecla
  3.         k=tecla_time();
  4.         /*
  5.          * Aca reviso que si la tecla que se presiono no sea la misma que antes, como el while se repite MUCHAS veces
  6.          * mientras alguien tiene el dedo en el teclado, necesito solo discriminar una sola, si detecta en cada paso del while
  7.          * la misma tecla entonces no hace nada.
  8.          */
  9.         if(ultimopresionado != k ){
  10.             /*
  11.              * De ser distinta la tecla entra aca... Aca me centro en si esa tecla me interesa o no....
  12.              * Si es un '\0' (ninguna tecla presionada) simplemente salgo, sino verifico si es un numero que son los que me interesan
  13.              * Si quisiera agregar una tecla de letra con otra funcionalidad podria agregarlo en un else de este if
  14.              */
  15.             if ( k >= '0' && k<='9'){
  16.                 /*
  17.                  *  Como es un numero lo guardo como un numero, asi es mas simple su conversion, a no ser
  18.                  *  que necesites explicitamente guardarlo como caracter
  19.                  */
  20.                 cadena1[j]=k-'0';
  21.                 // Aumento el indice para ocupar el proximo lugar del array
  22.                 j++;
  23.             }
  24.             /*
  25.              * Esta es la rutina de conversion, unicamente funcionaria cuando se completó el array
  26.              * Podes observar que la condicion para que entre es que j supero el numero maximo de valores
  27.              */
  28.             if(j==sizeof cadena1){
  29.                 // Pongo a 0 mi variable asi puedo operar, por si es que habia algun valor antes
  30.                 numerocadena=0;
  31.                 /*
  32.                  *  Paso por cada digito, lo multiplico por 10 y luego lo sumo
  33.                  *  Esto lo verias de la siguiente forma, por ejemplo si tuviera 1,2,3,4
  34.                  *  Paso 1: numerocadena = 1
  35.                  *  Paso 2: Al multiplicarlo por 10, me queda 10 y le suma el 2, quedando 12
  36.                  *  Paso 3: numerocadena = 123
  37.                  *  Paso 4: numerocadena = 1234
  38.                  */
  39.                 for(i=0;i<sizeof cadena1;i++) {
  40.                    
  41.                     numerocadena *= 10;
  42.                     numerocadena += cadena1[i];
  43.                 }
  44.                 // Finalmente imprimo el resultado
  45.                 lcd_gotoxy(1,1);
  46.                 printf(lcd_putc,"%Lu",numerocadena);
  47.                
  48.                 // Comienza de nuevo a tomar datos
  49.                 j=0;
  50.             }
  51.         }
  52.         /*
  53.          *  Lo ultimo que se presiono se guardo en k, por lo tanto necesito actualizar este
  54.          *  valor para que la misma tecla no vuelve a entrar
  55.          */
  56.         ultimopresionado = k;
  57.     }// while
  58. }// main

Este posee la ventaja de que si deseas agregar alguna tecla aparte, es sencillo de realizar, por ejemplo el '#' para borrar todo y comenzar de 0.
Lo feo es que no muestra ni convierte hasta tener los 4 valores.

Otra de las formas que uno puede hacer este código, es ir mostrando el valor que se va escribiendo ya se con los ceros o sin ellos.. Esto solo modifica la forma de imprimirlos sobre el LCD

Código: C
  1. while(1){
  2.         char k;
  3.         k = tecla_time();
  4.         if(ultimopresionado != k ){
  5.             if ( k >= '0' && k<='9'){
  6.                 if(j==0){numerocadena=0;}
  7.                 cadena1[j]=k-'0';
  8.                 numerocadena*=10;
  9.                 numerocadena += cadena1[j];
  10.                 lcd_gotoxy(1,1);
  11.                 printf(lcd_putc,"%04Lu",numerocadena);
  12.                 if(++j== sizeof cadena1) {j=0;}
  13.             }
  14.         }
  15.         ultimopresionado = k; // Pequeña traba para que no tome varias veces el mismo numero
  16.     }// while

Util y sencillo si vas a borrar todo con un solo boton.... Pero si pensas borrar 1 solo valor, por ejemplo pusiste 124 y  era 123, donde queres borrar ese 4, entonces este codigo no te va a servir... Vas a necesitar convertir TODO el numero en cada cambio que se realice. Es donde vas a realizar un hibrido entre este codigo y el anterior.

Tambien puede ser que quieras que el numero vaya desplazandose, es decir si tenes 1234 y presionas un 5, que quede 2345.
Pero todo esto queda a tu imaginacion y en lo que buscas hacer...

------------------------------------------------------------------------------------------------------

Respecto a:

Citar
pero lo que quiero hacer mas que nada es tengo el vector y ingreso en la posición[0]=1 y en la posición[1]=2, formar un 12 y imprimirlo igual si ingreso 3 posiciones y se ingresaron 1,2,3... poder formar 123, ya que el teclado no me deja escribir esa cifra y luego guardarla. trate de buscar con puntero pero no encontré como hacer eso. no se que método se utiliza para hacer cifras de un vector estático.

Pasar de 4 numeros separados a un numero completo es simplemente algo asi:

Código: [Seleccionar]
numero = posicion[0] * 1000 + posicion[1] * 100 + posicion[2] * 10 + posicion[3]
Pero esto lo podemos hacer de forma mas simple con un for y sumas, que es lo que pase:

Código: C
  1. for(i=0;i<sizeof cadena1;i++) {
  2.                     numerocadena *= 10;
  3.                     numerocadena += cadena1[i];
  4.                 }

Y es la forma en que pasas de todos los numeros separados en 1 solo.
Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: SnowMan en 28 de Julio de 2019, 13:27:47
Gracias por tu ayuda ya me funciona bien, solo una pregunta porque en la posicion1 me aparece un 17 si le agrego cualquiero numero, al ingresarlo y imprimirlo para confirmar si me sale el numero, pero cuando hago el for para mostrar el vector siempre en esa posicion me aparece el 17, tambien agrande el vector a 5 y en la posicion 4 tambien me aparece el 17, solo en las posiciones0,p2,p3 son las unicas en las que funciona bien el vector.

si al finalizar lo del vector, inicia el limpiado del vector pero aun asi, sigue con valor de 17.
Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: KILLERJC en 29 de Julio de 2019, 08:42:25
Gracias por tu ayuda ya me funciona bien, solo una pregunta porque en la posicion1 me aparece un 17 si le agrego cualquiero numero, al ingresarlo y imprimirlo para confirmar si me sale el numero, pero cuando hago el for para mostrar el vector siempre en esa posicion me aparece el 17, tambien agrande el vector a 5 y en la posicion 4 tambien me aparece el 17, solo en las posiciones0,p2,p3 son las unicas en las que funciona bien el vector.

si al finalizar lo del vector, inicia el limpiado del vector pero aun asi, sigue con valor de 17.

Perdon pero para poder entenderte necesito ver los 2 codigos que estas probando y donde ocurre eso... Considero que antes de iniciar todo deberias limpiar tu array ( ponerlo todo a 0 ) si o si.
Título: Re:AYUDA POR FAVOR Y GRACIAS UNIR VECTOR DE CARACTERES NUMÉRICOS
Publicado por: SnowMan en 02 de Agosto de 2019, 00:31:09
 gracias por la ayuda, ya lo soluciones.