Autor Tema: PROGRAMA CON LCD  (Leído 2607 veces)

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

Desconectado eleguez

  • PIC10
  • *
  • Mensajes: 21
PROGRAMA CON LCD
« en: 21 de Septiembre de 2006, 13:22:08 »
Hola a todos, estoy intentando programar el pic16f876 para visualizar en un LCD el resultado de la conversión analogica digital, el puerto que utilizo para el LCD es el B. Antes de introducir el programa completo he intentado hacer uno sencillito que solo me muestre una palabra en el LCD para comprobar que tengo todo bien conectado, pero el caso es que no me funciona, supongo que tendre algo mal. os lo envio para qque me digais que puedo tener mal, eso si hay algo bien  :D

#include <16F876.h>
#use delay(clock=20000000)
#include <lcd.c>
#fuses HS, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT, NOLVP


void main()
{
lcd_init();
do
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("MEDIDOR PRESION");
lcd_gotoxy(1,1);

}while (true);
}




Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
Re: PROGRAMA CON LCD
« Respuesta #1 en: 21 de Septiembre de 2006, 13:28:17 »
No te funciona el programa porque la libreria del ccs, predefinidamente te configura el lcd en el puerto D, para usarlo en el puerto b hay que utilizar :

#define use_portb_lcd TRUE

Prueba con esto a ver que pasa.


Salu2

Desconectado Rulo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 168
Re: PROGRAMA CON LCD
« Respuesta #2 en: 21 de Septiembre de 2006, 18:40:05 »


 O puedes utilizar la libreria flex_lcd_c.c que esta disponible en la paguina de nocturno http://elrebujito.es, donde puedes definir los pines que van a controlar la LCD a tu antojo.

     
Código: [Seleccionar]
#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS    PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E     PIN_C2

Desconectado eleguez

  • PIC10
  • *
  • Mensajes: 21
Re: PROGRAMA CON LCD
« Respuesta #3 en: 22 de Septiembre de 2006, 06:14:12 »
Hola de nuevo, no me ha funcionado :(, supongo que este bien conectado porq la lcd se enciende, pero no escribe nada. vosotros tendreis un programilla asi muy sencillito que sepais que funcione?, o que puedo cambiar en este?
Un saludo y gracias

Desconectado eleguez

  • PIC10
  • *
  • Mensajes: 21
Re: PROGRAMA CON LCD
« Respuesta #4 en: 22 de Septiembre de 2006, 06:33:08 »
ya me funciona, debia tener alguna conexion mal. Gracias por las soluciones. ahora comenzare con el programa completo.
Saludos

Desconectado eleguez

  • PIC10
  • *
  • Mensajes: 21
Re: PROGRAMA CON LCD
« Respuesta #5 en: 25 de Septiembre de 2006, 06:21:14 »
Hola de nuevo, continuo con mi aventura  :-) , he ampliado el programa para que al pulsar dos botones (pin_C0 y pin_C2), me desplace por un menu en el que me aparecen las diferentes unidades de medida de presion que posteriormente seleccionare. El problema es que no me detecta los pulsadores, es decir.. siempre me muestra el valor que le indico en "default". ¿alguien me puede ayudar?


#include <16F876.h>
#use delay(clock=20000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#fuses HS, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT, NOLVP
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

char cad1[7]="BARES";
char cad2[12]="ATMOSFERAS";
char cad3[5]="PSI";
char cad4[14]="KILOPASCALES";
float medida=0;
int num=0;

void main()
{
lcd_init();
do
{

   if (!input(PIN_C0)) num+=1;
   else if (!input(PIN_C2)) num-=1;
   else num=num;

   Switch(num)
   {
   case '1':
   lcd_putc("\f");
   lcd_gotoxy(1,1);
   lcd_putc("UNIDADES MEDIDA");
   lcd_putc("\n");
   printf(lcd_putc,"%s",cad1);
   delay_ms(1000);
      

   case '2':
   lcd_putc("\f");
   lcd_gotoxy(1,1);
   lcd_putc("UNIDADES MEDIDA");
   lcd_putc("\n");
   printf(lcd_putc,"%s",cad2);
   delay_ms(1000);
      

   case '3':
    lcd_putc("\f");
   lcd_gotoxy(1,1);
   lcd_putc("UNIDADES MEDIDA");
   lcd_putc("\n");
   printf(lcd_putc,"%s",cad3);
   delay_ms(1000);
      

   case '4':
   lcd_putc("\f");
   lcd_gotoxy(1,1);
   lcd_putc("UNIDADES MEDIDA");
   lcd_putc("\n");
   printf(lcd_putc,"%s",cad4);
   delay_ms(1000);
      

   default:
   lcd_putc("\f");
   lcd_gotoxy(1,1);
   lcd_putc("MEDIDOR PRESION");
   lcd_putc("\n");
   lcd_putc("Elegir unidades");
   delay_ms(1000);
      
   }


}while (true);
}


Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
Re: PROGRAMA CON LCD
« Respuesta #6 en: 25 de Septiembre de 2006, 08:31:00 »
Viendo el programa, has de fijarte en que la parte donde testeas los pulsadores esta en el do, o sea que solo lo hace una sola vez y luego el programa entra en el while(1), por esta razon no te detecta los pulsadores. En vez de utilizar do-while, pon el codigo dentro del while 1. De esta forma deberia funcionar. Otra cosa es que te has dejado de setear los puertos de entrada y salida. Si quieres que el compilador solito se encargue de esto utiliza la directiva #use_standard_io.

Prueba a cambiar esto y nos cuentas.

Salu2

Desconectado eleguez

  • PIC10
  • *
  • Mensajes: 21
