Autor Tema: Leer datos de un LCD  (Leído 6814 veces)

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

Desconectado JohnnyFritanga

  • PIC10
  • *
  • Mensajes: 4
Leer datos de un LCD
« en: 30 de Enero de 2006, 02:59:00 »
Hola, necesito leer desde un LCD el texto que haya escrito anteriormente, para poder guardarlo en una memoria EEPROM. A ver si alguien tiene alguna subrutina para hacerlo o puede orientarme un poco.

Gracias Sonrisa

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Leer datos de un LCD
« Respuesta #1 en: 30 de Enero de 2006, 05:47:00 »
Buenas!!!¿que lenguaje de programacion usas? ¿que compilador?, si programas en c con el CCS, mirate sus librerias, concretamente la lcd.c (es para una lcd tipo lm016) donde hay estan las funciones para la lectura del contenido de la lcd....

Suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado JohnnyFritanga

  • PIC10
  • *
  • Mensajes: 4
RE: Leer datos de un LCD
« Respuesta #2 en: 30 de Enero de 2006, 06:42:00 »
Gracias por responder.. es un proyecto para clase y tengo que programar en ensamblador con el MPLAB, a ver si sabes como hacerlo... He buscado por todos los sitios pero no consigo que me funcione.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Leer datos de un LCD
« Respuesta #3 en: 30 de Enero de 2006, 07:01:00 »
Escrito originalmente por JohnnyFritanga
Hola, necesito leer desde un LCD el texto que haya escrito anteriormente, para poder guardarlo en una memoria EEPROM. A ver si alguien tiene alguna subrutina para hacerlo o puede orientarme un poco.

Gracias Sonrisa


Amigo, los LCD tiene un comando de "lectura".

Le pasas como parametro la posicion de memoria a leer y te devuelve el byte ubicado en dicha posición.

Es muy similar a enviar un dato, solo que debes luego poner los pines como entrada para leer la respuesta.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado JohnnyFritanga

  • PIC10
  • *
  • Mensajes: 4
RE: Leer datos de un LCD
« Respuesta #4 en: 01 de Febrero de 2006, 03:08:00 »
Hola de nuevo, sigo sin conseguirlo. He encontrado una subrutina para hacerlo, pero a mi me lee siempre el codigo 0x40. El codigo es el siguiente:

LCD_leer
   bcf   LCD_PinRS      ;
   bcf   LCD_PinRW
   call   Retardo_20ms
   clrf OPTION_REG
   movlw b"01000000"
   call LCD_EnviaComando
   bsf   STATUS,RP0      
   movlw 0ffh
   movwf TRISB
   bcf   STATUS,RP0
   
   bcf   LCD_PinRS      
   bcf   LCD_PinEnable
   bcf   LCD_PinRW
   
   bsf   LCD_PinRW
   bsf   LCD_PinEnable
   call   Retardo_20ms
            
   movf PORTB,W
   movwf Teclmos
   call Grabar_Letra
   sleep


Si alguien encuentra algun error o detalle por el que pueda fallar me seria de gran ayuda. Muchas gracias...

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Leer datos de un LCD
« Respuesta #5 en: 01 de Febrero de 2006, 09:28:00 »
JohnnyFritanga puedes explicar que son todas esas contantes? postear un esquemático o como es el pinout de tu circuito? Que valores toman esas constantes? etc.


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado JohnnyFritanga

  • PIC10
  • *
  • Mensajes: 4
RE: Leer datos de un LCD
« Respuesta #6 en: 01 de Febrero de 2006, 10:19:00 »
Saludos otra vez... voy a explicar algunas cosas a ver si me puedes ayudar.

LCD_Leer es simplemente el nombre de la subrutina que quiero hacer.

Los pines RA0, RA1 y RA2 de mi pic16F84A van unidos a las lineas RS, R/W y E del LCD en este orden. Las 8 lineas de datos del LCD van conectadas al PORTB del pic.

clrf OPTION_REG: esta instruccion la puse por si tenian algo que ver las resistencias internas de pull-up, pero no se si sera necesario hacerlo.

LCD_EnviaComando es una subrutina que ya he probado que funciona correctamente. Lo que hace es enviar el dato presente en el acumulador al PIC, poniendo los pines RS y R/W a 0. Con esta instruccion pretendia apuntar a la posicion del LCD que queria leer.

