Hola amigos, necesito ayuda con un modulo LCD...
Antes que nada, busque en el buscador del foro y he encontrado bastante pero he llegado a un punto que no se que puedo hacer ya...
Estoy programando un PIC 16F877A para mostrar mensajes por una pantalla LCD (entre otras cosas) y el problema que tengo s que no consigo que me muestre nada, lo mas probable es que no le esté mandando bien las señales para que funcione. Les cuento que estoy programando en Assembler, con el MPLAB y que el Modulo es el "LCD Module CCM 1620"...
La idea es la siguiente, entra una interrupcion por RB0 y en la rutina de servicio me muestra el mensaje "INGRESAR CLAVE", nada mas... El problema es que ingresa a la rutina de servicio (lo se porque hice que me encienda un led indicador) pero no me muestra nada en el LCD... No es dificil pero no se si es que estoy usando mal las señales de control del modulo o que sera pero ya no se que mas hacer...
Aca les copio el programita por si alguien me puede ayudar...
;..........................................................................................
LIST P=16F877A
RADIX HEX
;..........................................................................................
PCL EQU 0x02 ;D
STATUS EQU 0x03 ;E
PORTA EQU 0x05 ;F
PORTB EQU 0x06 ;I
PORTC EQU 0x07 ;N
PORTD EQU 0x08 ;I
PORTE EQU 0x09 ;C
OPTIONR EQU 0x81 ;I
TRISA EQU 0x85 ;O
TRISB EQU 0x86 ;N
TRISC EQU 0x87 ;
PIR1 EQU 0X0C ;
PIR2 EQU 0X0D ;
TRISD EQU 0x88 ;D
TRISE EQU 0x89 ;E
INTCON EQU 0x0B ;
PIE1 EQU 0X8C ;
PIE2 EQU 0X8D ;
ADCON1 EQU 0x9F ;
CUENTA EQU 0x20 ;V
BANDERA1 EQU 0x2D ;
BANDERA2 EQU 0x2E ;
BANDERA3 EQU 0x2F ;
RETARDO_1 EQU 0x30 ;
RETARDO_2 EQU 0x31 ;
RETARDO_3 EQU 0x32 ;
;..........................................................................................
ORG 0x00 ;Vector de Reset
GOTO INICIO ;Va a inicio
;..........................................................................................
; SUBRUTINA DE SERVICIO
;..........................................................................................
ORG 0x04 ;Vector de interrupcion
GOTO INTERRUP ;Va a la subrutina INTERRUP
;..........................................................................................
INTERRUP BTFSS INTCON,1 ;¿Fue interrupciòn?
RETFIE ;No, retorna y habilita las interrupciones globales
BCF INTCON,7 ;deshabilita las interrupciones hasta que atienda la que entro
BTFSC PORTC,7 ;¿Se quiere ingresar una clave?
GOTO PRENDE ;Si, va a INGRESAR
BCF INTCON,1 ;Borrar la bandera de interrupción
BCF INTCON,0
BSF INTCON,7 ;habilita las interrupciones
RETFIE ;Retornar y habilitar las interrupciones globales
NO_MENU BCF INTCON,1 ;Borra la bandera de interrupciones
BSF INTCON,7 ;
RETFIE ;Retornar y habilitar las interrupciones globales
;..........................................................................................
INICIO CLRF BANDERA1 ;
CLRF BANDERA2 ;
CLRF BANDERA3 ;
CLRF CUENTA ;
CLRF PORTA ;
CLRF PORTB ;
CLRF PORTC ;
CLRF PORTD ;
CLRF PORTE ;
CLRF PIE1
CLRF PIE2
CLRF PIR1
CLRF PIR2
BCF STATUS,6 ;Bit RP1 del registro estado
BSF STATUS,5 ;Selecciona el banco 1
CLRF TRISA ;Puerto A como salida
CLRF TRISD ;Puerto D como salida
MOVLW 0x06 ;Mueve el literal 06 a W
MOVWF ADCON1 ;Puerto E como entrada/salida digital
CLRF TRISE ;Puerto E como salida
MOVLW 0xFF ;Mueve el literal FF a W
MOVWF TRISC ;Puerto C como entrada
MOVLW 0x0F ;Mueve el literal E0 a W
MOVWF TRISB ;Puerto B como entrada/salida
MOVLW 0xC0 ;Mueve el literal 40 a W
MOVWF OPTIONR ;Configuro el registro option
BCF STATUS,5 ;Selecciona el banco 0
MOVLW 0x98 ;
MOVWF INTCON ;
BSF PORTA,2 ;Señal de control
BSF PORTA,3 ;Señal de control
CLRF PORTD ;
CALL INI_LCD ;Configura el modulo LCD
DORMIR SLEEP ;Modo bajo consumo
GOTO DORMIR ;Va a DORMIR
;..........................................................................................
INI_LCD BCF PORTE,2 ;Deshabilita el LCD
BCF PORTE,1 ;Desactiva RS (modo instrucción)
CALL RUTINA_15ms ;Espera 15ms. para que se resetee sin problemas
MOVLW b'00111000' ;Display de 8 bits, 2 lineas, matriz de 5x7
CALL LCD_INSTRUC ;Llama a ENABLE_LCD
MOVLW b'00000110' ;Dirección de movimiento del cursor: AUMENTA y la exhibición no se cambia de puesto
CALL LCD_INSTRUC ;Llama a ENABLE_LCD
MOVLW b'00001100' ;Activa el display, desactiva el cursor y desactiva el destello del cursor
CALL LCD_INSTRUC ;Llama a ENABLE_LCD
MOVLW b'00000001' ;Borra el display
CALL LCD_INSTRUC ;Llama a ENABLE_LCD
RETURN ;
;***********************************************************************
LCD_INSTRUC MOVWF PORTD ;
BSF PORTE,2 ;
CALL RUTINA_1ms ;
CALL RUTINA_1ms ;
CALL RUTINA_1ms ;
CALL RUTINA_1ms ;
BCF PORTE,2 ;
RETURN ;
;**********************************************************************
LCD_DATO BCF PORTE,1 ;Desactiva RS (Modo Instrucción)
MOVWF PORTD ;
BSF PORTE,1 ;Activa RS (Modo Dato)
BSF PORTE,0
BSF PORTE,2 ;Habilita el LCD
MOVLW .90 ;
MOVWF CUENTA ;
DECFSZ CUENTA,F ;
GOTO $-1 ;
BCF PORTE,2 ;
BCF PORTE,1 ;
RETURN
;..........................................................................................
RUTINA_15ms MOVLW D'20'
MOVWF RETARDO_2
MOVLW D'121'
MOVWF RETARDO_1
GOTO LOOP_1 ;
;..........................................................................................
RUTINA_1ms MOVLW D'2' ;
MOVWF RETARDO_2 ;
MOVLW D'74' ;
MOVWF RETARDO_1 ;
;..........................................................................................
LOOP_1 DECFSZ RETARDO_1,1 ;
GOTO LOOP_1 ;
DECFSZ RETARDO_2,1 ;
GOTO LOOP_1 ;
RETURN ;
;..........................................................................................
PRENDE BSF PORTA,0 ;
MENSAJE_1 MOVLW 0x81 ;
CALL LCD_INSTRUC ;
MOVLW 'I' ;
CALL LCD_DATO ;
MOVLW 'N' ;
CALL LCD_DATO ;
MOVLW 'G' ;
CALL LCD_DATO ;
MOVLW 'R' ;
CALL LCD_DATO ;
MOVLW 'E' ;
CALL LCD_DATO ;
MOVLW 'S' ;
CALL LCD_DATO ;
MOVLW 'A' ;
CALL LCD_DATO ;
MOVLW 'R' ;
CALL LCD_DATO ;
MOVLW ' ' ;
CALL LCD_DATO ;
MOVLW 'C' ;
CALL LCD_DATO ;
MOVLW 'L' ;
CALL LCD_DATO ;
MOVLW 'A' ;
CALL LCD_DATO ;
MOVLW 'V' ;
CALL LCD_DATO ;
MOVLW 'E' ;
CALL LCD_DATO ;
MOVLW ' ' ;
CALL LCD_DATO ;
GOTO PRENDE ;
;..........................................................................................
END