acá te mando un código útil no se te olvide consultar el manual Manejo de un display de cristal líquido LCD
; este programa escribe un mensaje en un modulo lcd de 2 lineas con 16 caracteres c/u
pc equ 02
status equ 03
ptoa equ 05
ptob equ 06
ptoc equ 07
ptod equ 08
ptoe equ 09
pclath equ 0ah
intcon equ 0bh
pir1 equ 0ch
rcsta equ 18h
txreg equ 19h
rcreg equ 1ah
adresh equ 1eh
adcon0 equ 1fh
trisa equ 85h
trisb equ 86h
trisc equ 87h
trisd equ 88h
trise equ 89h
txsta equ 98h
spbrg equ 99h
adresl equ 9eh
adcon1 equ 9fh
;Definicion de bits utilizados
rp0 equ 5
rp1 equ 6
irp equ 7
z equ 2
c equ 0
txif equ 4
go equ 2
; pines del puerto c
e equ 1h ;para habilitar el modulo LCD
rs equ 0h ;para seleccionar datos o instruccion del LCD
;Variables del usuario
loops equ 34h
loops2 equ 35h
; ************ Configuracion para el simulador Proteus
list p=16f877
_CP_ALL EQU H'0FCF'
_CP_HALF EQU H'1FDF'
_CP_UPPER_256 EQU H'2FEF'
_CP_OFF EQU H'3FFF'
_DEBUG_ON EQU H'37FF'
_DEBUG_OFF EQU H'3FFF'
_WRT_ENABLE_ON EQU H'3FFF'
_WRT_ENABLE_OFF EQU H'3DFF'
_CPD_ON EQU H'3EFF'
_CPD_OFF EQU H'3FFF'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
_BODEN_ON EQU H'3FFF'
_BODEN_OFF EQU H'3FBF'
_PWRTE_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON
org 00 ;vector de reset
goto inicio ;va a iniciar programa principal
retalcd movlw 05h ;esta rutina hace un retardo de unos 20 us
movwf 43h
decre decfsz 43h,1
goto decre
return
;***** Esta rutina llena la pantalla de espacios en blanco
limpia clrf 4ch
limpi movlw " " ;el espacio es un caracter en blanco
call dato
incf 4ch,1
movlw 50h ;se incrementa hasta la posicion 50h para borrar todo
xorwf 4ch,0
btfss status,z
goto limpi
return
; **** Esta rutina envia instrucciones o datos al LCD
control bcf ptoc,rs ;esta rutina genera las señales de control
goto dato2 ;y entrega el dato correspondiente al modulo LCD
dato bsf ptoc,rs ;utiliza interface a 8 bits
dato2 bsf ptoc,e
movwf ptob
call retalcd
bcf ptoc,e
call retalcd
return
;subrutina de retardo en milisegundos
;el registro loops contiene el numero
retarms movwf loops ;de milisegundos del retardo
top2 movlw d'110'
movwf loops2
top nop
nop
nop
nop
nop
nop
decfsz loops2,1 ;pregunta si terminó ya 1 ms
goto top
decfsz loops ;pregunta si termina el retardo
goto top2
return
; ******** PROGRAMA PRINCIPAL ***********
inicio bcf status,6
bsf status,5
movlw b'11111' ;programacion de puertos
movwf trisa ;segun el circuito
movlw b'00000000'
movwf trisb
movlw b'11111100'
movwf trisc
movlw b'11111111'
movwf trisd
movlw b'11111111'
movwf trise
movlw b'11110111'
movwf adcon1
bcf status,5
movlw d'100' ;retardo al iniciar para que el modulo se estabilice
call retarms
begin movlw b'00111000' ;inicia display a 8 bits y 2 líneas
call control
movlw b'00001100' ;activa display
call control
movlw b'00000110' ;hace que el mensaje permanezca fijo
call control
movlw b'10000000' ;ubica puntero en linea superior
call control ;primera posicion
blank call limpia ;borra display
;******* Mensaje línea superior *******
movlw b'10000000' ;ubica puntero en linea superior
call control ;primera posicion
movlw "U"
call dato
movlw "T"
call dato
movlw "P"
call dato
; ****** Envia mensaje inferior **********
movlw b'11000000' ;ubica puntero en segunda linea
call control
movlw "E"
call dato
movlw "T"
call dato
movlw "E"
call dato
movlw "L"
call dato
movlw "E"
call dato
movlw "C"
call dato
nada nop
goto nada ; ****** al terminar no hace nada *****
end
Conexiones
rbo D0
RB1 D1
RB2 D2
RB3 D3
RB4 D4
RB5 D5
RB6 D6
RB7 D7
RC0 RS
RC1 E
VSS 0V
VDD 5V
VEE POTENCIOMTRO 10K