Re: PROGRAMA CON LCD
« Respuesta #7 en: 25 de Septiembre de 2006, 08:59:47 »
no lo entiendo muy bien, a que while te refieres con while 1?, yo entiendo que todo lo que esta dentro del do se ejecuta siempre que se cumpla el while no?

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: PROGRAMA CON LCD
« Respuesta #8 en: 25 de Septiembre de 2006, 10:03:53 »
Hola que tal? he estado mirando el programa y lo que veo es que el do while esta bien, while(TRUE) es un bucle infinito por lo que siempre se estara ejecutando.

Ahora lo que veo que tienes mal es el
Citar
case '1':
pues tiene que ir sin las comillas 'x'. Seria asi


Código: C
  1. Switch(num)
  2.      {
  3.       case 1:
  4.  
  5.       //lo que quiero que haga
  6.       //y al final del case
  7.  
  8.       break;
  9.  
  10.  
  11.       case 2:
  12.  
  13.       //lo que quiero que haga
  14.       //y al final del case
  15.  
  16.       break;
  17.  
  18. .......................

El problema de las comillas es que le estas diciendo al switch que cuando num valga '1' haga lo del case y ahi esta el fallo num nunca sera '1' sino 1. Creo haberme esplicado :P , ah ! y añade el break al final de cada case y del default.

Suerte

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: PROGRAMA CON LCD
« Respuesta #9 en: 25 de Septiembre de 2006, 10:17:15 »
Otra cosa que podrias mejorar es que en los dos botones (pin_C0 y pin_C2) tendrias que añadirle un antirrebote por que sino cuando pulses el boton dara varios falsos contactos hasta que se estabilice y en vez de sumar uno o restar uno, sumaras o restaras varios a la vez. :P 

Código: C
  1. if (input(PIN_C0)) // Mira si pulsas PIN C0
  2.          {
  3.          while(input(PIN_C0)) delay_ms(20); // Y aqui estara esperando hasta que sueltes el boton y despues de soltarlo
  4.               {             // esperará 20 ms para sumar num evitando los antirrebotes.  
  5.               num++; // Incrementa en uno num.
  6.               }
  7.          }
  8.  
  9.       if (input(PIN_C2)) // Mira si pulsas PIN C0
  10.          {
  11.          while(input(PIN_C2)) delay_ms(20); // Y aqui estara esperando hasta que sueltes el boton y despues de soltarlo
  12.               {           // esperará 20 ms para sumar num evitando los antirrebotes.  
  13.               num--; // Decrementa en uno num.
  14.               }
  15.          }

Espero que sirva de ayuda  :P.


Desconectado eleguez

  • PIC10
  • *
  • Mensajes: 21
Re: PROGRAMA CON LCD
« Respuesta #10 en: 25 de Septiembre de 2006, 11:32:08 »
Muchas gracias, lo de las comillas ya lo habia probado, pero lo que me hace es ejecutarme todos los casos uno tras otro, sin pulsar los botones. voy a probar con el break tambien y lo de los rebotes. Ya os contare,
Un saludo. Elena

Desconectado quirogaareal

  • PIC16
  • ***
  • Mensajes: 180
Re: PROGRAMA CON LCD
« Respuesta #11 en: 25 de Septiembre de 2006, 13:10:59 »
Hola
Si estas queriendo hacer algo con algun sensor de presion fijate aca

http://www.todopic.com.ar/foros/index.php?topic=12416.15

espero que te sirva

Saludos desde cordoba Argentina
Recuerda : Si una mujer te ama de verdad no te pedira ni Matrimonio, Ni concubinato , Ni hijos, No te mentira , ni buscara que cambies de opinion con respecto a las tres primeras opciones.

Saludos

desde Cordoba Argentina

Desconectado eleguez

  • PIC10
  • *
  • Mensajes: 21
Re: PROGRAMA CON LCD
« Respuesta #12 en: 25 de Septiembre de 2006, 16:17:52 »
El programa que yo voy a hacer es mas sencillo pero puedo sacar mucho del que me dices. muchas gracias.

Desconectado eleguez

  • PIC10
  • *
  • Mensajes: 21
Re: PROGRAMA CON LCD
« Respuesta #13 en: 03 de Octubre de 2006, 08:19:15 »
Hola de nuevo, bueno.. lo del  Switch ya me funciona bien  quitado las comillas y añadiendo el break. Ahora me encuentro con otro problemilla,  quiero que dentro de cada caso, al presionar otra tecla(C1) me muestre el valor de la presion en el valor indicado. lo he intentando de varias formas, la mas logica os la pongo aqui, pero tampoco me funciona (siempre me muestra el else aunque pulse la tecla). a ver si me podeis ayudar:

#include <16F876A.h>

#use delay(clock=20000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#fuses HS, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT, NOLVP
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


char cad1[7]="BARES";
char cad2[12]="ATMOSFERAS";
char cad3[5]="PSI";
char cad4[14]="KILOPASCALES";
float medida=0;
int num=0;
int atm=0;
int bar=0;
int psi=0;
int KPa=0;

void main()
{
lcd_init();
do
{
medida=358.4;
atm=(medida*0.53)-190.47;
bar=atm*1.013;
psi=atm*14.7;
KPa=atm*101.325;

   if (!input(PIN_C0))
   num+=1;
   else if (!input(PIN_C2))
   num-=1;
   else num=num;

   Switch(num)
   {
   case 1:

      if(!input(PIN_C0))
      {
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("MEDIDOR PRESION");
      lcd_putc("\n");
      printf(lcd_putc,"%s",bar);
      delay_ms(200);
      }
      else
      {
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("UNIDADES MEDIDA");
      lcd_putc("\n");
      printf(lcd_putc,"%s",cad1);
      delay_ms(200);
      }
   break;