TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: houts100 en 04 de Enero de 2005, 21:24:00

Título: DUDAS EN EL MENEJO DEL LCD
Publicado por: houts100 en 04 de Enero de 2005, 21:24:00
SI ALGUIEN PUEDE AYUDARME DE COMO HACER APARECER UN MENSAJE DE FORMA INSTANTENEA EN EL LCD, YA QUE TENGO EJEMPLOS QUE MUESTRA EL MENSAJE LETRA POR LETRA, SI EL EJEMPLO ES ASM. MUCHO MEJOR, SE LOS AGRADECERE EN SERIO YA QUE NO ESTOY MUY FAMILIARIZADO CON EL LCD.

GRACIAS!!!!!!!!!!!
Título: RE: DUDAS EN EL MENEJO DEL LCD
Publicado por: FirmSoft en 04 de Enero de 2005, 22:50:00
   Y si le quitas el tiempo de demora entre caracter y caracter??... si no me equivoco el lcd no tiene una memoria donde volcar datos y luego imprimirlos de una... o talves si Enfurruñado ... en fin.. si le quitas el retardo entre caracter y caracter, a la velocidad de un micro, lo ojos ni cuenta se darian de que van de uno en uno. Saludos! Payaso
Título: RE: DUDAS EN EL MENEJO DEL LCD
Publicado por: dzepedar en 11 de Enero de 2005, 13:59:00
Escrito originalmente por houts100
SI ALGUIEN PUEDE AYUDARME DE COMO HACER APARECER UN MENSAJE DE FORMA INSTANTENEA EN EL LCD, YA QUE TENGO EJEMPLOS QUE MUESTRA EL MENSAJE LETRA POR LETRA, SI EL EJEMPLO ES ASM. MUCHO MEJOR, SE LOS AGRADECERE EN SERIO YA QUE NO ESTOY MUY FAMILIARIZADO CON EL LCD.

GRACIAS!!!!!!!!!!!


Mi estimado amigo:
Tienes suerte, precisamente, estoy realizando un proyecto, en donde he configurado una rutina para que el mensaje en pantalla aparezca de manera instantánea.

Mira este ejemplo:
Recuerda que la posición de memoria para un display de 20x2 es
80h para la primera línea y para la segunda es C0h. Creo que para
el display LCD de 16x2 es igual.


   MOVLW   0x80                   ;
   CALL   CONTROL                   ;
   MOVLW   0      ; INICIA CONTADOR DE CARACTERES
   MOVWF   r0c      ;
CICLO   MOVF   r0c,W      ; HACE BARRIDO DE LA TABLA
   CALL   TABLA_MSG_WCOME   ;      
   CALL   PUSH_DATO_LCD   ;
   INCF   r0c,1      ; SIGUE CON LA TABLA
   MOVLW   0x14      ;
   SUBWF   r0c,w      ; PREGUNTA SI SE ESTA MOSTRANDO EL MENSAJE DE LA SEGUNDA
   BTFSS   STATUS,C   ; LINEA
   GOTO   CICLO      ;
   MOVLW   0x14      ; PREGUNTA SI ES LA PRIMERA VEZ QUE ENTRA A LA SEGUNDA  
   XORWF   r0c,w      ; LINEA PARA IR  A INICIA EL PUNTO DE LA RAM DEL MODULO LCD
   BTFSS   STATUS,Z   ;
   GOTO   LINE2      ;
LINEA2   MOVLW   0xC0      ; UBICA EL PUNTERO DE LA RAM DEL MODULO LCD EN LA SEGUNDA
   CALL    CONTROL      ; LINEA
LINE2   MOVLW   0x28      ; SE VERIFICA SI TERMINO DE MOSTRAR LA SEGUNDA LINEA
   XORWF   r0c,w      ; PARA IR A INICIAR DE NUEVO EL MENSAJE PARA CONTINUAR EN LA
   BTFSS   STATUS,Z   ; SEGUNDA LINEA
   GOTO   CICLO      ;
   RETURN

Este ejemplo lo extraje de una revista (CEKIT) y probablemente es el mismo que tu tienes.
Este lo modifique para reducir o eliminar aquellos retardo que estaban despues
de: CALL PUSH_DATO_LCD.

Sin embargo, te informo de que siempre los caracteres son enviados en forma secuencial o caracter a caracter. Lo que ocurre es que para nuestros ojos, tal como lo menciona FirmSoft, no es visible sino mas bien cuando ya están todos en pantalla.

Eso si, recuerda igual debe existir algun retardo puesto como lo menciona el fabricante, si no se respetan lo mas probable es que no aparezcan los caracteres.

