Autor Tema: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)  (Leído 12908 veces)

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

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Librería para manejo LCD compatible con Hitachi 44780. Dispone de la posibilidad de trabajar en modo de 4-bits con R/W siempre y cuando se seleccionen pines tolerables a 5V para dispositivos de 3.3V o sin R/W. También implementa el manejo del LCD mediante 3 pines y un registro de desplazamiento (4094, 74164, ect) todos estos modos se selecciona con 2 definiciones (USE_RW y USE_3PINES).
Tiene implementada las siguientes funciones:
•   Open_LCD(Tipo)
       o   Tipo = LINEA_5X7,LINEA_5X10 o LINEAS_5X7
•   BusyLCD();
•   WriteCmdLCD(cmd)
•   putcLCD(data)  .Con reconocimiento de caracteres especiales ‘\f’,’\n’
•   putsLCD(*data)
•   GotoxyLCD(x,y)

Ejemplo:
Modo 4 bits con R/W:
Modo 3 pines y registro de desplazamiento:

Modificación de funciones de bajo nivel de la librería stdio.h para re-direccionar salida de datos de printf.
Podemos utilizar la función printf para formatear datos y enviar por puerto UART, SPI, CAN, I2C (Caso especial) y LCD entre otros ejemplos. Una forma fácil que encontré fue la siguiente:
 
Agregar una variable externa a la función write.c (…\Microchip\MPLAB C30\src\pic30) __OUT_PER que seleccionará que periférico utilizar para la salida de datos. Esta variable la definimos en nuestro archivo principal y allí controlaremos su valor.
En el archivo write.c solo hacemos un switch para seleccionar los periféricos de salida de datos manteniendo la original sin hacer cambios mayores:

Código: C
  1. extern int __OUT_PER;
  2. switch(__OUT_PER){
  3.                         case 0: // UART
  4.                                 while ((ustatus->TRMT) ==0);
  5.                                         *txreg = *(char*)buffer++;
  6.                         break;
  7.                         case 1: // LCD
  8.                                 WriteDataLCD(*(char*)buffer++);
  9.                         break;
  10.                         case 2: // SPI
  11.                         break;
  12.                         case 3: // CAN
  13.                         break;
  14.                 }

También debemos agregar la definición de la función externa utilizada, por ejemplo para el caso del LCD:
Código: C
  1. extern void WriteDataLCD(char data);
Y no debemos olvidarnos de agregar el archivo write.c al proyecto para que sea re-compilado y efectivizar los cambios.

Quedando la librería con la modificación para usar printf en el envío de datos al LCD:

Código: C
  1. #include <p24fj64ga002.h>
  2. /* ** *********************************************************************************** ** */
  3. _CONFIG2(IESO_OFF & WUTSEL_LEG & FNOSC_PRI & FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS);
  4. _CONFIG1(JTAGEN_OFF & BKBUG_OFF & FWDTEN_OFF);
  5. /* ** *********************************************************************************** ** */
  6. //#define FCY 10000000UL
  7. #include "LCD_C30.h"
  8. #include <stdio.h>
  9.  
  10. #define LCD_rev 1.0
  11.  
  12. int __OUT_PER=1;
  13. /* ** *********************************************************************************** ** */
  14. main(void){
  15.  
  16.         OpenLCD(LINEAS_5X7);
  17.  
  18.         printf("Probando LCD\n%C30        v:%1.1f",LCD_rev);
  19.  
  20.         while(1){}
  21. }


Saludos!
No contesto mensajes privados, las consultas en el foro


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #2 en: 13 de Junio de 2010, 12:48:36 »
Ahora que la veo la usaré, muchas gracias por compartirlo suky :-/ :-/ :-/
.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #3 en: 13 de Junio de 2010, 17:54:27 »
Excelente aporte Suky, francamente contigo alucino.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #4 en: 13 de Junio de 2010, 19:56:38 »
Grande Suky!!!  :-/ y gracias como siempre por compartir. ;-)
          Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #5 en: 14 de Junio de 2010, 05:29:19 »
me da errores con las funciones delay. De hecho no están definidas en ningún sitio, sólo se incluye el fichero libpic30.h que contiene la declaración pero no la definición de la función delay. ¿a que se pueden deber estos errores?

