Autor Tema: lcd a 16f84  (Leído 3947 veces)

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

Desconectado chingolo

  • PIC10
  • *
  • Mensajes: 17
lcd a 16f84
« en: 02 de Marzo de 2008, 18:07:25 »
perdonen mi ignorancia, de a poco voy aprendiendo gracias a los maestros que hay aca!!!
mi pregunta es la siguiente, para usar la libreria lcd.c la conexion debe ser E a RB0, RS a RB1, RW a RB2.; se puede cambiar para ello habra que tocar la libreria para que E sea RA2, RS sea RA0, RW a RA1? es posible? que debo hacer?
debo usar un lcd y un teclado 4x4 deberia usar otro pic que no sea el 16f84 pero me pidieron que use ese.
    gracias.
gracias!!! estoy dando mis primeros pasos, pido paciencia.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: lcd a 16f84
« Respuesta #1 en: 02 de Marzo de 2008, 18:32:23 »
perdonen mi ignorancia, de a poco voy aprendiendo gracias a los maestros que hay aca!!!
mi pregunta es la siguiente, para usar la libreria lcd.c la conexion debe ser E a RB0, RS a RB1, RW a RB2.; se puede cambiar para ello habra que tocar la libreria para que E sea RA2, RS sea RA0, RW a RA1? es posible? que debo hacer?
debo usar un lcd y un teclado 4x4 deberia usar otro pic que no sea el 16f84 pero me pidieron que use ese.
    gracias.

Hola

Debes ser un poquito más específico para que se te pueda ayudar...

- ¿Qué compilador usas?
- ¿La lcd.c es la de ese compilador?

Suerte!

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: lcd a 16f84
« Respuesta #2 en: 02 de Marzo de 2008, 18:50:51 »
Busca en este foro la librería Flex_lcd que te permite definir los pines como quieras.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado chingolo

  • PIC10
  • *
  • Mensajes: 17
Re: lcd a 16f84
« Respuesta #3 en: 02 de Marzo de 2008, 20:11:32 »
el compilador es el ccs.
probare con la flex, pero desearia saber si se puede hacer lo pedido.
gracias!!! estoy dando mis primeros pasos, pido paciencia.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: lcd a 16f84
« Respuesta #4 en: 02 de Marzo de 2008, 20:17:30 »
No no se puede, esa librería está diseñada para conectar el lcd de esa forma, por eso se creo la librería Flex_lcd.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: lcd a 16f84
« Respuesta #5 en: 02 de Marzo de 2008, 20:27:35 »
Con la lcd.c de ccs solo puedes cambiar del puerto b al puerto d las terminales, tu pic no tiene puerto d. Dale una leída a la flex_lcd.  :mrgreen:

Desconectado chingolo

  • PIC10
  • *
  • Mensajes: 17
Re: lcd a 16f84
« Respuesta #6 en: 02 de Marzo de 2008, 20:55:57 »
me decidi hacerlo con la flex, me hice un programita pero no puedo compilarlo me salta error en lcd_db4
output_bit(LCD_DB4, !!(nibble & 1));
 output_bit(LCD_DB5, !!(nibble & 2));
 output_bit(LCD_DB6, !!(nibble & 4));
 output_bit(LCD_DB7, !!(nibble & 8));



  el programita:
#include <16f84.h>

#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <flex_lcd.c>
#fuses XT,NOWDT,NOPUT
#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS    PIN_A1
#define LCD_RW    PIN_A2
#define LCD_E     PIN_A0
#use fast_io(A)
#use fast_io(B)

main() {

   //0set_tris_a(0x18);   // 00011000
   //set_tris_b(0x00);
   flex_lcd_init();   // Comandos de inicialización del LCD.


    lcd_putc(" hola");

}
gracias!!! estoy dando mis primeros pasos, pido paciencia.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: lcd a 16f84
« Respuesta #7 en: 02 de Marzo de 2008, 20:58:21 »
Está mal el orden, el orden correcto es:

#include <16f84.h>

#use delay(clock=4000000)

#define use_portb_lcd TRUE
#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7
#define LCD_RS     PIN_A1
#define LCD_RW    PIN_A2
#define LCD_E      PIN_A0
#include <flex_lcd.c>

#fuses XT,NOWDT,NOPUT

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

main() {

   //0set_tris_a(0x18);   // 00011000
   //set_tris_b(0x00);
   flex_lcd_init();   // Comandos de inicialización del LCD.


    lcd_putc(" hola");

}

Un saludo

PD.: Había un error, faltaban de colocar de forma correcta las líneas de control.
« Última modificación: 02 de Marzo de 2008, 23:53:45 por jfh900 »
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado chingolo

  • PIC10
  • *
  • Mensajes: 17
Re: lcd a 16f84
« Respuesta #8 en: 02 de Marzo de 2008, 23:38:52 »
la probe y no se porque tira error al compilar la libreria flex_lcd en
output_high(LCD_E)

quje puede ser?
gracias!!! estoy dando mis primeros pasos, pido paciencia.

Desconectado julian47

  • PIC10
  • *
  • Mensajes: 18
Re: lcd a 16f84
« Respuesta #9 en: 12 de Marzo de 2008, 07:35:44 »
Hola amigos, soy nuevo por estos foros, tengo una pregunta, teneis alguno, algun programa para controlar un LCD 2x16 con un PIC (me da igual cual, aunque prefiero el 16F84), lo que quiero hacer es:

cuando le llegue al pic un codigo Binario de 4 bit a las patillas, que el saque  un mensaje segun el cogigo que le llegue, solo eso.
imagino que necesitare un eeprom , por favor ayudarme porque encuentro muchos circuitos pero ninguno me permite hacer lo que yo quiero.

