TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ingalen en 21 de Enero de 2009, 20:01:52

Título: problema programa LCD pic 16F84
Publicado por: ingalen en 21 de Enero de 2009, 20:01:52
Quisiera poder correr el siguiente programa de un mensaje HOLA en el modulo LCD

tengo los siguientes programas bajados de la red.



Programa principal.




// Ejemplo para simulación y/o MicroPIC Trainer

// El manejo de la pantalla LCD.

// Este ejemplo pretende introducirnos en el manejo de la pantalla LCD, para la
// visualización de diferentes mensajes (p. ej. Hola).

// Debe recordarse que las líneas RA0-RA2 actúan ahora como salida de señales de control
// hacia el LCD. Al estar conectadas con sendos interruptores en la MicroPIC Trainer,
// estos deben estar a nivel lógico "1" permanentemente.

#include <16f84.h>

#use delay(clock=4000000,RESTART_WDT)
#include <lcd2.c>

#use fast_io(A)
#use fast_io(B)

main() {000

  while(1)
  {
    lcd_init();   // Comandos de inicialización del LCD.

    lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); // Envía comando al LCD
    lcd_putc('H');  // Envía caracter al LCD.
    lcd_putc('o');
    lcd_putc('l');
    lcd_putc('a');
    lcd_putc(' ');
    sleep();
  }
}



Programa de LCD.



// Funciones para la gestion del display LCD de la MicroPIC Trainer.

//  lcd_init()   Debe ser llamada antes que las otras funciones.
//
//  lcd_putc(c)  Visualiza c en la siguiente posición del display.
//               Caracteres especiales de control:
//                      \f  Borrar display
//                      \n  Saltar a la segunda linea
//                      \b  Retroceder una posición.
//
//  lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el display.
//                  (la esquina superior izquierda es 1,1)
//
//  lcd_getc(x,y)   Devuelve el caracter de la posicion x,y del display.


#bit  lcd_enable = 5.2
#bit  lcd_rw     = 5.1
#bit  lcd_rs     = 5.0
#byte lcd_a = 5
#byte lcd_b = 6

#define LCD_LINEA2 0x40    // Direccion de memoria para la segunda linea
#define LCD_DATO    1
#define LCD_COMANDO 0

#define LCD_CLEAR        0x01
#define LCD_HOME    0x02

#define LCD_DISPLAY_OFF  0x08
#define LCD_DISPLAY_ON   0x0C
#define LCD_CURSOR_ON    0x0E
#define LCD_CURSOR_BLINK 0x0F

#define LCD_CURSOR_SHIFT_RIGHT  0x10
#define LCD_CURSOR_SHIFT_LEFT   0x14
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT  0x1C


int lcd_leer()
{
  int valor;

  set_tris_a(0x18);
  set_tris_b(0xFF);

  lcd_rw = 1;
  delay_cycles(1);
  lcd_enable = 1;
  delay_cycles(1);
  valor = lcd_b;
  lcd_enable = 0;
  delay_us(40);

  set_tris_b(0x00);
  return valor;
}


void lcd_enviar(int dir, int valor)
{
  set_tris_a(0x00);
  set_tris_b(0x00);

  lcd_rs = 0;
  while( bit_test(lcd_leer(),7) );
  lcd_rs = dir;
  delay_cycles(1);

  lcd_rw = 0;
  delay_cycles(1);
  lcd_enable = 0;
  lcd_b = valor;
  delay_cycles(1);
  lcd_enable = 1;
  delay_us(2);
  lcd_enable = 0;
  delay_us(40);
}


void lcd_init()
{
  int i;

  set_tris_a(0x18);
  set_tris_b(0x00);

  lcd_enable = 0;
  lcd_rw = 0;
  lcd_rs = 0;
  delay_ms(15);

  for(i=0; i<3; i++)
  {
    lcd_enviar(LCD_COMANDO,0x38);
    delay_ms(5);
  }
  lcd_enviar(LCD_COMANDO,LCD_DISPLAY_ON);
  lcd_enviar(LCD_COMANDO,0x06);
  lcd_enviar(LCD_COMANDO,LCD_CLEAR);
  lcd_enviar(LCD_COMANDO,LCD_HOME);
}


