Autor Tema: Programacion de un LCD 4x20  (Leído 7925 veces)

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

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Programacion de un LCD 4x20
« en: 20 de Septiembre de 2008, 21:18:33 »
Hola amigos,

Ya llevo un rato (bastante) sin cooperar en el foro, una disculpa.

Por ahora estoy haciendo un LCD de caracteres de 4x20 y estoy un poco confundido. Se supone que el modelo es un JHD-204ASTNLED, según la tienda dnde lo compré (AG Electrónica en México) y en la parte posterior del display dice PCM2004F-FL-YBS. Supongo que son similares o equivalentes, ya que todo depende del controlador que lleven dentro y he aquí otra duda: lleva el S6A0069 o el KS066 o ambos también son equivalentes?

Bueno eso por un lado. He tratado de programarlo, inicializarlo y escribir la letra A pero nada. Estoy usando un PIC16F76 con un cristal de 8MHz y las conexiones de los 16 pines son como sigue:

1 - GND
2 - 5V
3 - Sin conexion
4 - RS - RA0
5 - R/W - RA1
6 - E - RA2
7 - 14 - DB0-DB7 - RB0-RB7
15 - Pot 10K con respecto a 5V
16 - LED(-) - RA3

Creo que con las conexiones no he de tener problema. El código que estoy probando para escribir la letra A es el siguiente:

   list p=16f76
   include "p16f76.inc"
   __CONFIG _PWRTE_OFF & _HS_OSC & _WDT_OFF

#DEFINE LCD_RS      PORTA, 0      ;LCD Register Select
#DEFINE LCD_RW      PORTA, 1      ;LCD Read/Write
#DEFINE LCD_E      PORTA, 2      ;LCD Enable
#DEFINE LCD_LED      PORTA, 3      ;LCD Reset
#DEFINE LCD_DAT      PORTB

J      equ   0x20

;*****************************************************************************************
;INPUT/OUTPUT PORTS CONFIGURATION
;*****************************************************************************************
      org      0x00      ;Program start
      clrf   STATUS
      bsf      STATUS,RP0   ;Change to Bank 1
       movlw   0x00       ;Set w = 00000000
       movwf   PORTA        ;Set PORTA & PORTB as outputs
       movwf   PORTB
      bcf      STATUS,RP0   ;Change to Bank 0

;*****************************************************************************************
;Main program
;*****************************************************************************************
      clrf   PORTA      ;PORTA = w = 00000000
      clrf   PORTB      ;PORTB = w = 00000000

      call   lcd_cmd
      movlw   0x38      ;Function Set
      call   lcd_data

      call   lcd_cmd
      movlw   0x0C      ;Display ON/OFF Control
      call   lcd_data

;Clear Display routine
      movlw   0x50      ;80 charachters 20x4
      movwf   J
loopk1   call   lcd_cmd
      movlw   0x20      ;ASCII space
      call   lcd_data
      decfsz  J, 1      ;J=J-1, jump if J=0
        goto    loopk1
      clrwdt

      call   lcd_cmd
      movlw   0x07      ;Entry Mode Set
      call   lcd_data

      call   lcd_cmd
      movlw   0x02      ;Return Home
      call   lcd_data

      movlw   0x41      ;Entry Mode Set
      call   lcd_data
      bsf      LCD_RS      ;RS=1
      bsf      LCD_RW      ;Activate Read operation RW=1

;*****************************************************************************************
;Subroutines
;*****************************************************************************************
;Send Command to LCD Subroutine
;*****************************************************************************************
lcd_cmd:
   bcf      LCD_RS      ;RS=0
   bsf      LCD_E      ;E=1
   bcf      LCD_RW      ;Activate Write operation RW=0

   return
      
;*****************************************************************************************
;Send Data to LCD Subroutine
;*****************************************************************************************
lcd_data:
   bsf      LCD_RS      ;RS=1
   bcf      LCD_RW      ;Activate Write operation RW=0
   movwf   LCD_DAT      ;Place data in PORTB
   bsf      LCD_RW      ;Activate Read operation RW=1

   return

   end