..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x2): In function `BusyLCD':
D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:40: undefined reference to `__delay_ms'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x2a): In function `WriteCmdLCD':
D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:75: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x3a):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:81: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x54):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:94: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x64):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:100: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x76): In function `OpenLCD':
D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:110: undefined reference to `__delay_ms'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x8c):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:145: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0xac):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:159: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0xbc):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:165: undefined reference to `__delay_ms'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0xc2):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:167: undefined reference to `__delay_ms'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0xe0):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:177: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0xee):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:182: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x148): In function `WriteDataLCD':
D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:230: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x158):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:236: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x176):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:250: undefined reference to `__delay_us'
..\..\..\..\Fuentes\dspic30f4011\cad\obj\LCD_C30.o(.libperi+0x186):D:\PIC\Fuentes\dspic30f4011\cad\LCD_C30.c:256: more undefined references to `__delay_us'

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #6 en: 14 de Junio de 2010, 12:41:19 »
Leé el final de la siguiente respuesta, seguramente se debe a eso. Tambien puede ser que los archivos fuente de la libreria están comprimidos, busca un comprimido con libpic30 o algo así.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado irukza

  • PIC12
  • **
  • Mensajes: 87
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #7 en: 17 de Junio de 2010, 20:54:35 »
Que bueno, dificil creer que el compilador no traiga este tipo de librerias!  :5]
Gracias por compartir!!!

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #8 en: 05 de Julio de 2010, 11:50:40 »
Hola suky estaba probando tu librería pero tengo los mismos inconvenientes que black_flower, me llama la atención que al utilizar los delays en el .c principal no generan errores pero si al estar utilizados en las librería  :(. Nos faltara algún seteo extra del compilador o algo más? 
LAS MALVINAS SON ARGENTINAS!

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #9 en: 05 de Julio de 2010, 15:07:27 »
fiuuu ya esta solucionado  :).... tenía un despiole de direcciones de las librerías, .h y demás cosas. No me quedo otra que hacer el proyecto al estilo "ejemplo de microchip" cada cosita en una carpetita y todo bien organizado  :?
LAS MALVINAS SON ARGENTINAS!

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #10 en: 21 de Julio de 2010, 17:30:15 »
Tengo otra consulta.... cuando muestro más de un dato por el LCD me salen algo así:   259 |||259 |||310 , esas ||| no se de donde salen :shock:. Al dato lo muestro uno por uno es decir printf(%u, dato0), printf(%u, dato1), printf(%u, dato2) no es por antojo es que forma parte de un bucle  :mrgreen: .

Saludos!
LAS MALVINAS SON ARGENTINAS!

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #11 en: 21 de Julio de 2010, 17:55:25 »
Tengo otra consulta.... cuando muestro más de un dato por el LCD me salen algo así:   259 |||259 |||310 , esas ||| no se de donde salen :shock:. Al dato lo muestro uno por uno es decir printf(%u, dato0), printf(%u, dato1), printf(%u, dato2) no es por antojo es que forma parte de un bucle  :mrgreen: .

Saludos!

 :shock: Puedes hacerle un debbug para determinar de donde provienen??
No contesto mensajes privados, las consultas en el foro

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #12 en: 22 de Julio de 2010, 15:41:56 »
 :( no me lo permite MPLAB  :cry:...

Código: [Seleccionar]
Found PICkit 2 - Operating System Version 2.32.0
PICkit 2 Settings: Using target power always.
PK2Error0023:  Target Vdd measured at   4.99V which is outside the programmable range of this device (  3.00V -   3.50V)
PICkit 2 Ready

Found PICkit 2 - Operating System Version 2.32.0
PK2Error0023:  Target Vdd measured at   4.99V which is outside the programmable range of this device (  3.00V -   3.50V)
PICkit 2 Ready

y no encuentro forma de obviar ese check Vdd en MPLAB...
LAS MALVINAS SON ARGENTINAS!

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #13 en: 22 de Julio de 2010, 16:03:03 »
Y en proteus? En el hardware se hace muy lenta la tarea de hacer un debug  :?

Se me ocurre que la función printf agrega esos datos, porque la librería no hace más que enviar el dato que se le cargue.  :undecided:

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Flex_LCD_C30 (4-bits con o sin R/W; 3 pines más registro desplazamiento)
« Respuesta #14 en: 22 de Julio de 2010, 18:34:34 »
Tengo un problema con proteus, yo estoy utilizando un 33fj128gp802 y proteus llega al 33fj16gp304. Con un 33FJ16GP304 según proteus funcionaría bien (aunque yo desconfío) y en un 33fj128gp802 en la realidad se siguen notando los |||.
LAS MALVINAS SON ARGENTINAS!


 

anything