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