Autor Tema: Duda programaciòn LCD LM016L con PIC 16F84A  (Leído 3672 veces)

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

Desconectado Enzo201

  • PIC10
  • *
  • Mensajes: 3
Duda programaciòn LCD LM016L con PIC 16F84A
« en: 07 de Noviembre de 2016, 12:36:58 »
Hola tengo una duda con ese programa que adjunte, es un ejemplo, funciona, ahora tengo que cambiar ese programa para que en el LCD se pueda visualizar el mensaje en la primera y segunda linea.
En el ejemplo de programa lo que escribe es Hola en binario. Yo pense que para que el mensaje que ponga se pueda visualizar en la segunda linea solo tenia que cambiar el N=1 que es para que se habilite la segunda linea, pero no fue asì, aunque cambie eso no logro conseguir escribir en la segunda linea, pongo la cantidad de letras necesarias y tampoco, no se que tengo que hacer para que el mensaje se pueda visualizar en la segunda linea del LCD.
La ultima foto es de como hago las conexiones en el PROTEUS para probar el programa.
Ayuda por favor.
« Última modificación: 08 de Noviembre de 2016, 15:16:59 por Enzo201 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda programaciòn LCD LM016L con PIC 16F84A
« Respuesta #1 en: 07 de Noviembre de 2016, 13:05:57 »
Cuando escribis en el LCD, lo primero que haces es enviar una instruccion que fija donde esta ubicado en la memoria. La linea 0 ( o primera linea) Comienza desde la posicion de memoria 0x00. Luego de setear ese valor comienzo a escribir y solo va incrementando la posicion de memoria y guardando los datos.

Si yo quisiera escribir en la segunda linea, deberia seleccionar la posicion de memoria 0x40, que es donde comienza la segunda linea.

Teniendo lo anterior en cuenta, observa en tu programa donde ocurre estas cosas

La instruccion para el cambio de direccion es 1xxx xxxx , siendo x la direccion de memoria. Es decir si quisiera comenzar desde el primer caracter de la linea 1 deberia enviar 1000 0000 , si quiero comenzar en la 3er columna de la primer fila 1000 0011, y finalmente si quiero comenzar en la segunda fila 1100 0000.

Desconectado Enzo201

  • PIC10
  • *
  • Mensajes: 3
Re:Duda programaciòn LCD LM016L con PIC 16F84A
« Respuesta #2 en: 07 de Noviembre de 2016, 14:49:48 »
La verdad no entendí lo que me dijiste, de estoy entiendo muy poco, te agradecería mucho si pudieras hacerlo por mí ya que recién empiezo en esto.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda programaciòn LCD LM016L con PIC 16F84A
« Respuesta #3 en: 07 de Noviembre de 2016, 15:31:52 »
Deberias empezar a leer el codigo. Lo voy a describir aca lo que hace tu programa.

A pesar que el datasheet habla de que debe enviarse varias veces el Function Set, veo que lo envia una sola ves. (Por que los primeros no son validos)
ACA DATASHEET DEL DRIVER:
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf

Tu programa,
-inicializa los modulos
 Lo que tenes en "Inicio"
- Inicializa los datos a enviar, es decir le pone valores en tu caso el "HOLA", 1 registro por letra
 Lo que tenes en "TABLA"
-Inicializa el LCD:
 Esto consta de enviar la instruccion de "Clear Display"
 Envia la instruccion Function Set - Aca debo determinar que se trata de 2 filas, es decir N = 1.
 Envia la instruccion de Display control. Que maneja si se ve el cursor, blink y el LCD.
 Envia la instruccion del Modo de funcionamiento, esto le dice al LCD que cuando envie un dato incremente o decremente la posicion de memoria interna.
 Envia la instruccion para que comienze en la direccion 0x00 ( DDRAM SELECTED )
 Y luego procede a enviar 1 por uno los valores almacenados en DATO1, DATO2, DATO3 y DATO4.
 Finalmente ejecuta la instruccion RETURN HOME del LCD ( 0000 0010 que esta en tu segunda hoja) y vuelve a escribir la palabra HOLA en la memoria del LCD. Todo esto se repite por siempre


Cuando digo instrucciones al LCD son los datos que le pones. Te sugiero que busques HD44780 y ahi vas a tener la tabla de instrucciones.

-----------------------------------------------------

Si quisieras agregar una segunda fila, primero deberias cambiarlo en el Function Set, es deicr poner el 1.
Y luego deberias cargar (DDRAM SELECTED) con 0x1100 0000, en ves de 0x1000 0000.
Con esto el primer HOLA va a estar escrito en la segunda fila. Luego al enviarse la instruccion RETURN HOME ( esto hace que la memoria a escribirse en el display empieze del 0x00) lograrias que se escriba un HOLA en la primer fila, pero como nada cambio las posiciones de memoria de la segunda, entonces te deberia quedar asi el LCD:

--------------------
HOLA
HOLA
--------------------

Desconectado Enzo201

  • PIC10
  • *
  • Mensajes: 3
Re:Duda programaciòn LCD LM016L con PIC 16F84A
« Respuesta #4 en: 07 de Noviembre de 2016, 16:53:16 »
Me funciono perfecto como dices el programa ademas me ayudaste a comprender más el programa gracias, pero creo explique mal mi problema, lo que quiero es escribir 2 palabras diferentes una palabra para la primera linea y luego otra para la segunda linea, ya agregue los datos necesarios en "TABLA" y sus variables tambien, tambien puse el N=1, y cuando cargo el DDRAM SELECTED con 0x1100 0000 como me aclaraste antes empieza a escribir desde la segunda linea a la primera, y repite solo 4 letras que escribi antes, te dejo lo que hice así no te confundo más.