Luego configuro el PORTB como entradas, para poder leer del LCD.

movf PORTB,W
movwf Teclmos
call Grabar_Letra

Aqui intento leer el dato y guardarlo en un registro (Teclmos). No se si esto se hace asi... La subrutina Grabar_Letra guarda el dato en el acumulado en una memoria EEPROM, lo hago para comprobar si he leido el dato correctamente puesto que esta grabacion ya esta comprobada.

El problema es que siempre me lee este dato:  b"01000000"o cualquier otro que coloque en esa linea, y no se por que...

Creo que eso es todo... a ver si podeis tu o cualquier otro echarme una mano...

Muchas gracias Sonrisa

Desconectado faypert

  • PIC10
  • *
  • Mensajes: 6
RE: Leer datos de un LCD
« Respuesta #7 en: 06 de Febrero de 2006, 14:33:00 »
LCD 2x16
 
 AQUI LE MANDO UN PERFIL DEL  LCD 2X16 OJALA QUE LES SIRVA DE ALGO
TEORIA
 Descripción: La pantalla de cristal liquido o LCD (Liquid Crystal Display) es un dispositivo µControlado de visualización grafico para la presentación de caracteres, símbolos o incluso dibujos (en algunos modelos), es este caso  
 
 
dispone de 2 filas de 16 caracteres cada una y cada carácter dispone de una matriz de 5x7 puntos (pixels), aunque los hay de otro número de filas y caracteres. Este dispositivo esta gobernado internamente por un microcontrolador Hitachi 44780 y regula todos los parámetros de presentación, este modelo es el mas comúnmente usado y esta información se basará en el manejo de este u otro LCD compatible.

Caracteristicas principales:
 -Pantalla de caracteres ASCII, además de los caracteres Kanji y Griegos.
 -Desplazamiento de los caracteres hacia la izquierda o la derecha.
 -Proporciona la dirección de la posición absoluta o relativa del caracter.
 -Memoria de 40 caracteres por línea de pantalla.
 -Movimiento del cursor y cambio de su aspecto.
 -Permite que el usuario pueda programar 8 caracteres.
 -Conexión a un procesador usando un interfaz de 4 u 8 bits

Funcionamiento: Para comunicarse con la pantalla LCD podemos hacerlo por medio de sus patitas de entrada de dos maneras posibles, con bus de 4 bits o con bus de 8 bits, este ultimo es el que explicare y la rutina también será para este. En la siguiente figura vemos las dos maneras posibles de conexionar el LCD con un pic16F84.

 

Conexionado con bus de 4 bits



Conexionado con bus de 8 bits

Como puede apreciarse el control de contraste se realiza al dividir la alimentación de 5V con una resistencia variable de 10K.

Las líneas de datos son triestado, esto indica que cuando el LCD no esta habilitado sus entradas y salidas pasan a alta impedancia.

Descripción de pines:

PIN Nº SIMBOLO DESCRIPCION
1 Vss Tierra de alimentación GND
2 Vdd Alimentación de +5V CC
3 Vo Contraste del cristal liquido. ( 0 a +5V )
4 RS Selección del registro de control/registro de datos:

         RS=0 Selección registro de control

         RS=1 Selección registro de datos
 
5 R/W Señal de lectura/escritura:

         R/W=0 Escritura (Write)

         R/W=1 Lectura (Read)
 
6 E Habilitación del modulo:

         E=0 Módulo desconectado

         E=1 Módulo conectado
 
7-14 D0-D7 Bus de datos bidireccional.

 

 


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

JUEGOS DE INSTRUCCIONES:

Estas son las instrucciones para el control del modulo LCD

Hitachi 44780 o compatible.

 

 CLEAR DISPLAY                                                                              

Borra el módulo LCD y coloca el cursor en la primera posición

(dirección 0). Pone el bit I/D a 1 por defecto.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 0 1

Tiempo de ejecución: 1.64mS

 

 HOME                                                                                              

Coloca el cursor en la posición de inicio (dirección 0) y hace que el display comience a desplazarse desde la posición original. El contenido de la memoria RAM de datos de visualización (DD RAM) permanece invariable. La dirección de la memoria RAM de datos para la visualización (DD RAM) es puesta a 0.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 1 X

Tiempo de ejecución: 1.64mS

 

 ENTRY MODE SET                                                                            

