Autor Tema: Como vizualizar en un LCD 16x2 al presionar un boton momentaneamente???  (Leído 5836 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado harvy2002

  • PIC10
  • *
  • Mensajes: 2

Hola amigos, les comento que tengo este circuito con un PIC18F4550, un Display LCD y Dos sensores de presion MPX4250. Lo que quiero hacer es lo siguiente: en 1er punto necesito medir las 2 presiones que me entregan los 2 sensores y mostrarlas en el LCD (1er punto ya esta hecho), en segundo lugar necesito mostrar la diferencia entre estas dos presiones en el LCD, para lo cual necesito borrar la pantalla al presionar un boton y que se me indique la diferencia de presiones osea la resta de p1-p2. Ustedes me podiran decir como puedo hacer para vizualizar eso y que mientras presiono el boton me muestre la diferencia de presiones y al dejar de presionarlo vuelva a mostrarme las P1 y la P2????


Este es el codigo que estoy haciendo en CCS C

#include <18f4550.h>
#device adc=10
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=20M)

#include <LCD.C>

float PRESION;
float PRESION2;
float DIFPRE;

void main(void)
{
   int16 PD;
   
   setup_adc_ports(ALL_ANALOG);                     
   setup_adc(ADC_CLOCK_INTERNAL); 
 
  while (1)
   {               
   set_adc_channel (0);                                 
   delay_us(0);
   PD=read_adc();
   
   PRESION=(0.03469726563*PD)-0;                                   
   
   lcd_init();                                     
   lcd_send_byte (0,0x0F);                           
   printf(lcd_putc, "P1= %3.2fPSI", PRESION);
   lcd_gotoxy(16,1);
   
   set_adc_channel (1);                                 
   delay_us(0);
   PD=read_adc();
   
   PRESION2=(0.03469726563*PD)-0;                                   

   lcd_init();                                     
   lcd_send_byte (0,0x0F);
   lcd_gotoxy(1,2);
   printf(lcd_putc, "P2= %3.2fPSI", PRESION2);
   
       DIFPRE=(PRESION-PRESION2);
   }   
}



Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Como vizualizar en un LCD 16x2 al presionar un boton momentaneamente???
« Respuesta #1 en: 18 de Noviembre de 2010, 18:48:37 »
Hola harvy202, bienvenido al foro.  Para lo que quieres hacer hay varias formas, una puede ser por interrupciones o tambien por chequeo cíclico (polling) a una variable o estado de un pin.  También veo que te hace falta algún fuse y tienes otros mal configurados.  El LCD es necesario iniciarlo una sola vez al comienzo y finalmente si no piensas usar todas las entradas ADC es mejor que configures solo las necesarias.  Le hice unas reformas a tu programa con lo que te acabo de mencionar y para que mires como se puede hacer lo que quieres por el método 'polling'.

Código: C
  1. #include <18F4550.h>
  2. #device adc=10
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES BORV20                   //Brownout reset at 2.0V
  10. #FUSES NOPUT                    //No Power Up Timer
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  13. #FUSES NODEBUG                  //No Debug mode for ICD
  14. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  15. #FUSES NOWRT                    //Program memory not write protected
  16. #FUSES NOWRTD                   //Data EEPROM not write protected
  17. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  18. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  19. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  20. #FUSES NOWRTC                   //configuration not registers write protected
  21. #FUSES NOWRTB                   //Boot block not write protected
  22. #FUSES NOEBTR                   //Memory not protected from table reads
  23. #FUSES NOEBTRB                  //Boot block not protected from table reads
  24. #FUSES NOCPB                    //No Boot Block code protection
  25. #FUSES MCLR                     //Master Clear pin enabled
  26. #FUSES NOLPT1OSC                //Timer1 configured for higher power operation
  27. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  28. #FUSES PLL1                     //No PLL PreScaler
  29. #FUSES CPUDIV1                  //No System Clock Postscaler
  30. #FUSES NOUSBDIV                 //USB clock source comes from primary oscillator
  31. #FUSES NOVREGEN                 //USB voltage regulator disabled
  32. #FUSES NOICPRT                  //ICPRT disabled
  33.  
  34. #use delay(clock=20000000)
  35.  
  36. #include <LCD.C>
  37.  
  38. float PRESION;
  39. float PRESION2;
  40. float DIFPRE;
  41.  
  42. void main()
  43. {
  44.    int16 PD;
  45.  
  46.    setup_adc_ports(AN0_TO_AN1|VSS_VDD);
  47.    setup_adc(ADC_CLOCK_INTERNAL);
  48.    setup_psp(PSP_DISABLED);
  49.    setup_spi(SPI_SS_DISABLED);
  50.    setup_wdt(WDT_OFF);
  51.    setup_timer_0(RTCC_INTERNAL);
  52.    setup_timer_1(T1_DISABLED);
  53.    setup_timer_2(T2_DISABLED,0,1);
  54.    setup_ccp1(CCP_OFF);
  55.    setup_comparator(NC_NC_NC_NC);
  56.    setup_vref(FALSE);
  57.    
  58.    lcd_init();
  59.    
  60.    while (1)
  61.    {                
  62.       set_adc_channel (0);                                
  63.       delay_us(20);
  64.       PD=read_adc();
  65.    
  66.       PRESION=(0.03469726563*PD)-0;                                    
  67.  
  68.       set_adc_channel (1);                                
  69.       delay_us(20);
  70.       PD=read_adc();
  71.    
  72.       PRESION2=(0.03469726563*PD)-0;
  73.        
  74.       // Asumiendo un pulsador a negativo en RB0 y una resistencia pullup a +5V...
  75.       if(input(PIN_B0))   // No se ha presionado el botón en RB0...
  76.       {
  77.          lcd_putc(\f);   // Borrar la pantalla
  78.          lcd_send_byte (0,0x0F);                          
  79.          printf(lcd_putc, "P1= %3.2fPSI", PRESION);
  80.          lcd_gotoxy(16,1);
  81.  
  82.          lcd_send_byte (0,0x0F);
  83.          lcd_gotoxy(1,2);
  84.          printf(lcd_putc, "P2= %3.2fPSI", PRESION2);
  85.       }
  86.       else  // Se ha presionado el botón en RB0...
  87.       {
  88.          DIFPRE=(PRESION-PRESION2);
  89.          lcd_putc(\f);   // Borrar la pantalla        
  90.          printf(lcd_putc, "Dif= %3.2fPSI", DIFPRE);
  91.       }
  92.    }  
  93. }

