Como conectar varios lcd's

Hola chicos:

Me ha surgido un problemilla y me gustaria saber si alguno de vosotros me podria echar una mano.

Estoy intentando conectar varios LCD's al uC 8051 y no se como hacerlo. Se cómo conectar un solo LCD pero no se como podría hacerlo con varios. Además, el principal problema surge cuando lo que quiero es mostrar informaciónes distintas en cada uno de los LCD.
Me gustaría que si alguien tiene alguna idea o me puede asesorar un poquillo que lo haga. No quiero la solucion técnica pero si que agradeceria ideas acerca del modo en como solucionarlo.

Espero vuestras respuestas.

Un saludo a todos.
 
utiliza el pin /ENABLE del LCD tendra que usar una salida mas del micro para controlar los LCD

Saludos
 
hola capitanp:

Ante todo gracias por responderme y con esa rapidez. Bien lo del pin/Enable o chip/Enable ya lo habia pensado y veo que no voy por mal camino. En cuanto a lo otro...te refieres a que tendría que utilizar una salida salida del micro para cada lcd? es decir, una salida por LCD?
No se si te entendido bien,disculpa si no es asi.

Yo habia pensado que utilizando el chip/enable de los lcd's podría,utilizando una sola salida de datos del 8051 enviar la información que necesito a su correspondiente LCD.
Decidme si ésta o´pción es viable.

Necesito crear una red con muchos LCD's. Se os ocurre algún modelo que pudiera utilizar?

Otra duda me viene cuando...utilizando el mismo cable desde la salida del micro cuantos LCD's podría conectar?

UN saludo y Gracias.
 
Una opcion sería utilizar la salida en forma multiplexada es decir si tienes 4 bits estos te podrían funcionar para habilitar 16 lcd's, dependiendo del dato que se tenga en la salida del uC.

Saludos
 
Gracias Luis Eduardo por colaborar con tu respuesta.


Me ha parecido bastante interesante y he tomado nota de ella.

He estado pensando en la manera de conectar físicamente los lcd's. Podría utilizar un cable desde la salida del uC y a partir de él crear subramas que se distribuyeran a los distintos lcd's???

No se si me he explicado bien, si necesitais mas datos y preferiis que os pase un esquema de mi idea no me importaría hacerlo.

De verdad, muchas gracias por vuestro interes y colaboración.

Un saludo
 
Hola loktar:

Disculpa pero no habia leido tu respuesta.

Estoy estudiando el bus i2c porque nunca lo he utilizado y estoy mirando a ver como funciona.
Me podrías decir algo más acerca de los expansores? a que te refieres con expansores?

un saludo y muchas gracias a tí tambien.
 
Hola chicos:

He estado estudiando el bus i2c y me parece una muy buena solución para conectar los LCD's en serie sin tener problemas de independencia. Me gustaría que si alguien puede ayudar aportando algo de informaciónrmacíón acerca de como programar el micro y sus correspondientes registros para utilizar el bus i2c se lo agradecería.

Espero vuestras respuestas.
Un saludo y gracias
 
Bueno acá te dejo una librería qué saqué del libro "Microcontrolador PIC16F84" para controlar el Bus I2C. Sólo se usan las subrutinas I2C_EnviaStart, I2C_EnviaByte, I2C_LeeByte I2C_EnviaStop.

Código:
;**************************** Librería "BUS_I2C.INC" ************************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		[url]www.pic16f84a.com[/url]
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	===================================================================
;
; Estas subrutinas permiten realizar las tareas básicas de control del bus serie I2C, 
; por parte de un solo microcontrolador maestro.
;
; ZONA DE DATOS **********************************************************************
;
	CBLOCK
	I2C_ContadorBits				; Cuenta los bits a transmitir o a recibir.
	I2C_Dato						; Dato a transmitir o recibido.
	I2C_Flags						; Guarda la información del estado del bus I2C.
	ENDC