void lcd_gotoxy( byte x, byte y) {
   byte dir;

   if(y!=1)
     dir=LCD_LINEA2;
   else
     dir=0;
   dir+=x-1;
   lcd_enviar(LCD_COMANDO,0x80|dir);
}


void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_enviar(LCD_COMANDO,0x01);
                   delay_ms(2);
                   break;
     case '\n'   : lcd_gotoxy(1,2);               break;
     case '\b'   : lcd_enviar(LCD_COMANDO,0x10);  break;
     default     : lcd_enviar(LCD_DATO,c);        break;
   }
}


char lcd_getc( int x, int y) {
   char valor;

    lcd_gotoxy(x,y);

    lcd_rs = 1;
    valor = lcd_leer();
    lcd_rs = 0;

    return valor;
}

Al compilar me da el siguiente error.

Error 128 lcd2.c a #device required before this line.
quizas no agregue bien el lcd2.c al proyecto yo lo adicione en el create proyect junto al programa.

cualquier ayuda es bienvenida muchas gracias
Título: Re: problema programa LCD pic 16F84
Publicado por: Suky en 22 de Enero de 2009, 01:39:24
Yo lo compile quitando un 000 que aparece por ahi y me lo compilo bien. Crea un nuevo proyecto solo con el programa principal en una nueva carpeta, y el lcd2.c solo copialo en la carpeta del proyecto. Con la instruccion include<> el compilador lo agrega al proyecto.-
Aca te adjunto otra libreria para controlar LCD
Título: Re: problema programa LCD pic 16F84
Publicado por: fidodido18 en 29 de Enero de 2009, 18:19:14
Comprade no le de mas vuelta al asunto, ese es problema del compilador...

te lo digo porque me paso lo mismo, y pensé que yo era hasta bruto porque a todo el mundo le sale así  :?

Pero al final me di cuenta que si no estaba fallando yo, entonces tenia que ser el que compila.

Me bajé una versión mas reciente: 4.084 de csc compiler y lo trabajé directamente desde el PCWHD del programa y no lo integré con MAPLAB, y adiós problema!!  :-/

Me imagino que debes sentir frustración por no poder hacerlo, igual cuando yo intentaba, pero asi es la vida a veces jajaja

Título: Re: problema programa LCD pic 16F84
Publicado por: japifer_22 en 01 de Febrero de 2009, 16:59:09
hola bueno si quieres escribir hola en la LCD te comento que el compilador ya trae la libreria incorporada el programa quedaria asi:
#include <16f84.h>            //pic a utilizar         
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#use delay (clock=20000000)         //clock=20Mhz
#define use_portb_lcd TRUE         //definir portb lcd
#include<lcd.c>                  //libreria manejo lcd


///PROGRAMA
void main(void)
{
lcd_init();         //inicializa lcd

printf(lcd_putc,"hola.");     

}

bueno es lo que te entendi  de que querias escribir por pantalla hola buen oes como te escribi arribita ^^. la salida a esta LCD es el puerto B del pic.
saludos
Título: Re: problema programa LCD pic 16F84
Publicado por: japifer_22 en 01 de Febrero de 2009, 17:04:28
la conexion ees como te mensiono a continuacion

Conexiones:

//               B0 -> E  --> de la LCD
//               B1 -> RS --> de la LCD       
//               B2 -> RW --> de la LCD   
//               B4 -> D4 --> de la LCD     
//               B5 -> D5 --> de la LCD         
//               B6 -> D6 --> de la LCD
//               B7 -> D7 --> de la LCD


de todas formas aqui en el foro ahy millones de ejemplos de todo te mando un lick para que chequees algunas cosas

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

saludos