Autor Tema: Como concatenar!!  (Leído 4401 veces)

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

Desconectado kikecon

  • PIC10
  • *
  • Mensajes: 35
Como concatenar!!
« en: 11 de Noviembre de 2010, 23:22:46 »
hola amigos nuevamente molestando por el foro les cuento que logre resolver el problema de mostrar números consecutivos en mi LCD ingresando por teclado ahora quiero saber como hacer para que los valores que guardo en un arreglo se concatenen por ejemplo en la función que he hecho para teclado tengo condiciones (pues solo trabajo con un pin para mis ingresos por teclado),, entonces al presionar la tecla 1 en mi pantalla visualizare dicho numero y en la primera posición del arreglo tendré 1 también y así con los demás al presionar la tecla + los números que ingreso deberán de juntarse formando un solo dígito como hago eso antes me dijeron que multiplicara x 10 y sumara el numero de la siguiente posición tiene lógica pero que pasa si el valor que quiero ingresar es de 2 dígitos? y el segundo es 0,  aquí dejo mi código espero su ayuda si hay algo mejor háganme saber !!
Código: [Seleccionar]
#include <16f873a.h>
#device adc=10 //10 bits de resolucion
#FUSES xt,NOWDT,NOPROTECT,NOLVP,NOPUT,BROWNOUT //funcionamiento
#use delay (clock=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)//libreria par el manejo del puerto serie a 9600 baudios
#include "lcd.c"
/////////////////////////////////////
////////// FUNCIONES ///////////////
///////////////////////////////////
void inicializacion(void);
void com_ser(void);
void teclado(void);
//////////////////////////////////
//// Inicializacion Pines ///////
////////////////////////////////
#bit porta_2=0x05.2
#bit portc_0=0x07.0
#bit portc_4=0x07.4
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07
#byte adcon1=0x009f
///////////////////////////////
//////// Variables ///////////
/////////////////////////////
float valor,temp=0;
long set;
int cad[16],set_point=0;
int i=1;                      //contador para desplegar caracteres en lcd
////////////////////////////
////////ejecucion//////////
//////////////////////////
void inicializacion()
{
   set_tris_a(0b00001011);    // AN0, AN1 y AN3 son entradas
   set_tris_c(0b10010000);
   adcon1=(0b00000100);       //conf del adcon1
   setup_adc(ADC_CLOCK_INTERNAL);
   lcd_init();
   porta=0x00;                //todos los puertos inicializan en 0
   portb=0x00;
   portc=0x00;
}
void  main()
{
   inicializacion();         //funcion de inicializacion
   porta_2=1;                //led de encendido
   lcd_gotoxy(4,1);lcd_putc("Bienvenidos  \n\r");
   delay_ms(2000);
   for( ;; )
   {
      set_adc_channel(0);    //se habilita el canal analog 0
      valor=read_adc();      //se toma la lectura del canal 0
      temp=500*valor/1024;   //ecuacion para temperatura
      printf(lcd_putc,"\fTemp=%0.1fºC", temp);
      delay_ms(100);
      com_ser();             //llamado para la comunicacion serie
      if(portc_4==1)         //interruptor para ingresar el set point x teclado
         teclado();          //funcion para uso del teclado
      delay_ms(1000);         
   }
}
void teclado()
{
                             
   inicializacion();
   while(true)
   {
      lcd_gotoxy(1,1);
      lcd_putc(" ");
      delay_ms(10);
      lcd_putc("set point y +\r\n");
      set_adc_channel(1);              //lectura desde
      set=read_adc();                  //el teclado
      if((set>613)&(set<625))          //condicion para ON/C
      {
         lcd_gotoxy(i,2);
         lcd_putc('\f');delay_ms(40);  //limpia la LCD
         i=1;
      }
      if((set>423)&(set<431))          //Condicion para 0
      {
         lcd_gotoxy(i,2);
         lcd_putc('0');delay_ms(200);
         i=i+1;
      }
      if((set>271)&(set<277))         //condicion para +
      {
        if((cad[1]>0)&(cad[2]!=false))  //  esto me funciona bien pero q pasa si cad[2] es  igual a 0
        {
            set_point=(cad[1]*10)+cad[2];
            lcd_gotoxy(1,1);
            printf(lcd_putc,"\fTemp=%dºC", set_point);
            delay_ms(2000);
        }
        if((cad[2]==false))
        {
            set_point=cad[1];
            lcd_gotoxy(1,1);
            printf(lcd_putc,"\fTemp=%dºC", set_point);
            delay_ms(2000);
        }
       }
      if((set>658)&(set<663))         //condicion para 1
      {
         cad[i]=1;
         lcd_gotoxy(i,2);
         lcd_putc('1');delay_ms(200);
         i=i+1;
      }
      if((set>443)&(set<449))         //condicion para 2
      {
         cad[i]=2;
         lcd_gotoxy(i,2);
         lcd_putc('2');delay_ms(200);
         i=i+1;
      }
      if((set>343)&(set<347))         //condicion para 3
      {
         cad[i]=3;
         lcd_gotoxy(i,2);
         lcd_putc('3');delay_ms(200);
         i=i+1;
      }
      if((set>280)&(set<284))         //condicion para -
      {
         lcd_gotoxy(i,2);
         lcd_putc('-');delay_ms(200);
         i=i+1;
      }
      if((set>690)&(set<696))         //condicion para 4
      {
         lcd_gotoxy(i,2);
         lcd_putc('4');delay_ms(200);
         i=i+1;
      }
      if((set>458)&(set<462))         //condicion para 5
      {
         lcd_gotoxy(i,2);
         lcd_putc('5');delay_ms(200);
         i=i+1;
      }
      if((set>350)&(set<356))         //condicion para 6
      {
         lcd_gotoxy(i,2);
         lcd_putc('6');delay_ms(200);
         i=i+1;
      }
      if((set>748)&(set<755))         //condicion para 7
      {
         lcd_gotoxy(i,2);
         lcd_putc('7');delay_ms(200);
         i=i+1;
      }
      if((set>480)&(set<489))         //condicion para 8
      {
         lcd_gotoxy(i,2);
         lcd_putc('8');delay_ms(200);
         i=i+1;
      }
      if((set>365)&(set<371))         //condicion para 9
      {
         lcd_gotoxy(i,2);
         lcd_putc('9');delay_ms(200);
         i=i+1;
      }
   }
}
void com_ser()
{
   portc_0=1;
   set_adc_channel(0);
   valor=read_adc();
   temp=500*valor/1024;
   printf("Temperatura=%01.2fºC\r\n",temp);
   delay_ms(300);
   portc_0=0;
}
Enrique Contreras R.

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Como concatenar!!
« Respuesta #1 en: 12 de Noviembre de 2010, 05:31:47 »
Si el nuevo dígito es cero el algoritmo aún funcionaría correctamente sin importar el número de cifras (Si el valor actual es 7 por ejemplo, e ingresa un 0, harías 7*10+0=70).
Estas instrucciones que se repiten en todos los IF:
Código: C
  1. delay_ms(200);
  2.     i=i+1; /* i++ */