Para que tengas mas clara la idea, revisa estas rutinas las que podrías agregar
a tu aplicación (esta es llamada de la rutina de mas arriba):

CONTROL   BCF   PORTB,3      ; Esta rutina genera las señales de CONTROL para escribir
   GOTO   PUSH_DATO_LCD2   ; en el módulo LCD y el entrega el dato a ser mostrado en
            ; la pantalla
PUSH_DATO_LCD
   BSF   PORTB,3      ;
            ;
PUSH_DATO_LCD2
   BSF   PORTA,0      ; utiliza la interface a 4 bits
   MOVWF   r0e      ;
   MOVLW   0fh      ;
   ANDWF   PORTB,1      ;
   MOVF   r0e,w      ;
   ANDLW   0f0h      ;
   IORWF   PORTB,1      ;
   CALL   DELAY_LCD   ;
   BCF   PORTA,0      ;
   CALL   DELAY_LCD   ;
   BSF   PORTA,0      ;
   MOVLW   0fh      ;
   ANDWF   PORTB,1      ;
   SWAPF   r0e,w      ;
   ANDLW   0f0h      ;
   IORWF   PORTB,1      ;
   CALL   DELAY_LCD   ;
   BCF   PORTA,0      ;
   CALL   DELAY_LCD   ;
   RETURN         ;   

TABLA_MSG_WCOME         ;
   ADDWF   PCL,1
   RETLW   "A"
   RETLW   "Q
   RETLW   "U"
   RETLW   "I"
   RETLW   " "
   RETLW   "V"
   RETLW   "A"
   RETLW   " "
   RETLW   "E"
   RETLW   "L"
   RETLW   " "
   RETLW   " "
   RETLW   "M"
   RETLW   "E"
   RETLW   "N"
   RETLW   "S"
   RETLW   "A"
   RETLW   "J"
   RETLW   "E "
   RETLW   " "      ; 20 CARACTERES 14H -> FIN PRIMERA LINEA
   RETLW   "P"      ; 21 CARACTERES 15H -> INICIO PRIMERA LINEA
   RETLW   "A"
   RETLW   "R"
   RETLW   "A"
   RETLW   " "
   RETLW   "L"
   RETLW   "A"
   RETLW   " "
   RETLW   "P"
   RETLW   "A"
   RETLW   "N"
   RETLW   "T"
   RETLW   "A"
   RETLW   "L"
   RETLW   "L"
   RETLW   "A"
   RETLW   " "
   RETLW   "L"
   RETLW   "C"
   RETLW   "D"      ; 40 CARACTERES
   RETLW   0      ;

;RETARDOS
DELAY_LCD
   MOVLW   0ffh      ;
   MOVWF   r1b      ;
decre   DECFSZ   r1b,1      ;
   GOTO   decre      ;
   RETURN         ;
DELAY_LCD2
   MOVLW   0ffh      ;
   MOVWF   r14      ;
decr2   CALL   DELAY_LCD   ;
   CALL   DELAY_LCD   ;
   DECFSZ   r14,1      ;
   GOTO   decr2      ;
   RETURN

Todas las tomé de la revista de la CEKIT y las modifque a mi gusto
y/o en según los requerimientos de la aplicacion que estoy desarrollando.
Fijate en la rutina de retardo DELAY_LCD.

Bueno eso es todo.

SALUDOS.

DANIEL
Título: RE: DUDAS EN EL MENEJO DEL LCD
Publicado por: atlasdelcarinakeel en 21 de Enero de 2005, 08:30:00
Definitivamente varia el retardo,pon los mas rapido y veras que el mensaje aparece de forma instantanea
Título: RE: DUDAS EN EL MENEJO DEL LCD
Publicado por: Gokuden en 21 de Enero de 2005, 11:21:00
amigo. fijate este codigo..

;*****************************************************************
;              CONFIGURAR LCD(SUBRUTINA)                            
;*****************************************************************
INILCD   movlw   38H
   CALL   CONTROL
   movlw   0CH
   CALL   CONTROL
   movlw   06H;LCD ON/OFF CURSOR FIJO
   CALL   CONTROL
   movlw   01H;BORRAR PANTALLA
   CALL   CONTROL
   RETURN
;*****************************************************************
;               CONTROL INSTRUCCIONES LCD(SUBRUTINA)                         
;*****************************************************************
CONTROL   bcf   PORTB,7
   movwf   PORTD
   bsf   PORTB,6
   CALL   RETmin
   bcf   PORTB,6
   CALL   RETmin
   CALL   RETmin
   CALL   RETmin
   CALL   RETmin
   CALL   RETmin
   CALL   RETmin
   RETURN
