Autor Tema: lcd.h  (Leído 5453 veces)

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

Desconectado cristianmerz

  • PIC10
  • *
  • Mensajes: 8
lcd.h
« en: 28 de Abril de 2005, 01:34:00 »
Hola ¿Que tal?

Estoy armando por mi cuenta la placa PICDEV de Microchip y estoy realizando pruebas antes de arrancar con el 18F452, directamente con el 16F877 para realizar la prueba de cada parte de la placa.

El problema que tengo es que necesito la siguiente conectividad con el LCD:

PIC_D0 -> LCD_D4
PIC_D1 -> LCD_D5
PIC_D2 -> LCD_D6
PIC_D3 -> LCD_D7
PIC_D4 -> LCD_RS
PIC_D5 -> LCD_R/W
PIC_A5 -> LCD_E

El LCD es de 2x16.

La libreria lcd.c de CCS no la puedo configurar de esta forma....alguna persona me podria indicar si hay alguna libreria para el LCD que me permita configurar cada pin y asi darle esta configuración?

Desde ya muchas gracias.

Desconectado j_fernandez

  • PIC12
  • **
  • Mensajes: 89
RE: lcd.h
« Respuesta #1 en: 28 de Abril de 2005, 02:47:00 »
Hola, yo tengo una libreria lcd que puedes configurar los, pero el problema es que los datos se transmites por bus de 8 bits en vez de 4 como lo que tu pides.

Aqui te pego el codigo :


// 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
//
 Saltar a la segunda linea
//  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.

// poner los valores correspondientes en lcd2.h y quitar comentarios

#USE DELAY (CLOCK=4000000)

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


#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 "
" : lcd_gotoxy(1,2); break;
case "" : 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;
}





Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: lcd.h
« Respuesta #2 en: 28 de Abril de 2005, 07:19:00 »
El fichero de CCS lcd.c se puede modificar para adaptarlo a tus necesidades. Busca en Simuladores de circuitos o en Ejemplos para simular, hay varios ejemplos de LCDs con asignación de pines diferentes a CCS.

Un saludo

Desconectado j_fernandez

  • PIC12
  • **
  • Mensajes: 89
RE: lcd.h
« Respuesta #3 en: 28 de Abril de 2005, 08:44:00 »
Hola Pocher, donde dices que estan esos simuladores??? Yo lo más que he encontrado ha sido la libreria que he pegado arriba.

Un saludo

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: lcd.h
« Respuesta #4 en: 28 de Abril de 2005, 08:55:00 »
mira este, el unico problema que tiene, esq está ajustado para trabajar a 4Mhz, si utilizas otro reloj deberás ajustar los tiempos.
No utiliza la pata R/W (solo escribes...) por lo q deberas conectarla a masa.

//include LCD para CCS

// La ventaja de este codigo es que puedes trabajar si lo quieres con pines
// dispersos es decir no estas sujeto a la mitad de un puerto

// Registros de Puertos A
#define PORTC 0xf82 // Puerto A
#define TRISC 0xf94 // Tris A

// Definición de Puertos Pantalla LCD 40x20 Hitachi 44780
#bit lcd_en = PORTC.0
#bit tris_lcd_en = TRISC.0
#bit lcd_rs = PORTC.1
#bit tris_lcd_rs = TRISC.1
#bit lcd_db4 = PORTC.2
#bit tris_lcd_db4 = TRISC.2
#bit lcd_db5 = PORTC.3
#bit tris_lcd_db5 = TRISC.3
#bit lcd_db6 = PORTC.4
#bit tris_lcd_db6 = TRISC.4
#bit lcd_db7 = PORTC.5
#bit tris_lcd_db7 = TRISC.5

// lcd_init() Inicialización del LCD (debe utilizarse al principio,
// antes de trabajar con el LCD).
//
// lcd_putc(c) Imprime un caracter en el LCD.
//
// lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el LCD.
// (la esquina superior izquierda es 1,1)
//
// lcd_getc(x,y) Devuelve el caracter de la posicion x,y del LCD.
//
// void lcd_erase_line(x) Borra una cantidad de caracter hacia la derecha

// Conexion a la pantalla LCD 40x4
// RA0 <---> LCD DB4
// RA1 <---> LCD DB5
// RA2 <---> LCD DB6
// RA3 <---> LCD DB7
// RA5 <---> LCD ENABLE
// RA4 <---> LCD RS
//

#define LCD_DATO 1
#define LCD_INST 0

#define LCD_LINEA1 0x80 // Direccion de memoria para la 1 linea
#define LCD_LINEA2 0xc0 // Direccion de memoria para la 2 linea
#define LCD_LINEA3 0x94 // Direccion de memoria para la 3 linea
#define LCD_LINEA4 0xd4 // Direccion de memoria para la 4 linea