Podrías sacar afuera, al final del ultimo IF,  así se reduce un poco el código generado.
También podrías emplear ELSE-IF, ya que si se cumple una condición no se cumplirán las otras, lo que optimizaría la velocidad.
@fabianjsm is on twitter

Desconectado kikecon

  • PIC10
  • *
  • Mensajes: 35
Re: Como concatenar!!
« Respuesta #2 en: 12 de Noviembre de 2010, 19:49:50 »
hola fabian pues la verdad que no me resulta asi, que tal si deseo digitar solo un 7 entonces como veras tengo esta condicion:

if((cad[1]>0)&(cad[2]!=false))  //  esto me funciona bien pero q pasa si cad[2] es  igual a 0
        {
            set_point=(cad[1]*10)+cad[2];
            lcd_gotoxy(1,1);
            printf(lcd_putc,"\fTemp=%dºC", set_point);
            delay_ms(2000);
        }

dice que si cad[2] es diferente de 0 hará lo que esta ahí pero si no lo es es decir si es igual a 0 no hara nada para lo cual puse la siguiente sentencia:

if((cad[2]==false))
        {
            set_point=cad[1];
            lcd_gotoxy(1,1);
            printf(lcd_putc,"\fTemp=%dºC", set_point);
            delay_ms(2000);
        }


esto cumpliría pero bueno, igual se estanca en la primera condición no se haz hecho la prueba, con lo demas si tienes mucha razon gracias por el dato ojala me puedas ayudar
Enrique Contreras R.

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Como concatenar!!
« Respuesta #3 en: 13 de Noviembre de 2010, 19:45:43 »
Lo que estas haciendo no es concatenar, la concatenación une dos o más cadenas en una sola.
En un vector o una cadena de caracteres estos ya están concatenados si no existe un indicador de final de cadenas entre ellos.
En tu caso es necesario dar un peso especial a cada valor antes de sumarlos.
Para solucionar tu problema, podrías utilizar un valor que no puede ser ingresado desde el teclado el cual indicaría el final de los números validos, así sabrías hasta donde evaluar.
Para almacenar 16 dígitos decimales son necesario 54 bits, podrías bajar a 4 dígitos, para los cuales son necesarios solo 14 bits.
Te paso este código donde los problemas son semejantes, esta probado y funciona sin problemas.

Código: C
  1. #define FIN 0xFF
  2. // para la tecla cero el valor retornado por leer_teclado es 0, no '0',
  3. // lo mismo para los demás números.
  4. // Para las teclas especiales retorna '#' y '*'.
  5. int LeerTeclado()
  6. {
  7.     int buffer[4], i, ret;
  8.     int peso; // unidad, decena, centena...
  9.     // leer los digitos, 4 como máximo, terminar antes con '#'
  10.     for(i=0; i<4; i++) {
  11.         int t = leer_teclado();
  12.         if(t=='#' || t=='*') {
  13.             buffer[i] = FIN;
  14.             break;
  15.         }
  16.         buffer[i] = t;
  17.     }
  18.     ret = 0;
  19.     peso = 0;
  20.     if(!i) // no se ingreso ningun digito, solo '#'
  21.         return 0;
  22.     while(i--) {
  23.         if(!peso)
  24.             peso=1;
  25.         else
  26.             peso *= 10;
  27.         ret += peso * buffer[i];
  28.     };
  29.     return ret;
  30. }
« Última modificación: 13 de Noviembre de 2010, 19:48:03 por fabianjm »
@fabianjsm is on twitter


 

anything