Claro que no escribe nada, por esto es que estoy pidiendo la ayuda del foro. He buscado temas similares pero no he tenido suerte. Ayuda por favor.

Saludos

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Programacion de un LCD 4x20
« Respuesta #1 en: 20 de Septiembre de 2008, 23:17:55 »
Bueno, sigo trabajando en esto y aquí algunos cambios:

Pin 3 del Display al cursor de un pot de 10K con un extremo a 5V y el otro a GND

Pin 15 de Display a una resistencia de 10ohms y de ahi a 5V

Nuevo código:

   list p=16f76
   include "p16f76.inc"
   __CONFIG _PWRTE_OFF & _HS_OSC & _WDT_OFF

#DEFINE LCD_RS      PORTA, 0      ;LCD Register Select
#DEFINE LCD_RW      PORTA, 1      ;LCD Read/Write
#DEFINE LCD_E      PORTA, 2      ;LCD Enable
#DEFINE LCD_LED      PORTA, 3      ;LCD Reset
#DEFINE LCD_DAT      PORTB

J      equ   0x20
K      equ   0x21
PDel0   equ   0x22
PDel1   equ   0x23
PDel2   equ   0x24
PDel3   equ   0x25
PDel4   equ   0x26

;*****************************************************************************************
;INPUT/OUTPUT PORTS CONFIGURATION
;*****************************************************************************************
      org      0x00      ;Program start
      clrf   STATUS
      bsf      STATUS,RP0   ;Change to Bank 1
       movlw   0x00       ;Set w = 00000000
       movwf   PORTA        ;Set PORTA & PORTB as outputs
       movwf   PORTB
      bcf      STATUS,RP0   ;Change to Bank 0

;*****************************************************************************************
;Main program
;*****************************************************************************************
      clrf   PORTA      ;PORTA = w = 00000000
      clrf   PORTB      ;PORTB = w = 00000000

      movlw   .89         ;32 mseg Delay
      movwf   J
      movlw   .143
      movwf   K
      call   Delay_ms
      movlw   0x38      ;Function Set
      movwf   LCD_DAT      ;Place data in PORTB
      call   lcd_cmd

      call   Delay_40us
      movlw   0x0C      ;Display ON/OFF Control
      movwf   LCD_DAT      ;Place data in PORTB
      call   lcd_cmd

      call   Delay_40us
      movlw   0x01      ;Clear Display
      movwf   LCD_DAT      ;Place data in PORTB
      call   lcd_cmd

      call   Delay_2ms
      movlw   0x06      ;Entry Mode Set
      movwf   LCD_DAT      ;Place data in PORTB
      call   lcd_cmd

      movlw   .110      ;50 mseg Delay
      movwf   J
      movlw   .181
      movwf   K
      call   Delay_ms

      movlw   0x4F      ;Letra "O"
      movwf   LCD_DAT      ;Place data in PORTB
      call   lcd_cmd

      movlw   .156      ;100 mseg Delay
      movwf   J
      movlw   .213
      movwf   K
      call   Delay_ms

      movlw   0x4B      ;Letra "K"
      movwf   LCD_DAT      ;Place data in PORTB
      call   lcd_cmd

;*****************************************************************************************
;Subroutines
;*****************************************************************************************
;Send Command to LCD Subroutine
;*****************************************************************************************
lcd_cmd:
   bcf      LCD_E      ;E=1
   bcf      LCD_RW      ;Activate Write operation RW=0
   bcf      LCD_RS      ;RS=0

   bsf      LCD_E      ;E=1
   bcf      LCD_E      ;E=0

   return
      
;*****************************************************************************************
;Send Data to LCD Subroutine
;*****************************************************************************************
lcd_data:
   bcf      LCD_E      ;E=0
   bcf      LCD_RW      ;Activate Write operation RW=0
   bsf      LCD_RS      ;RS=1

   bsf      LCD_E      ;E=1
   bcf      LCD_E      ;E=0

   return