#DEFINE I2C_UltimoByteLeer	I2C_Flags,0
;    -  (I2C_UltimoByteLeer)=0, NO es el último byte a leer por el maestro.
;    -  (I2C_UltimoByteLeer)=1, SÍ es el último byte a leer por el maestro.

; La definición de las líneas SCL y SDA del bus I2C se puede cambiar según las
; necesidades del hardware.

#DEFINE SCL	PORTA,3					; Línea SCL del bus I2C.
#DEFINE SDA	PORTA,4					; Línea SDA del bus I2C.
;
; Subrutina "SDA_Bajo" ------------------------------------------------------------------
;
SDA_Bajo
	bsf		STATUS,RP0				; Configura la línea SDA como salida.
	bcf		SDA
	bcf		STATUS,RP0
	bcf		SDA						; SDA en bajo.
	return
;
; Subrutina "SDA_AltaImpedancia" --------------------------------------------------------
;
SDA_AltaImpedancia
	bsf		STATUS,RP0				; Configura la línea SDA entrada.
	bsf		SDA						; Lo pone en alta impedancia y, gracias a la
	bcf		STATUS,RP0				; Rp de esta línea, se mantiene a nivel alto.
	return
;
; Subrutina "SCL_Bajo" ------------------------------------------------------------------
;
SCL_Bajo
	bsf		STATUS,RP0
	bcf		SCL						; Configura la línea SCL como salida.
	bcf		STATUS,RP0
	bcf		SCL						; La línea de reloj SCL en bajo.
	return
;
; Subrutina "SCL_AltaImpedancia" --------------------------------------------------------
;
SCL_AltaImpedancia
	bsf		STATUS,RP0				; Configura la línea SCL entrada.
	bsf		SCL						; Lo pone en alta impedancia y, gracias a la Rp
	bcf		STATUS,RP0				; de esta línea, se mantiene a nivel alto.
SCL_EsperaNivelAlto
	btfss	SCL						; Si algún esclavo mantiene esta línea en bajo
	goto	SCL_EsperaNivelAlto		; hay que esperar.
	return
;
; Subrutina "I2C_EnviaStart" ------------------------------------------------------------
;
; Esta subrutina envía una condición de Start o inicio.
;
I2C_EnviaStart
	call	SDA_AltaImpedancia		; Línea SDA en alto.
	call	SCL_AltaImpedancia		; Línea SCL en alto.
	call	Retardo_4micros			; Tiempo tBUF del protocolo.
	call	SDA_Bajo				; Flanco de bajada de SDA mientras SCL está alto.
	call	Retardo_4micros			; Tiempo tHD;STA del protocolo.
	call	SCL_Bajo				; Flanco de bajada del reloj SCL.
	call	Retardo_4micros	
	return
;
; Subrutina "I2C_EnviaStop" -------------------------------------------------------------
;
; Esta subrutina envía un condición de Stop o parada.
;
I2C_EnviaStop
	call	SDA_Bajo
	call	SCL_AltaImpedancia		; Flanco de subida de SCL.
	call	Retardo_4micros			; Tiempo tSU;STO del protocolo.
	call	SDA_AltaImpedancia		; Flanco de subida de SDA.
	call	Retardo_4micros			; Tiempo tBUF del protocolo.
	return
;
; Subrutina "I2C_EnviaByte" -------------------------------------------------------------
;
; El microcontrolador maestro transmite un byte por el bus I2C, comenzando por el bit
; MSB. El byte a transmitir debe estar cargado previamente en el registro de trabajo W.
; De la subrutina ejecutada anteriormente I2C_EnviaStart o esta misma I2C_EnviaByte, 
; la línea SCL se debe encontrar a nivel bajo al menos durante 5 µs.
;
I2C_EnviaByte
	movwf	I2C_Dato				; Almacena el byte a transmitir.
	movlw	0x08					; A transmitir 8 bits.
	movwf	I2C_ContadorBits