;*****************************************************************
;             ESCRIBIR DATO LCD(SUBRUTINA)                            
;*****************************************************************
DATO   bsf   PORTB,7
   movwf   PORTD
   bsf   PORTB,6
   CALL   RETmin
   bcf   PORTB,6
   CALL   RETmin
   CALL   RETmin
   CALL   RETmin
   CALL   RETmin
   CALL   RETmin
   RETURN

;*****************************************************************
;      RETARDO minimo(PARA PODER ESCRIBIR EN LA LCD LUEGO DE MANDAR INSTRUCCION)                            
;*****************************************************************
RETmin   movlw   .255
   movwf   REG1
LOOP_2   decfsz   REG1
   GOTO   LOOP_2
   RETURN


AHORA TE EXPLICO.  este codigo fue hecho en un 16f877. aunque es totalmente editable! y para una lcd comun 16x2....

como sabes, la lcd tiene 8bits de datos! y dos bits de control, RS y EN, el hay uno que va entre ellos dos, que es para seleccionar algo sobre la ram internet del micro y uno lo pone en Leer o RD!!..  los bus de datos de la lcd esta conectada a mi puerto D del PIC y en uso los pines 0 y 1 del puerto B para controlar la LCD.


apenas arranca el programa del micro! llamas a la rutina INILCD. esta rutina configura e incializa la LCD. esta hecha para trabajar a 8bits. dos lineas. Pero funciona perfecto amigo. si te da problema al encender el micro y aun asi ves que la lcd no se inicializa y se aparece una linea negra . entonces antes y despues de llamar a la rutina  INILCD, le pones un retardo de unos 200ms. es debido a que energizas el sistema y el micro arranca pero la lcd aun no responde.

las rutinas control y dato son para ya usar la lcd. como sabes uno le manda instrucciones o dato a la lcd. ejemplo! si deseas limpiar la pantalla. le mandas 01h a la lcd pero como instruccion, no dato.

como funcionan esas dos instrucciones. pos simplemente pones en el acumulador o en W el dato que vas a enviar y luego llamas a la rutina, fijate que cada rutina tiene un call retmin, ese es un retardo que se usa ahi! y tambien te lo paso. esta cuadrado para que los mensages salgan de manera instantánea.

si te fijas en las rutinas control y dato, la diferencia es que se pone un bajo o un bcf en el portb,7 y en la otra un alto o un bsf, eso significa que en CONTROL, la lcd tiene que tener el RS en bajo y RS en alto para Dato.

EJEMPLO: poner la palabra "hola" en pantalla de una manera sencilla..


CALL           INILCD
MOVLW       01H        """ mandas un 01h como control para limpiar la pantalla
CALL           CONTROL
MOVLW       "H"          """ pones "H" en W o acumulador y luego call dato.
CALL           DATO
MOVLW       "O"
CALL           DATO
MOVLW       "L"
CALL           DATO
MOVLW       "A"
CALL           DATO
 

Y SIGUES-----

Título: RE: DUDAS EN EL MENEJO DEL LCD
Publicado por: Meybel en 21 de Enero de 2005, 17:27:00
Esto es lo más sencillo (y elegante) que he probado para lanzar un mensaje por  LCD.

Codigo:
; En la pantalla del módulo LCD se visualiza un mensaje de menos de 16 caracteres grabado
; en la memoria ROM mediante la directiva DT. Utiliza la subrutina LCD_Mensaje de la
; librería LCD_MENS.INC
;
; ZONA DE DATOS **********************************************************************

   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   LIST      P=16F84A
   INCLUDE <P16F84A.INC>

   CBLOCK  0x0C
   ENDC

; ZONA DE CÓDIGOS ********************************************************************

   ORG   0
Inicio
   call   LCD_Inicializa
   movlw   Mensaje0         ; Apunta dónde se encuentra el mensaje.
   call   LCD_Mensaje      ; Visualiza el mensaje.
   sleep            ; Pasa a modo bajo consumo.

; Mensajes ------------------------------------------------------------------------------
;
Mensajes
   addwf   PCL,F
Mensaje0
   DT "Hola!, que tal?   ", 0x00   

   INCLUDE  <LCD_4BIT.INC>
   INCLUDE  <LCD_MENS.INC>
   INCLUDE  <RETARDOS.INC>
   END
   
Título: RE: DUDAS EN EL MENEJO DEL LCD
Publicado por: dzepedar en 21 de Enero de 2005, 19:05:00
Hola a todos:

Todas la respuestas apuntan a lo mismo, pero de manera mas detallada.

Sería tremendamente importante saber, si quién hizo la pregunta, finalmente
pudo solucionar su problema.

Saludos

Dzepedar