Autor Tema: LCD 16x2 con PCF8574 en Assembler  (Leído 3516 veces)

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

Desconectado eb7gav

  • PIC10
  • *
  • Mensajes: 1
LCD 16x2 con PCF8574 en Assembler
« en: 25 de Enero de 2013, 13:13:47 »
Hola, tengo un pequeño gran problema, estoy intentando hacer funcionar un LCD de 16x2 con un pcf8574 y un pic 16f628, el cual he creado correctamente la rutina de comunicacion, a traves del bus i2c.
Os cuento, si monto un expansor en una placa de pruebas con sus correspondientes led en cada bit, funcionan de maravilla, el problema es que la rutina que tengo que crear para el lcd, me esta resultando imposible, no consigo que me funcione nada, las conexiones al lcd son las siguientes:


PIN   PCF8574   >>  LCD

         P0                    RS
         P1                    RW
         P2                    E
         P3                    RETROILUMINACION
         P4                    D4
         P5                    D5
         P6                    D6
         P7                    D7

Todo ello esta correcto y funcionando, como base he cogido la libreria del libro microcontralor 16f84 y la he modificado con el fin de hacerla funcionar con el bus i2c

os pego el trozo principal de la libreria, ya que el resto son rutinas que llaman a la rutina LCD_EscribeLCD.

Las direcciones del Expansor se encuentran el el programa principal, y como digo lo que es el expansor funciona correctamente
         

   CBLOCK
   LCD_Dato
   LCD_GuardaDato
   LCD_GuardaTRISB
   LCD_Auxiliar1
   LCD_Auxiliar2
   LCD_BusDatos
   ENDC

LCD_CaracteresPorLinea   EQU   .16         ; Número de caracteres por línea de la pantalla.

#DEFINE  LCD_PinRS      LCD_BusDatos,0
#DEFINE  LCD_PinRW      LCD_BusDatos,1
#DEFINE  LCD_PinEnable   LCD_BusDatos,2
#DEFINE    LCD_ILUMINA   LCD_BusDatos,3


; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
   BCF      LCD_PinRW
   BCF      LCD_PinEnable
   BCF      LCD_PinRS
   call   Retardo_20ms
   call   Retardo_1s
   movlw   b'00110000'   
   CALL   PCF8574_Escribe
;   call   LCD_EscribeLCD         ; Escribe el dato en el LCD.
   call   Retardo_5ms   
   movlw   b'00110000'   
;   call   LCD_EscribeLCD
   CALL   PCF8574_Escribe
   call   Retardo_200micros
   movlw   b'00110000'   
;   call   LCD_EscribeLCD
   CALL   PCF8574_Escribe
   call   Retardo_20micros      ; Este retardo es necesario para simular en PROTEUS.
   movlw   b'00100000'            ; Interface de 4 bits.
;   call   LCD_EscribeLCD
   CALL   PCF8574_Escribe
   call   Retardo_20micros      ; Este retardo es necesario para simular en PROTEUS.

; Ahora configura el resto de los parámetros:

   call   LCD_2Lineas4Bits5x7      ; LCD de 2 líneas y caracteres de 5x7 puntos.
   call   LCD_Borra            ; Pantalla encendida y limpia. Cursor al principio
   call   LCD_CursorOFF         ; de la línea 1. Cursor apagado.
   call   LCD_CursorIncr         ; Cursor en modo incrementar.
   return

; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.

LCD_EscribeLCD
   andlw   b'11110000'            ; Se queda con el nibble alto del dato que es el
   movwf   LCD_Dato            ; que hay que enviar y lo guarda.
   movf   LCD_BusDatos,W         ; Lee la información actual de la parte baja
   andlw   b'00001111'            ; del Puerto B, que no se debe alterar.
   iorwf   LCD_Dato,F            ; Enviará la parte alta del dato de entrada
                           ; y en la parte baja lo que había antes.
   movf   LCD_Dato,W            ; Recupera el dato a enviar.
   movwf   LCD_BusDatos         ; Envía el dato al módulo LCD.
   bsf      LCD_PinEnable         ; Permite funcionamiento del LCD mediante un pequeño
   MOVF   LCD_BusDatos,W
   CALL   PCF8574_Escribe
   MOVF   LCD_BusDatos,W
   CALL   PCF8574_Escribe
   bcf      LCD_PinEnable         ; pulso y termina impidiendo el funcionamiento del LCD.
   MOVF   LCD_BusDatos,W
   CALL   PCF8574_Escribe
   return

solo me queda enviar bien los comandos y datos hacia el lcd, manejando a tiempo sus pines.

por favor es importante, si alguien sabe del tema o conoce alguna rutina contacten conmigo.

muchas gracias


Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: LCD 16x2 con PCF8574 en Assembler
« Respuesta #1 en: 26 de Enero de 2013, 09:21:18 »
hola eb7gav.aqui tienes un ejemplo de funcionamiento para enviar un texto largo a una lcd en modo de 4bit.

pero como estas haciendo una conversion con un bus 12c.no se estas respetando los tiempos de espera de envio de comandos a la LCD.
asi que no se si te funcionara.

en el modo 4bit hay un problema con el Flag Busy .este no salta como en el modo 8bit.asi que la temporizacion tienes que hacerla por tu cuenta.
y no testando el Flag Busy.almenos es lo que creo recordar.aunque no se si lo solucione.todo esta en el ejemplo.

PD: has simulado tu circuito en el PROTEUS?
Montando mi primera impresora 3D (Raprep Prusa i3)


 

anything