I2C_EnviaBit
	rlf		I2C_Dato,F				; Chequea el bit, llevándolo previamente al Carry.
	btfsc	STATUS,C
	goto	I2C_EnviaUno
I2C_EnviaCero
	call	SDA_Bajo				; Si es "0" envía un nivel bajo.
	goto	I2C_FlancoSCL
I2C_EnviaUno
	call	SDA_AltaImpedancia		; Si es "1" lo activará a alto.
I2C_FlancoSCL
	call	SCL_AltaImpedancia		; Flanco de subida del SCL.
	call	Retardo_4micros			; Tiempo tHIGH del protocolo.
	call	SCL_Bajo				; Termina el semiperiodo positivo del reloj.
	call	Retardo_4micros			; Tiempo tHD;DAT del protocolo.
	decfsz	I2C_ContadorBits,F		; Lazo para los ocho bits.
	goto	I2C_EnviaBit
;
	call	SDA_AltaImpedancia		; Libera la línea de datos.
	call	SCL_AltaImpedancia		; Pulso en alto de reloj para que el esclavo
	call	Retardo_4micros			; pueda enviar el bit ACK.
	call	SCL_Bajo
	call	Retardo_4micros
	return
;
; Subrutina "I2C_LeeByte" ---------------------------------------------------------------
;
; El microcontrolador maestro lee un byte desde el esclavo conectado al bus I2C. El dato
; recibido se carga en el registro I2C_Dato y lo envía a la subrutina superior a través
; del registro W. Se empieza a leer por el bit de mayor peso MSB.
; De alguna de las subrutinas ejecutadas anteriormente I2C_EnviaStart, I2C_EnviaByte
; o esta misma I2C_LeeByte, la línea SCL lleva en bajo al menos 5 µs.

I2C_LeeByte
	movlw	0x08					; A recibir 8 bits.
	movwf	I2C_ContadorBits
	call	SDA_AltaImpedancia		; Deja libre la línea de datos.
I2C_LeeBit
	call	SCL_AltaImpedancia		; Flanco de subida del reloj.
	bcf		STATUS,C				; En principio supone que es "0".
	btfsc	SDA						; Lee el bit
	bsf		STATUS,C				; Si es "1" carga 1 en el Carry.
	rlf		I2C_Dato,F				; Lo introduce en el registro.
	call	SCL_Bajo				; Termina el semiperiodo positivo del reloj.
	call	Retardo_4micros			; Tiempo tHD;DAT del protocolo.
	decfsz	I2C_ContadorBits,F		; Lazo para los 8 bits.
	goto	I2C_LeeBit
;
; Chequea si este es el último byte a leer para enviar o no el bit de reconocimiento
; ACK en consecuencia.
;
	btfss 	I2C_UltimoByteLeer		; Si es el último, no debe enviar
									; el bit de reconocimiento ACK.
	call	SDA_Bajo				; Envía el bit de reconocimiento ACK
									; porque todavía no es el último byte a leer.
	call	SCL_AltaImpedancia		; Pulso en alto del SCL para transmitir el
	call	Retardo_4micros			; bit ACK de reconocimiento. Este es tHIGH.
	call	SCL_Bajo				; Pulso de bajada del SCL.
	call	Retardo_4micros
	movf	I2C_Dato,W				; El resultado se manda en el registro de
	return							; de trabajo W.
	
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		[url]www.pic16f84a.com[/url]
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	===================================================================
 
El expansor lo que hace es transformar al señal serie del bus I2C para sacarlos por 8 terminales. Osea el byte que vos transmitis en serie lo tenes en 8 pines, cada uno representadndo un bit disitnto del byte. Te invito a que leas sobre el PCF8574. El expansor puede tanto recibir como enviar bytes. Acá te dejo al librería de este para el PIC.