Fíjate que también por aqui estás restando un cero...  PRESION=(0.03469726563*PD)-0;

Saludos!

Edito: Se me había olvidado borrar la pantalla para cada opción.  También quería preguntarte para que es esto? lcd_send_byte (0,0x0F);
« Última modificación: 18 de Noviembre de 2010, 19:40:23 por bmb »

Desconectado harvy2002

  • PIC10
  • *
  • Mensajes: 2
Re: Como vizualizar en un LCD 16x2 al presionar un boton momentaneamente???
« Respuesta #2 en: 18 de Noviembre de 2010, 21:47:34 »
Pues lo probe tal como me dijiste y no funciono. Pero le adicione algunas cosas de lo que le modificaste y el mio si funciono perfecctamente. Muchas gracias

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Como vizualizar en un LCD 16x2 al presionar un boton momentaneamente???
« Respuesta #3 en: 18 de Noviembre de 2010, 23:14:28 »
Y podrías compartir con nosotros las modificaciones?  La idea es aprender...

Saludos!

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Como vizualizar en un LCD 16x2 al presionar un boton momentaneamente???
« Respuesta #4 en: 18 de Noviembre de 2010, 23:39:09 »
Citar
Pues lo probe tal como me dijiste y no funciono.

Acabo de ver que me faltaron una comillas en los: lcd_putc('\f');   // Borrar la pantalla y también mandar el cursor a la posición 1,1 en la segunda opción:

Código: [Seleccionar]
     else  // Se ha presionado el botón en RB0...
      {
         DIFPRE=(PRESION-PRESION2);
         lcd_putc('\f');   // Borrar la pantalla
         lcd_gotoxy(1,1);
         printf(lcd_putc, "Dif= %3.2fPSI", DIFPRE);

Creí que era algo más grave.  Lo monté en proteus y funciona perfectamente...

Saludos!
« Última modificación: 18 de Noviembre de 2010, 23:44:55 por bmb »

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Como vizualizar en un LCD 16x2 al presionar un boton momentaneamente???
« Respuesta #5 en: 19 de Noviembre de 2010, 00:08:44 »
Como Proteus es bastante lento, de la forma anterior muestra mucho parpadeo en el LCD.  Funciona mejor cambiando la última parte para ocupar siempre los 16 caracteres de cada línea del LCD, asi:

Código: C
  1. // Asumiendo un pulsador a negativo en RB0 y una resistencia pullup a +5V...
  2.       if(input(PIN_B0))   // No se ha presionado el boton en RB0...
  3.       {
  4.          lcd_gotoxy(1,1);
  5.          printf(lcd_putc, "P1= %3.2fPSI    ", PRESION);
  6.          lcd_gotoxy(1,2);
  7.          printf(lcd_putc, "P2= %3.2fPSI    ", PRESION2);
  8.       }
  9.       else  // Se ha presionado el boton en RB0...
  10.       {
  11.          DIFPRE=(PRESION-PRESION2);
  12.          lcd_gotoxy(1,1);
  13.          printf(lcd_putc, "Dif= %3.2fPSI   ", DIFPRE);
  14.          lcd_gotoxy(1,2);
  15.          printf(lcd_putc, "                ");
  16.       }

Saludos!

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Como vizualizar en un LCD 16x2 al presionar un boton momentaneamente???
« Respuesta #6 en: 19 de Noviembre de 2010, 11:43:37 »





andate con ojo con la alimentacion del lcd ya que en el circuito en proteus la tienes al reves y aunque en proteus no te de ningun error de simulacion en la vida real si te lo dara, pero un problema mas bien que un error...
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...