// 7 6 5 4 3 2 1 0
// Function Set 0b 0 0 1 B L F 0 0
// Bus size, B:0=4 bits, B:1=8 bits
// Line Number, L:0=1 Line, L:1=2 Lines
// Font size F:0=5x8, F:1=5x10
#define LCD_FUNCTION_SET 0b00101000 // Bus=4bit, Line=2 & Font=5x8

// 7 6 5 4 3 2 1 0
// Display/Cursor 0b 0 0 0 0 1 D U B
// Set Display on/off, D:0=off, D:1=on
// Underline cursor, U:0=off, U:1=on
// Blinking cursor, B:0=off, B:1=on
#define LCD_DISPLAY_CURSOR 0b00001100 // Display=on, Scroll=off, Blinkin=off

// 7 6 5 4 3 2 1 0
// Entry Mode 0b 0 0 0 0 0 1 M S
// Cursor direction, M:0=left, 1=right
// Display Scroll, S:0=no scroll, S:1=scroll
#define LCD_ENTRY_MODE 0b00000110 // Increment cursor, no disp shift

#define LCD_CLEAR_DISPLAY 0b00000001 // Clear Display

void lcd_set_write()
{
   tris_lcd_db4 = 0; //
   tris_lcd_db5 = 0; //
   tris_lcd_db6 = 0; //
   tris_lcd_db7 = 0; //---> Set PORTC RA0-RA3 mode output
}

void lcd_send_nibble(int8 n)
{
   if (bit_test(n,0)) //
      lcd_db4 = 1; //
   else //
      lcd_db4 = 0; //
   if (bit_test(n,1)) //
      lcd_db5 = 1; //
   else //
      lcd_db5 = 0; //
   if (bit_test(n,2)) //
      lcd_db6 = 1; //
   else //
      lcd_db6 = 0; //
   if (bit_test(n,3)) //
      lcd_db7 = 1; //
   else //
      lcd_db7 = 0; //---> Set data nibble
   delay_cycles(1); // nop
   lcd_en = 1; // Habilita LCD Enable __
   delay_us(2); // Espera 2 uSeg. | |
   lcd_en = 0; // Desabilita LCD Enable __| |__
}

void lcd_send_byte (int1 select, int8 n)
{
   lcd_rs = 0; // Modo de instruccion
   delay_us(10);
   lcd_rs = select; // Escoje entre RS=0 : Instruccion & RS=1 : Data
   delay_cycles(1); // nop                                                       // 5 original
   lcd_en = 0; // Desabilita LCD Eneable
   lcd_send_nibble(n >> 4); // Envia los datos superiores MSB
   lcd_send_nibble(n); // Envia los datos inferiores LSB
}

void lcd_init()
{
   int8 i, count=0;
   lcd_set_write(); // Prepara el puerto DB4-DB7 como salida
   tris_lcd_en = 0; //
   tris_lcd_rs = 0; //---> Set PORTC RA0, RA1 & RA2 mode output
   lcd_en = 0; //
   lcd_rs = 0; //---> Clear LCD_EN, LCD_RW & LCD_RS
   delay_ms(15);
//   retry:
   for(i=1; i<=3; ++i)
   {
      lcd_send_nibble(0b0011); // 8 bit mode 3 times
      delay_ms(5);
   }
   lcd_send_nibble(0b0010); // 4 bit mode
   lcd_send_byte(LCD_INST, LCD_FUNCTION_SET); // Function Set
   lcd_send_byte(LCD_INST, LCD_DISPLAY_CURSOR); // Display Cursor
   lcd_send_byte(LCD_INST, LCD_ENTRY_MODE); // Entry Mode
   lcd_send_byte(LCD_INST, LCD_CLEAR_DISPLAY); // Clear Display
}

void lcd_gotoxy(int8 x, int8 y)
{
   int8 const address[4]={LCD_LINEA1,LCD_LINEA2,LCD_LINEA3,LCD_LINEA4};
   int8 pos;
   pos=address[y-1]+(x-1);
   lcd_send_byte (LCD_INST, pos);
}

void lcd_putc(char c)
{
   switch (c)
   {
     case "f"   : lcd_send_byte(0,1);    //Limpia la pantalla
                   delay_ms(2);
                   break;
     case "
"   : lcd_gotoxy(1,2);       //Coloca puntero en 1ª posicion de la 2ª línea
                   break;
     case ""   : lcd_send_byte(LCD_INST,0x10); //Retrocede una posición el cursor
                   break;
     case "   "   : lcd_send_byte(LCD_INST,0x14); //Avanza una posición el cursor
                   break;
     case ""   : lcd_send_byte(LCD_INST,0x18); //Retrocede una posición la pantalla visible
                   break;
     case "v"   : lcd_send_byte(LCD_INST,0x1C); //Avanza una posición la pantalla visible
                   break;
     default     : lcd_send_byte(LCD_DATO,c); //Envía caracter a DDRAM,
                   break;                 //Si es una tira, los envía todos uno a uno
   }
}