;*****************************************************************************************
;Delay 40 useg subroutine
;*****************************************************************************************
Delay_40us:
      movlw   .18       ; 1 set numero de repeticion
        movwf   PDel0     ; 1 |
PLoop0  clrwdt            ; 1 clear watchdog
        decfsz   PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto   PLoop0    ; 2 no, loop
PDelL1  goto   PDelL2         ; 2 ciclos delay
PDelL2  clrwdt            ; 1 ciclo delay
        return            ; 2+2 Fin.

;*****************************************************************************************
;Delay 2 mseg subroutine
;*****************************************************************************************
Delay_2ms:
      movlw     .5        ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .159      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        return              ; 2+2 Fin.

;*****************************************************************************************
;Delay mseg subroutine
;*****************************************************************************************
Delay_ms:
      movlw   J       ; 1 set numero de repeticion  (B)
        movwf   PDel3     ; 1 |
PLoop3  movlw   K      ; 1 set numero de repeticion  (A)
        movwf   PDel4     ; 1 |
PLoop4  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz   PDel4, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto   PLoop2    ; 2 no, loop
        decfsz   PDel3, 1  ; 1 + (1) es el tiempo 0  ? (B)
        goto   PLoop3    ; 2 no, loop
PDelL5  goto   PDelL6         ; 2 ciclos delay
PDelL6  goto   PDelL7         ; 2 ciclos delay
PDelL7 
        return            ; 2+2 Fin.
   end

Se supone que quería poner OK en el display pero el único cambio que tuve es que me presenta las 4 lineas del display algo tenues con el pot al max para el contraste pero de letras nada....

Alguna idea???? Alguna ayuda????

Saudos

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Programacion de un LCD 4x20
« Respuesta #2 en: 21 de Septiembre de 2008, 00:04:40 »
estan ajustadas las rutinas de retardo al cristal que estas utilizando? o lo has aprovechado de algun programa que has visto por ahí?


Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Programacion de un LCD 4x20
« Respuesta #3 en: 21 de Septiembre de 2008, 00:09:03 »
Sí, están ajustadas a 8MHz. Desde hace tiempo uso un programita que genera el código

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Programacion de un LCD 4x20
« Respuesta #4 en: 17 de Octubre de 2008, 16:57:39 »
Y bueno, sigo intentando sin lograr escibir nada en el LCD....

... que mala cosa... con tantos proyectos interesantes e ingeniosos y yo trabado con un LCD.....

Una pregunta Para el montaje del PIC16F76 con cristal de 8MHz como debe ser el OSC en el programa? HS_OSC o XT_OSC

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Programacion de un LCD 4x20
« Respuesta #5 en: 17 de Octubre de 2008, 21:16:50 »
hola amigo
con respecto al cristal:
xt-->entre 100khz y 4Mhz
hs-->entre 4Mhz y 20Mhz

Un saludo

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Programacion de un LCD 4x20
« Respuesta #6 en: 17 de Octubre de 2008, 23:22:07 »
esta parte no esta mal?

     movlw   .156      ;100 mseg Delay
      movwf   J
      movlw   .213
      movwf   K
      call   Delay_ms

      movlw   0x4B      ;Letra "K"
      movwf   LCD_DAT      ;Place data in PORTB
      call   lcd_cmd

;ACA DEBERIA IR UN GOTO $ SINO EL PROGRAMA SE VA DE LARGO

;*****************************************************************************************
;Subroutines
;*****************************************************************************************
;Send Command to LCD Subroutine
;*****************************************************************************************
lcd_cmd:
   bcf      LCD_E      ;E=1
   bcf      LCD_RW      ;Activate Write operation RW=0
   bcf      LCD_RS      ;RS=0

puede verificar eso, derepente salta mas detalles que a simple vista no los detecta , ni el compilador  :?