un saludo amigos,.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: lcd a 16f84
« Respuesta #10 en: 12 de Marzo de 2008, 07:55:14 »
Hola Julian!

Antes que nada, te cuento que acababa de escribirte todo esto en un hilo que antes que pueda dar "enter" desaparecio del foro  :( . Asi que .....aqui vamos otra vez (espero que no borres este, ya que esta respuesta puede ser util a alguien mas)   :lol:

CCS provee una libreria que se encarga de gestionar el LCD. Por defecto, si mal no recuerdo, asume que el LCD esta conectado a pines del port D. El 16F84 no posee ese puerto (dicho sea de paso...quizas te convenga usar un micro mas actual, ese ya es obsoleto).

Bien, a pesar de eso, es posible usar otro puerto. Supongamos que tenemos un display conectado de la siguiente manera:

    * PORT.B2 -> enable
    * PORT.B3 -> rs
    * PORT.B4 -> D4
    * PORT.B5 -> D5
    * PORT.B6 -> D6
    * PORT.B7 -> D7

Debes abrir LCD.C y buscar este trozo de codigo:

Código: [Seleccionar]
struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;

y cambiarlo por este:

Código: [Seleccionar]
struct lcd_pin_map {
  BOOLEAN unused1; // RB0
  BOOLEAN unused2; // RB1
  BOOLEAN enable;  // RB2
  BOOLEAN rs;      // RB3
  int data : 4;    // RB4-RB7
} lcd;

Como en lugar del puerto D estamos usando el puerto B, asi que hay que quitar el comentario a la linea

Código: [Seleccionar]
// #define use_portb_lcd TRUE
para que quede

Código: [Seleccionar]
#define use_portb_lcd TRUE  //LCD conectado al puerto b.
Y como no estamos usando la línea RW del LCD, debemos quitar las dos tres lineas de código en la que se hace referencia a ella. El listado siguente corresponde al archivo LCD.C con todas las modificaciones mencionadas, más algunas modificaciones en los #INCLUDE del principio, que no tienen sentido mantener ya que al personalizar el archivo nunca se van a dar algunas de las condiciones contempladas alli. También hemos quitado el código de la función lcd_getc( x, y) ya que al estar RW conectado de forma permanente a GND, será imposible leer caracteres del display:

Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////
// LCD.C modificada por uControl.com.ar                                   
///////////////////////////////////////////////////////////////////////////
//     B0 
//     B1 
//     B2  E
//     B3  RS
//     B4  D4
//     B5  D5
//     B6  D6
//     B7  D7
//   (Sin 'RW')
//
// Funciones soportadas:
//                         lcd_init()
//                         lcd_gotoxy( BYTE col, BYTE fila)
//                         lcd_putc( char c)
//                              \f  Clear display                             
//                              \n  Go to start of second line               
//                              \b  Move back one position
//
///////////////////////////////////////////////////////////////////////////
#define use_portb_lcd TRUE  //LCD conectado al puerto b.
//
struct lcd_pin_map {
   BOOLEAN unused1; // RB0
   BOOLEAN unused2; // RB1
   BOOLEAN enable;  // RB2
   BOOLEAN rs;      // RB3
   int data : 4;    // RB4-RB7
} lcd;
//
#byte lcd = 0xF81  // Direccion de la estructura "lcd".
#byte lcd = 6      // Direccion del puerto B.
#define set_tris_lcd(x) set_tris_b(x)
#define lcd_type 2           // Tipo de LCD: 0=5x7, 1=5x10, 2=2 lineas
#define lcd_line_two 0x40    // Dirección de la LCD RAM para la 2da. linea
//
//Defino la cadena de inicializacion del LCD.
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
//
//Configuro el estado de cada pin para lectura y escritura:
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // Escribir.
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // Leer.
//
//Funciones:
BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}
//
void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}
//
void lcd_send_byte( BYTE address, BYTE n ) {
      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}
//
void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}
//
void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;
   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
     address+=x-1;
     lcd_send_byte(0,0x80|address);
}
//
void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}


Creo que con eso tienes solucionado el tema de la libreria. Para ver como usar las funciones de LCD.C, puedes mirar este articulito (que es de donde copie el texto de arriba ;) )

Solo te queda la tarea de enviar a la pantalla el contenido de esos 4 bits que quieres mostrar.

Saludos!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: lcd a 16f84
« Respuesta #11 en: 12 de Marzo de 2008, 10:46:44 »
Lo borré yo porque el post estaba duplicado. Siento haber puteado tú respuesta, Ariel.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: lcd a 16f84
« Respuesta #12 en: 12 de Marzo de 2008, 10:54:05 »
Lo borré yo porque el post estaba duplicado. Siento haber puteado tú respuesta, Ariel.
No problem: la rescaté dandole "atras" varias veces al navegador. :)
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado julian47

  • PIC10
  • *
  • Mensajes: 18
Re: lcd a 16f84
« Respuesta #13 en: 23 de Marzo de 2008, 09:48:40 »
Hola, gracias por tu respuesta en el foro de TODOPIC, ahora mismo estoy usando el programa en EMSANBLADOR que te adjunto, el problema que tengo es que NECESITO MUCHOS MENSAJES y cuando le meto mas de 4 me da error en compilación por falta de espacio, me podrías decir como puedo meter MENSAJES FIJOS en una Eeprom externa tipo 24LC…. Y luego de alguna forma llamarlos para mostrarlos en el lcd según mi código de 4 bit?

Espero su ayuda y gracias.


 

anything