Establece la dirección de movimiento del cursor y especifica si la visualización se va desplazando a la siguiente posición de la pantalla o no. Estas operaciones se ejecutan durante la lectura o escritura de la DD RAM o CG RAM. Para visualizar normalmente poner el bit S=0.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 1 I/D S

Tiempo de ejecución: 40µS

 

 DISPLAY ON/OFF CONTROL                                                            

Activa o desactiva poniendo en ON/OFF tanto al display (D) como al cursor (C) y se establece si este último debe o no parpadear (B).

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 1 D C B

Tiempo de ejecución: 40µS

 

 CURSOR OR DISPLAY SHIFT                                                            

Mueve el cursor y desplaza el display sin cambiar el contenido de la memoria de datos de visualización DD RAM.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 1 S/C R/L X X

Tiempo de ejecución: 40µS

 

 FUNCTION SET                                                                                

Establece el tamaño de interfase con el bus de datos (DL), número de líneas del display (N) y tipo de carácter (F)

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 DL N F X X

Tiempo de ejecución: 40µS

 

 SET THE CG RAM ADDRESS                                                            

El módulo LCD además de tener definidos todo el conjunto de caracteres ASCII, permite al usuario definir 4 u 8 caracteres gráficos. La composición de estos caracteres se va guardando en una memoria llamada CG RAM con capacidad para 64 bytes. Cada carácter gráfico definido por el usuario se compone de 16 u 8 bytes que se almacenan en sucesivas posiciones de la CG RAM.

 

Mediante esta instrucción se establece la dirección de memoria CG RAM a partir de la cual se irán almacenando los bytes que definen un carácter gráfico. Ejecutando este comando todos los datos que se lean o escriban posteriormente, lo hacen desde esta memoria CG RAM.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 1 Dirección de la CG RAM
 

Tiempo de ejecución: 40µS

 

 SET THE DD RAM ADDRESS                                                            

Los caracteres o datos que se van visualizando, se van almacenando en una memoria llamada DD RAM para de aquí pasar a la pantalla.

 

Mediante esta instrucción se establece la dirección de la memoria

DD RAM a partir de la cual se irán almacenando los datos a visualizar. Ejecutando este comando, todos los datos que se escriban o lean posteriormente lo harán desde esta memoria DD RAM. Las direcciones de la 80h a la 8Fh corresponden con los 16 caracteres del primer renglón y de la C0h a la CFh con los 16 caracteres del segundo renglón, para este modelo de LCD.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 1 Dirección de la DD RAM

Tiempo de ejecución: 40µS

 

 READ BUSY FLAG & ADDRESS                                                        

Cuando el modulo LCD esta ejecutando cualquiera de estas instrucciones, tarda un cierto tiempo de ejecución en el que no se debe mandar ninguna instrucción. Para ello dispone de un flag llamado BUSY (ocupado) que indica que se está ejecutando una instrucción previa.

 

Esta instrucción de lectura informa del estado de dicho flag además de proporcionar el valor del contador de direcciones de la CG RAM o de la DD RAM según la última que se haya empleado.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 1 BF Dirección de la CG RAM o  DD RAM

Tiempo de ejecución: 40µS

 

 WRITE DATA TO GG OR DD RAM                                                      

Mediante este comando se escribe en la memoria DD RAM los datos que se quieren presentar en pantalla y que serán los diferentes códigos ASCII de los caracteres a visualizar.

 

Igualmente se escribe en la memoria CG RAM los diferentes bytes que permiten confeccionar caracteres gráficos a gusto del usuario.

 

El escribir en uno u otro tipo de memoria depende de si se ha empleado previamente la instrucción de direccionamiento DD RAM o la de direccionamiento CG RAM.

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 0 Código ASCII o byte del carácter gráfico

Tiempo de ejecución: 40µS

 

 READ DATA FROM CG RAM OR DD RAM                                          

Mediante este comando se lee de la memoria DD RAM los datos que haya almacenados y que serán los códigos ASCII de los caracteres almacenados.

 

Igualmente se lee de la memoria CG RAM los diferentes bytes con los que se ha confeccionado un determinado carácter gráfico.

 

El leer de uno u otro tipo de memoria depende de si se ha empleado previamente la instrucción de direccionamiento de la DD RAM o la de direccionamiento CG RAM.

 

 

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 1 Código ASCII o byte del carácter gráfico