Código:
;**************************** Librería "PCF8574.INC" **********************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		[url]www.pic16f84a.com[/url]
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	===================================================================
;
; Estas subrutinas permiten realizar las tareas de manejo del expansor de bus I2C PCF8574
; que convierte un bus de 8 líneas paralelo a bus serie I2C y viceversa.
;
; Como es posible que haya más de un expansor en el mismo circuito, se deja a la subrutina
; de llamada a éstas que determine las direcciones de escritura y lectura mediante las
; etiquetas PCF8574_DIR_LECTURA y PCF8574_DIR_ESCRITURA, atendiendo a las
; características del hardware utilizado.
;
; ZONA DE DATOS **********************************************************************

	CBLOCK
	PCF8574_Dato					; Aquí guarda el resultado del dato leído o que
	ENDC							; se va a escribir.

; Subrutina "PCF8574_Lee" -------------------------------------------------------------
;
; Lee el periférico conectado al bus paralelo de 8 líneas del PCF8574 que actúa como
; entrada y el resultado lo proporciona en el registro de trabajo W.

PCF8574_Lee
	call	I2C_EnviaStart			; Envía la condición de Start.
	movlw	PCF8574_DIR_LECTURA		; Apunta al expansor de lectura.
	call	I2C_EnviaByte
	bsf		I2C_UltimoByteLeer
	call	I2C_LeeByte				; Lee el puerto.
	movwf	PCF8574_Dato			; Lo guarda en el registro correspondiente.
	call	I2C_EnviaStop			; Acaba de leer.
	movf	PCF8574_Dato,W			; Recupera el valor del dato leído.
	return

; Subrutina "PCF8574_Escribe" ----------------------------------------------------------
;
; Escribe en el periférico conectado bus paralelo de 8 líneas del expansor PCF8574 que
; actúa como salida, el dato que le llega por el registro de trabajo W. El dato escrito
; es recuperado finalmente en el registro W.
;
PCF8574_Escribe
	movwf	PCF8574_Dato			; Guarda el dato a escribir.
	call	I2C_EnviaStart			; Envia condición de Start.
	movlw	PCF8574_DIR_ESCRITURA	; Apunta al expansor que actúa como salida.
	call	I2C_EnviaByte
	movf	PCF8574_Dato,W			; Recupera el valor del dato a enviar.
	call	I2C_EnviaByte			; Envía el dato.
	call	I2C_EnviaStop			; Termina.
	movf	PCF8574_Dato,W			; Recupera el valor del dato escrito.
	return

;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		[url]www.pic16f84a.com[/url]
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	===================================================================

Esta librería necesita de la librería BUS_I2C.

Saludos, alguna duda decime.
 
asolerguna dijo:
Hola chicos:

He estado estudiando el bus i2c y me parece una muy buena solución para conectar los LCD's en serie sin tener problemas de independencia. Me gustaría que si alguien puede ayudar aportando algo de informaciónrmacíón acerca de como programar el micro y sus correspondientes registros para utilizar el bus i2c se lo agradecería.

Espero vuestras respuestas.
Un saludo y gracias

Aqui tienes una web dedicada a este bus inventado por philips. Seria una muy buena opcion puesto que asi aprenderias una cosa mas.
Por cierto si en lugar de un 51 de la casa philips utilizas uno de la casa ATMEL (que son muy bueno por cierto) deberias de usar el TWI (two wire interface) que es lo mismo pero con otro nombre.
 
hola amigos no se si aun este abierto este problema, pero si es asi les puedo mostrar una solucion, de hecho ya lo hice con un micro de motorola.

La idea es usar 8 bits de datos, 3 de control (R/W, enable, R/S) para mansar a los tres o N LCD´s
lo unico que tienes que hacer es habilitar uno a la vez, si quieres poner texto en el lcd0 pon el pin E0 a 1 (5v), esto lo debes hacer en tu programa

lo siento tengo que irme.
 
Atrás
Arriba