;-----------------------------------------------;
;   RUTINAS DE MANEJO PARA MODULO LCD CON		;
;    CONTROLADOR KS0066 (O EQUIVALENTE)			;
;		PARA USAR EN MODO DE 8 BITS.			;
;	 POR JUAN MARTIN FERRARI, AŅO 2009.			;
;	LAS RUTINAS DE RETARDO FUERON GENERADAS		;
;			CON EL PROGRAMA PDEL.				;
;-----------------------------------------------;
;
; LA FRECUENCIA DEL CRISTAL, RESONADOR O FUENTE
; EXTERNA DE OSCILACION DEBE SER DE 4 MHZ. CASO
; CONTRARIO, AJUSTAR TANTO LAS RUTINAS DE RETARDO
; COMO LAS DEMORAS NECESARIAS EN LOS CICLOS DE
; LECTURA Y ESCRITURA (VER HOJA DE DATOS KS0066).
;
; EL LCD DEBE ESTAR CONECTADO AL PUERTO B, EL CUAL
; DEBE SER CONFIGURADO COMO SALIDA PREVIAMENTE:
; DB0 -> PORTB,0
; DB1 -> PORTB,1
; DB2 -> PORTB,2
; DB3 -> PORTB,3
; DB4 -> PORTB,4
; DB5 -> PORTB,5
; DB6 -> PORTB,6
; DB7 -> PORTB,7
;
; LAS LINEAS E, RS Y RW A ALGUN PIN DEL PUERTO A,
; PREVIAMENTE CONFIGURADO COMO SALIDA.
;
; LOS PINES CONECTADOS A RW Y E DEBEN INICIALIZARSE
; EN CERO LOGICO.
;
; NECESARIO:
; - DECLARACION DE: RS, E Y RW.
; - CBLOCK QUE INDIQUE LA DIRECCION DE R_E_T_1, R_E_T_2
;   Y LCD_AUX.
; - INCLUSION DEL ARCHIVO P16F84A.INC (O DEL PIC USADO).
;------------------------------------------------

	CBLOCK
R_E_T_1
R_E_T_2
LCD_AUX
	ENDC

;------------------------------------------------
; RETARDO DE 50 MILISEGUNDOS.

retardo50ms
	MOVLW	D'55'
	MOVWF	R_E_T_1
	MOVLW	D'181'
	MOVWF	R_E_T_2
	CLRWDT
	CLRWDT
	DECFSZ	R_E_T_2,F
	GOTO	$-3
	DECFSZ	R_E_T_1,F
	GOTO	$-7
	RETURN

;------------------------------------------------
; RETARDO DE 2 MILISEGUNDOS.

retardo2ms
	MOVLW	D'249'
	MOVWF	R_E_T_1
	CLRWDT
	GOTO	$+1
	GOTO	$+1
	DECFSZ	R_E_T_1,F
	GOTO	$-4
	GOTO	$+1
	CLRWDT
	RETURN

;------------------------------------------------
; RETARDO DE 45 MICROSEGUNDOS.

retardo45us
	MOVLW	D'10'
	MOVWF	R_E_T_1
	CLRWDT
	DECFSZ	R_E_T_1,F
	GOTO	$-2
	RETURN

;------------------------------------------------
; ENVIA UNA INSTRUCCION O UN CARACTER AL LCD.
; EL BYTE A ENVIAR DEBE ESTAR GUARDADO EN W.

instruccion
	BCF		PORTA,RS
	GOTO	$+2

caracter
	BSF		PORTA,RS

	NOP
	BSF		PORTA,E
	NOP
	MOVWF	PORTB
	NOP
	BCF		PORTA,E
	NOP
	RETURN

;------------------------------------------------
; ESPERA A QUE EL BUSY FLAG ESTE EN BAJO.

busy_flag
	BSF		STATUS,RP0
	MOVLW	0xFF
	MOVWF	TRISB
	BCF		STATUS,RP0
	BCF		PORTA,RS
	BSF		PORTA,RW
	NOP
	BSF		PORTA,E
	NOP
	BTFSC	PORTB,7
	GOTO	$-1
	NOP
	BCF		PORTA,E
	NOP
	BCF		PORTA,RW
	BSF		STATUS,RP0
	CLRF	TRISB
	BCF		STATUS,RP0
	RETURN

;------------------------------------------------
; LEER_RAMDATA:
; GUARDA EN EL REGISTRO LCD_AUX EL VALOR DE LA 
; CGRAM O DDRAM EN LA ULTIMA DIRECCION USADA.
;
; LEER_RAMADR:
; GUARDA LA DIRECCION DE LA CGRAM O DDRAM EN
; EL REGISTRO LCD_AUX, CUYO BIT MAS SIGNIFICATIVO
; CONTENDRA EL VALOR 1 LOGICO (EL BUSY FLAG).

leer_ramdata
	BSF		PORTA,RS
	GOTO	$+2

leer_ramadr
	BCF		PORTA,RS

	BSF		STATUS,RP0
	COMF	TRISB,F
	BCF		STATUS,RP0
	BSF		PORTA,RW
	NOP
	BSF		PORTA,E
	NOP
	MOVF	PORTB,W
	MOVWF	LCD_AUX
	BCF		PORTA,E
	NOP
	BCF		PORTA,RW
	BSF		STATUS,RP0
	CLRF	TRISB
	BCF		STATUS,RP0
	RETURN

;------------------------------------------------
; INICIALIZA EL LCD PARA 8 BITS:
; ARG1 -> OO11NFxx
; ARG2 -> OOOO1DCB
; ARG3 -> OOOOO1(I/D)(SH)


lcd_8bits	MACRO	ARG1, ARG2, ARG3

	CALL	retardo50ms

	MOVLW	ARG1
	CALL	instruccion
	CALL	retardo45us

	MOVLW	ARG2
	CALL	instruccion
	CALL	retardo45us

	MOVLW	0x01
	CALL	instruccion
	CALL	retardo2ms

	MOVLW	ARG3
	CALL	instruccion
	CALL	retardo45us

	ENDM

;------------------------------------------------
; INICIALIZA EL LCD PARA 4 BITS:
; ARG4 -> NFxxxxxx
; ARG5 -> 1DCBxxxx
; ARG6 -> O1(I/D)(SH)

lcd_4bits	MACRO	ARG4, ARG5, ARG6

	CALL	retardo50ms

	MOVLW	B'00100000'
	CALL	instruccion
	MOVLW	B'00100000'
	CALL	instruccion
	MOVLW	ARG4
	CALL	instruccion
	CALL	retardo45us

	MOVLW	0x00
	CALL	instruccion
	MOVLW	ARG5
	CALL	instruccion
	CALL	retardo45us

	MOVLW	0x00
	CALL	instruccion
	MOVLW	0x01
	CALL	instruccion
	CALL	retardo2ms

	MOVLW	0x00
	CALL	instruccion
	MOVLW	ARG6
	CALL	instruccion
	CALL	retardo45us

	ENDM