Tiempo de ejecución: 40µS

 


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

 

ABREVIATURAS

Abreviaturas empleadas en los códigos anteriores:

 

S 1 - Desplaza la visualización cada vez que se escribe un dato

0 - Modo normal
 
I/D 1 - Incremento del cursor

0 - Decremento del cursor
 
S/C 1 - Desplaza el display

0 - Mueve el cursor
 
R/L 1 - Desplazamiento a la derecha

0 - Desplazamiento a la izquierda
 
BF 1 - Módulo ocupado

0 - Módulo disponible
 
DL 1 - Bus de datos de 8 bits

0 - Bus de datos de 4 bits
 
N 1 - LCD de dos líneas

0 - LCD de una línea
 
F 1 - Carácter de 5 x 10 puntos

0 - Carácter de 5 x 7 puntos
 
B 1 - Parpadeo del cursor ON

0 - Parpadeo del cursor OFF
 
C 1 - Cursor ON

0 - Cursor OFF
 
D 1 - Display ON

0 - Display OFF
 
X Indeterminado
 

 

 
 
Juego de caracteres:


 

 
 
   
RUTINA
 Descripción: La siguiente librería básica de rutinas es para controlar un LCD Hitachi 44780 o compatible.

Los datos o comandos a enviar al LCD los meteremos en el acumulador W antes de hacer la llamada a cualquiera de las rutinas siguientes.

 

LCD_E Genera un pulso de 1µS por PORTB,2 patita 6 (Enable) del LCD. Si se usa una velocidad de micro diferente de 4MHz habrá que ajustar este tiempo.
LCD_BUSY Chequea si el LCD esta ocupado (BUSY) y retorna de la rutina cuando ya no lo este.
LCD_REG Pone al LCD en modo de recibir comandos , espera a que no este ocupado y va a LCD_E.
LCD_DATOS Pone el LCD en modo datos y manda el byte presente en W que será mostrado en pantalla.
LCD_INI Inicializacion del modulo LCD segun los tiempo marcados por el fabricante. Bus de 8 bits, 2 lineas de visualizacion y caracteres de 5 x 7 puntos.
LCD_PORT Configura los puertos del PIC para ser usados con el LCD.

 

Rutina

LCD 2x16
 LCD.lib
 

 


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

Ejemplo: El siguiente ejemplo muestra lo fácil que es manejar un LCD. Lo que hace básicamente es configurar el LCD, los puertos del PIC y luego mandar los datos según los va cogiendo de la tabla de datos, para mostrar en el LCD la típica frase "HOLA MUNDO".

;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>

INICIO      CLRF         Digito             ;Pone a 0 la variable digito
               CALL         LCD_PORT    ;Puertos en modo LCD
               BCF           RA,0              ;Desactiva RS del modulo LCD
               BCF           RA,2              ;Desactiva E del modulo LCD
START    CALL        LCD_INI          ;Inicia LCD (CFG puertos...)
               MOVLW    b"00000001"   ;Borrar LCD y Home
               CALL        LCD_REG
               MOVLW    b"00000110"  
               CALL        LCD_REG
               MOVLW    b"00001100"   ;LCD On, cursor Off,Parpadeo Off
               CALL        LCD_REG
               MOVLW   0x80               ;Direccion caracter
               CALL        LCD_REG

REPETIR  MOVF      Digito,w          ;W=Digito
               CALL       DATO_1          ;Coge el caracter
               IORLW     0                      ;Compara
               BTFSC     STATUS,2       ;Es el ultimo?
               GOTO      acabar            ;Si
               CALL       LCD_DATOS   ;Visualiza caracter
               INCF        Digito,f             ;Incrementa numero de Digito
               GOTO     REPETIR           ;Vuelve a escribir

acabar   nop
              goto        acabar              ;Buclee infinito

;<<<<<<---------------------- TABLA DE DATOS ------------------------->>>>>>>

DATO_1 ADDWF  PCL,1
               RETLW  "H"
               RETLW  "O"
               RETLW  "L"
               RETLW  "A"
               RETLW  " "
               RETLW  "M"
               RETLW  "U"
               RETLW  "N"
               RETLW  "D"
               RETLW  "O"
               RETLW 0x00


 

 


 

anything