//-------------------------------------------------------------------------------------------------
otro detalle curioso

1 - GND
2 - 5V
3 - Sin conexion
4 - RS - RA0
5 - R/W - RA1
6 - E - RA2
7 - 14 - DB0-DB7 - RB0-RB7
15 - Pot 10K con respecto a 5V
16 - LED(-) - RA3

seguro de esa configuracion? podrias colgar el datasheet de tu lcdp ara verificarlo.  :o
« Última modificación: 17 de Octubre de 2008, 23:25:04 por micro_cadaver »
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Programacion de un LCD 4x20
« Respuesta #7 en: 17 de Octubre de 2008, 23:53:42 »
encontre la falla   :-/
      movlw   0x4F      ;Letra "O"
      movwf   LCD_DAT      ;Place data in PORTB
      call   lcd_data

      movlw   .156      ;100 mseg Delay
      movwf   J
      movlw   .213
      movwf   K
      call   Delay_ms

      movlw   0x4B      ;Letra "K"
      movwf   LCD_DAT      ;Place data in PORTB
      call   lcd_data

      goto $

te olvidastes de usar:     call   lcd_data

a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Programacion de un LCD 4x20
« Respuesta #8 en: 21 de Octubre de 2008, 13:59:18 »
Hola amigos,

Como decia anteriormente, le he hecho algunos cambios al programa. Adjunto el archivo asm más reciente al cual le añadí unas rutinas de un ejemplo que encontré en otro post pero nada, no muestra nada en el lcd.

En cuanto a la configuración de los pines el 15 lo tengo con una resistencia de 10ohms a +5v y el 16 lo puse directo a GND pero nada que se ilumina el backlight. Incluso lo intente al reves 15 a (-) y 16 a (+) como decia en alguno que encontré que posiblemente estaban invertidos pero nada.

Espero seguir contando con su apoyo para hacer jalar a este bicho que ya se puso muy bronco.....

Gracias nuevamente

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Programacion de un LCD 4x20
« Respuesta #9 en: 21 de Octubre de 2008, 14:01:07 »
y como no podía poner todos los archivos juntos en un solo post, aquí esta el de la configuración de mi lcd

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Programacion de un LCD 4x20
« Respuesta #10 en: 21 de Octubre de 2008, 19:26:31 »
Hola amigo
lo estas simulando con algun programa como proteus
o por el contrario lo estas haciendo fisicamente.
si lo estas haciendo fisicamente.
primero verifica que el programa funciona bien mediante un simulador proteus por ejemplo.
despues fijate bien si la asignacion de RW,E, y RS y el bus de datos es el que pusiste en el programa.
si le pusiste una resistencia de 10k o 10 homios prueba a ponerle un potenciometro de ese valor para poder modificar el comtraste
a lo mejor te esta mostrando pero tienes muy bajo el contraste y no lo ves.

si no usas el RW ponle a masa o te hara cosas raras.


Un saludo


Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Programacion de un LCD 4x20
« Respuesta #11 en: 22 de Octubre de 2008, 14:29:49 »
yo lo simule y puse mi observacion para que funcione el codigo. saludos
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Programacion de un LCD 4x20
« Respuesta #12 en: 23 de Octubre de 2008, 00:05:12 »
 :-/ :-/ :-/
 
Bueeeeno..... finalmente logramos hacerlo funcionar..... con la ayuda del foro

Adjunto el archivo probado físicamente con un display LCD 4x20 a 8 bits con un controlador S6A0069 o equivalente gobernado por un PIC16F76 con cristal de 8MHz.

Las fallas eran básicamente de tiempos en las subrutinas Delay además de NO haber puesto las direcciones de la DDRAM donde empezaria a escribir.

Por último, podrían decirme como grabo un dato en la memoria interna del PIC y leerla? para hacer una prueba mostrando el dato en el LCD (de ser posible en asm).

Muchas gracias nuevamente