void lcd_clear()
{
   lcd_send_byte(LCD_INST,0x01);
}

void lcd_home()
{
   lcd_send_byte(LCD_INST,0x02);
}

void lcd_erase_line(int8 x)
{
   int8 i;
   for(i=1;i<=x;++i)
   {
      lcd_send_byte(LCD_DATO,32);
   }
}

Desconectado cristianmerz

  • PIC10
  • *
  • Mensajes: 8
RE: lcd.h
« Respuesta #5 en: 28 de Abril de 2005, 09:35:00 »
Escrito originalmente por J1M
mira este, el unico problema que tiene, esq está ajustado para trabajar a 4Mhz, si utilizas otro reloj deberás ajustar los tiempos.
No utiliza la pata R/W (solo escribes...) por lo q deberas conectarla a masa.



El problema que no la puedo poner a masa porque es un kit de desarrollo, si lo modifico lo rompo...porque el test del LCD es para saber si esta andando correctamente esta etapa de la placa y asi poder continuar con el resto del armado.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: lcd.h
« Respuesta #6 en: 28 de Abril de 2005, 09:58:00 »
Son dos subforos de este FORO. Estan en la pantalla de entrada casi al final.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: lcd.h
« Respuesta #7 en: 28 de Abril de 2005, 12:55:00 »
Aprobecho el hilo para preguntar mi caso Rebotado tengo el LCD conectado como ponen los comentarios de esta lcd.h modificada, a la cual le he cambiado de orden para poner rs, rw, y e ... en ese orden respectivamente. Pero no si quiera me inicializa el LCD:


// As defined in the following structure the pin connection is as follows:
//     D0  rs
//     D1  rw
//     D2  enable
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


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


#if defined(__PCH__)
#if defined use_portb_lcd
   #byte lcd = 0xF81                   // This puts the entire structure
#else
   #byte lcd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_portb_lcd
   #byte lcd = 6                  // on to port B (at address 6)
#else
   #byte lcd = 8                 // on to port D (at address 8)
#endif
#endif

#if defined use_portb_lcd
   #define set_tris_lcd(x) set_tris_b(x)
#else
   #define set_tris_lcd(x) set_tris_d(x)
#endif
Si juegas contra el mejor, pierdes como los demás.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: lcd.h
« Respuesta #8 en: 28 de Abril de 2005, 13:00:00 »
cristianmerz pon la pata a masa desde Soft, es decir, averigua cual es el pin correspondiente a la pata R/W y lo pones a "0"... y ya está..

saludos

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: lcd.h
« Respuesta #9 en: 28 de Abril de 2005, 14:13:00 »
Trasteando un poco e hechado andar el LCD, y probando este programita tonto:

  main()
  {
  float x=0,b=100,c=2.2;
  lcd_init();
  x=b/c;
  printf(lcd_putc,"fResultado = %f", x);
  }

Tengo un par de dudas:
    1) Lo vi en un ejemplo, pero ¿el porque de "f" en el printf?
    2) E intendado ponerle modificadores de formato, quiero decir, que por ejemplo solo se muestre unos cuantos decimales y no los 6 que creo que son del "float".
Lo intente así: "%6.7f" - Que tenia entendido que era, muestra al menos una cadena de 6 caracteres, pero no mas de 7. ¿Estoy equibocado? ¿Alguien sabe como seria?
Si juegas contra el mejor, pierdes como los demás.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: lcd.h
« Respuesta #10 en: 28 de Abril de 2005, 23:59:00 »
El f borra la pantalla. Hay otros caracteres de control más o menos standard, pero no siempre están todos implementados en lcd.c . El f suele venir.

El formato %6.7f te representa un número float con 6 dígitos enteros y 7 decimales.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: lcd.h
« Respuesta #11 en: 29 de Abril de 2005, 03:37:00 »
Muchisimas gracias nocturno, siento estar tan pesado pero ya al menos le voi cojiendo el rollo a C que es mucho mas funcional que ASM (o eso me esta pareciendo).
Voi a probar lo que me dijiste y ahora edito el post segun lo que surja Muchas risas Vacilando

Editando: bueno esto va como la seda, además e trasteado la libreria un poco para adaptarla a mi LCD 4x20 y que funcionen los /n para todas las lineas. Muchas gracias a todo por la ayuda Rebotado
Si juegas contra el mejor, pierdes como los demás.