Buenas.
Estas subrrutinas las hice para un 16F876 con un LCD de 4 bits conectado al puerto C y las líneas de control en el puerto A. Hay que reservar desde el registro 0x34 hasta el 0x4b para guardar los caracteres para enviar al LCD:
Codigo:
;UP_LCD:Subrrutina para iniciar el display ********* COMPROBADA ********
;Continua con la rutina CLEAR para borrar los registros del display
up_lcd bcf porta,rs
movlw 0x02 ;"Funcion set"(4-bit data mode)
movwf portc
bsf porta,en
call retard4
bcf porta,en
call retard4
movlw 0x28 ;"Funcion set"(4-bit, 2-line, 5*8-pixels)
call display
movlw 0x0e ;"Cursor on"
call display
movlw 0x06 ;"Entry mode set"(cursor a izquierdas, cursor shift)
call display
bcf porta,rs
;CLEAR:Borra el display. ********* COMPROBADA ********
clear movlw 0x34
movwf fsr
bucle20 movf fsr,w
sublw 0x4c
btfsc status,2
return
movlw " "
movwf indf
incf fsr,f
goto bucle20
;DISPLAY: Manda al display el dato que se encuentra en w ********* COMPROBADA ********
display movwf temp
swapf temp,w
andlw 0x0f
movwf portc
bsf porta,en
call retardo
bcf porta,en
call retardo
movf temp,w
andlw 0x0f
movwf portc
bsf porta,en
call retardo
bcf porta,en
call retardo
return
;SHOW:Muestra por el display los carácteres previamente
;definidos con los registros especiales ********* COMPROBADA ********
show bcf porta,rs
movlw 0x80 ;"Set DDRAM address"(Primera linea "80")
call display
bsf porta,rs
movlw 0x34
movwf fsr
show2 movf indf,w
call display
incf fsr,f
movf fsr,w
sublw 0x40
btfss status,2
goto show2
bcf porta,rs
movlw 0xc0 ;"Set DDRAM address"(Segunda linea "C0")
call display
bsf porta,rs
show3 movf indf,w
call display
incf fsr,f
movf fsr,w
sublw 0x4c
btfss status,2
goto show3
bcf porta,rs
movlw 0x80 ;"Set DDRAM address"(0)
call display
return
;RETARDO: Retardo muy corto = 3*96*1us = 0.288ms ********* COMPROBADA ********
retardo movlw 0x60
movwf contador1
b1 decfsz contador1,f
goto b1
return
;RETARD4 Retardo medio = (255*3+3)*32 = 24.57ms ********* COMPROBADA ********
retard4 clrf contador1
movlw 0x20
movwf contador2
b4 decfsz contador1,f
goto b4
decfsz contador2,f
goto b4
return