LCD 20x2 NHD, no logro que funcione

Hola, ya busque en el foro sobre este tema, lei un par de post, y la verdad no he logrado que me funcione ni en proteus ni en el mundo real este LCD con estas rutinas, cree un tema. Incluso vi un post que enseñaba unas rutinas de xrobotics, que son muy similares a las que yo tenia de una presentacion pdf. Trate de poner mas retardos, tambien retardos mas grandes y no me funciona. Estoy programando con el MPLAB V8.33, un pic16F690 y el pickit2. Me parece que el problema es con el puerto B, pero no estoy seguro. Les agradesco su ayuda.

Código:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	RUTINAS PARA MANEJO DE LCD										;
;	Aqui se colocan las rutinas necesarias para manejar una LCD		;
;	basada en un controlador KS066U. Se utiliza el puerto C para 	;
;	manejar los datos y el puerto B para el control					;
;	PIC16F690														;
;	4MHZ INTOSC														;
;	Ing. Mauricio Aguilar Salas										;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	LIST		P=16F690
	#include	<P16F690.inc>

	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF

	CBLOCK	0X20
	RET_5MS1
	RET_5MS2
	ENDC

;--------------------CONSTANTES----------------------
;{
;PARA LA LCD
	RS	EQU	4
	RW	EQU	5
	E	EQU	6
;}
;---------------------MACROS------------------------
;{
BANCO0	MACRO			;MACRO PARA SELECCIONAR EL BANCO 0 DE LA RAM
		BCF	STATUS,RP0
		BCF	STATUS,RP1
		ENDM
BANCO1	MACRO			;MACRO PARA SELECCIONAR EL BANCO 1 DE LA RAM
		BSF	STATUS,RP0
		BCF	STATUS,RP1
		ENDM
BANCO2	MACRO			;MACRO PARA SELECCIONAR EL BANCO 2 DE LA RAM
		BCF	STATUS,RP0
		BSF	STATUS,RP1
		ENDM
BANCO3	MACRO			;MACRO PARA SELECCIONAR EL BANCO 3 DE LA RAM
		BSF	STATUS,RP0
		BSF	STATUS,RP1
		ENDM
;}

	ORG 0
;--------------------RUTINA PRINCIPAL---------------------
;{
	CALL	INICIALIZACION
	CALL	INIT_LCD
PRINCIPAL:
	MOVLW	'L'
	CALL	ESCRIBE_LCD
	MOVLW	'C'
	CALL	ESCRIBE_LCD
	MOVLW	'D'
	CALL	ESCRIBE_LCD
	MOVLW	D'40'
	CALL	COMANDO_LCD
	MOVLW	'L'
	CALL	ESCRIBE_LCD
	MOVLW	'I'
	CALL	ESCRIBE_LCD
	MOVLW	'S'
	CALL	ESCRIBE_LCD
	MOVLW	'T'
	CALL	ESCRIBE_LCD
	MOVLW	'O'
	CALL	ESCRIBE_LCD
	GOTO	$
;}

;--------------INCIALIZACION DEL MICROCONTROLADOR---------
INICIALIZACION:
	BANCO0
	CLRF	PORTA
	CLRF	PORTB
	CLRF	PORTC
	BANKSEL	ANSEL
	MOVLW	B'11111000'		;Carga w con binario
	MOVWF	ANSEL			;AN0-3 digitales
	BANCO1
	MOVLW	0XFF			;Carga W con hexadecimal
	MOVWF	TRISA			;Puerto A como entrada
	MOVLW	B'10000000'		;Carga W con binario
	MOVWF	TRISB			;RB4-6 como salida
	CLRF	TRISC			;Puerto C como salida
	BANCO0
	RETURN

;--------------------------FUNCIONES LCD------------------
;{
INIT_LCD:
	CALL	DELAY_5MS
	BCF		PORTB,RW		;Modo escritura
	MOVLW	B'00111000'		;Carga W con binario
	CALL	COMANDO_LCD		;Configura 8 bits, 2 lineas y caracteres 5x8
	CALL	DELAY_5MS
	MOVLW	B'00111000'		;Carga W con binario
	CALL	COMANDO_LCD		;Otra vez
	CALL	DELAY_5MS
	MOVLW	B'00111000'		;Carga W con binario
	CALL	COMANDO_LCD		;Y otra vez
	MOVLW	B'00001100'		;Carga W con binario
	CALL	COMANDO_LCD		;Enciende LCD, apaga cursor y parpadeo
	CALL	DELAY_5MS
	MOVLW	0X01			;Carga W con hexadecimal
	CALL	COMANDO_LCD		;Borra la pantalla
	CALL	DELAY_5MS
	RETURN

ESCRIBE_LCD:
	BCF		PORTB,RS
	MOVWF	PORTC			;Saca el dato por el puerto
	CALL	LCD_OCUPADO
	BSF		PORTB,RS		;RS=1 para mandar datos
	GOTO	PULSO_ENABLE
COMANDO_LCD:
	BCF		PORTB,RS		;RS=0 para mandar comandos
	MOVWF	PORTC			;Saca comando al puerto
	CALL	LCD_OCUPADO
	GOTO	PULSO_ENABLE
PULSO_ENABLE:
	BSF		PORTB,E			;ALTO
	NOP						;Pierde 1us
	BCF		PORTB,E			;BAJO
	RETURN

LCD_OCUPADO:
	BSF		PORTB,RW		;Modo lectura
	BANKSEL	TRISC
	MOVLW	0XFF			;Carga unos
	MOVWF	TRISC			;Puerto C como entrada
	BANCO0
	BSF		PORTB,E			;E=1
	NOP						;Pierde 1us
CHEQUEO:
	BTFSC	PORTC,7			;Chequea busy
	GOTO	CHEQUEO
	BCF		PORTB,E			;E=0
	BANKSEL	TRISC
	CLRF	TRISC			;Puerto C como salida
	BANCO0
	BCF		PORTB,RW		;Modo escritura
	RETURN

DELAY_5MS:
	MOVLW	D'7'			;Carga decimal
	MOVWF	RET_5MS2
REPITE:
	DECFSZ	RET_5MS1,F		;Decrementa 256 veces
	GOTO	REPITE			;256*3 instrucciones= 768 instrucciones
	DECFSZ	RET_5MS2,F		;768 instrucciones * 7 = 5736 instrucciones
	GOTO	REPITE			;5376 * 1us = 5.4ms
	RETURN
;}
	END
 
Jaja q pena me voy a contestar yo mismo la duda ops:
Ya encontre el problema, lo que pasaba es que si las salidas del puerto b, no eran configuradas digitales, poniendo el registro ANSELH en ceros, estas no funcionan, no se x q ya que se supone que eso solo las afecta si son entradas.

Además para simular en proteus lo que se debe hacer es agregar un retardo extra, de 20ms, yo al final de la función PULSO_ENABLE
 
Atrás
Arriba