INDF EQU 00H
STATUS EQU 03H
FSR EQU 04H
PORTA EQU 05H
PORTB EQU 06H
TRISA EQU 85H
TRISB EQU 86H
DATO1 EQU 10H
DATO2 EQU 11H
DATO3 EQU 12H
DATO4 EQU 13H
DATO5 EQU 14H
DATO6 EQU 15H
DATO7 EQU 16H
DATO8 EQU 17H
DATO9 EQU 18H
DATO10 EQU 19H
DATO11 EQU 1AH
DATO12 EQU 1BH
DATO13 EQU 1CH
DATO14 EQU 1DH
DATO15 EQU 1EH
DATO16 EQU 1FH
DATO17 EQU 2AH
DATO18 EQU 2BH
DATO19 EQU 2CH
DATO20 EQU 2DH
DATO21 EQU 2EH
CONT1 EQU 2FH
CONT2 EQU 3AH
ADDCONT EQU 3BH
ORG 00H
GOTO INICIO
ORG 10H

INICIO

BSF STATUS,5
CLRF TRISB
CLRF TRISA
BCF STATUS,5

TABLA
MOVLW .69
MOVWF DATO1
MOVLW .78
MOVWF DATO2
MOVLW .90
MOVWF DATO3
MOVLW .79
MOVWF DATO4
MOVLW .32
MOVWF DATO5
MOVLW .66
MOVWF DATO6
MOVLW .65
MOVWF DATO7
MOVLW .76
MOVWF DATO8
MOVLW .68
MOVWF DATO9
MOVLW .79
MOVWF DATO10
MOVLW .67
MOVWF DATO11
MOVLW .69
MOVWF DATO12
MOVLW .68
MOVWF DATO13
MOVLW .65
MOVWF DATO14
MOVLW .83
MOVWF DATO15
MOVLW .63
MOVWF DATO16
MOVLW .69
MOVWF DATO17
MOVLW .68
MOVWF DATO18
MOVLW .65
MOVWF DATO19
MOVLW .83
MOVWF DATO20
MOVLW .63
MOVWF DATO21

;CLEAR DISPLAY
MOVLW B'00000001'
MOVWF PORTB
CLRF PORTA
CALL ENABLE

;FUNCTION SET
;FORMAT B'0 0 1 DL N F * *'
MOVLW B'00111000'
MOVWF PORTB
CALL ENABLE

;DISPLAY ON/OFF CONTROL
;FORMAT B'0 0 0 0 1 D C B'
MOVLW B'00001100'
MOVWF PORTB
CALL ENABLE

;ENTRY MODE SET
;FORMAT B'000001 I/D S'
CLRF PORTA
MOVLW B'00000110'
MOVWF PORTB
CALL ENABLE

DDRAM
CLRF PORTA
MOVLW B'11000000'
MOVWF PORTB
CALL ENABLE

;WRITE DATA TO DD RAM
WRITING:
MOVLW .4
MOVWF ADDCONT
MOVLW 10H
MOVWF FSR
ADDCHAR
MOVF INDF,W
MOVWF PORTB
MOVLW B'00001' ; WRITE DATA
MOVWF PORTA
CALL ENABLE
INCF FSR,1
DECFSZ ADDCONT,1
GOTO ADDCHAR

;RETURN HOME
MOVLW B'00000010'
MOVWF PORTB
CLRF PORTA
CALL ENABLE
GOTO WRITING




ENABLE
BSF PORTA,2
ADDLW .200
MOVWF CONT2
CICLO5
ADDLW .200
MOVWF CONT1
CICLO3
DECFSZ CONT1,1
GOTO CICLO3
CICLO4
DECFSZ CONT2,1
GOTO CICLO5
BCF PORTA,2
ADDLW .200
MOVWF CONT1
CICLO6
ADDLW .250
MOVWF CONT2
CICLO2
DECFSZ CONT2,1
GOTO CICLO2
CICLO1
DECFSZ CONT1,1
GOTO CICLO6
RETURN
FIN:
END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda programaciòn LCD LM016L con PIC 16F84A
« Respuesta #5 en: 09 de Noviembre de 2016, 08:06:53 »
Disculpa que no vi que habias respondido. La idea para que escriba en la segunda linea seria:

- Envio la instruccion para poner la direccion de la DDRAM en 0x00
- Escribo los datos que quiero poner en la primer linea
- Envio la instruccion para poner la direccion de la DDRAM en 0x40
- Escribo los datos que quiero poner en la segunda linea
- Aca me quedo encerrado en un Loop. Es decir:

LOOP:
     NOP
     GOTO LOOP

Y eso es todo. De la forma que lo tenes es un poco pesado hacerlo (cargando valor a valor en los registros). Ya que lo mejor es trabajar con tablas cuando es asi. Pero por ahora con que lo hagas de esta forma esta bien.

Otra de las cosas que simplificaria hacer el codigo es incluir el archivo .inc de tu micro. Microchip provee el .inc donde estan los EQU de todos los registros y bits de cada microcontrolador. Esto te permite usar:

STATUS, Z

Sin necesidad de que vos definas STATUS ni Z