real mente me costo mucho trabajo aprender a programar en el lcd y mas en 2 lineas aun q no lo crean es cierto eso de que una vez sabiendo es demaciado facil aqui les pongo la trillada rutina de "HOLA MUNDO" pero a 2 lineas CUALQUIER DUDA PREGUNTEN
#include "p16f877A.inc"
#include "LCD.inc"
__CONFIG _WDT_OFF & _HS_OSC & _CP_OFF & _LVP_OFF
list p = 16f877A
cblock 0x20
len,
counter
endc
VECTORS
CODE org 0x00
goto inicio
org 0x04
goto vecint
INICIO CODE
;INICIO DEL PROGRAMA================================================
inicio
bsf STATUS, RP0
bcf STATUS, RP1
clrf PIE1
bsf PIE1, TMR2IE
movlw 0xC3
movwf PR2
movlw 0x06
movwf ADCON1
movlw 0xF8
movwf TRISA
clrf TRISB
bcf STATUS, RP0
;INICIALIZACION DE LCD==========================================
clrf PORTB
call LCD_CLEAR ;LIMPIO LCD
call LCD_HOME ;MANDO EL CURSOR A INICIO
movlw INCREMENT SHIFTCURSOR ;VALORES DEL CURSOR
call LCD_ENTRY_MODE ;MODALIDAD DE ENTRADA
movlw _8BITS _2LINES _5X7 ;VALORES DE CONFIGURACION
call LCD_FUNCTION_SET ;TIPO DE LCD
movlw DISPON ;CHACAR LCD
call LCD_ONOFF ;ENCENDER LCD
;RUTINAS DE MENSAJES=======================================
CALL LINEA_1 ;LLAMA RUTINA DE LINEA 1
CALL LINEA_2 ;LLAMA RUTINA DE LINEA 2
;TERMINA EL PROGRAMA CICLO INFINITO===============================
loop
goto loop
;MENSAJE LINEA 1==========================================
LINEA_1
;===================================================================
MOVLW 0X80 ; ;
MOVWF PORTB ;RUTINA PARA DIRECCIONAR LA POSICION 1a LINEA ;
CALL LCD_ADDRESS_SET ; DESDE 0X80 HASTA 0X8F ;
CLRF PORTB ; ;
;===================================================================
call WRITE_MESSAGE1
clrf PCLATH
movlw 0x73
movwf T2CON ;PS:16 PST:16 TMR=OFF
clrf TMR2
movlw 0xC0
movwf INTCON
movlw d'10'
movwf counter
bsf T2CON, TMR2ON
RETURN
;MENSAGE LINEA 2==============================================
LINEA_2
;==========================================================
MOVLW 0XC0 ; ;
MOVWF PORTB ;RUTINA PARA DIRECCIONAR LA POSICION 2a LINEA;
CALL LCD_ADDRESS_SET ; DESDE 0XC0 HASTA 0XCF ;
CLRF PORTB ; ;
;========================================================
call WRITE_MESSAGE2
clrf PCLATH
movlw 0x73
movwf T2CON ;PS:16 PST:16 TMR=OFF
clrf TMR2
movlw 0xC0
movwf INTCON
movlw d'10'
movwf counter
bsf T2CON, TMR2ON
RETURN
;MENSAJE 1================================
WRITE_MESSAGE1
clrf len
NEXT_CHAR
movlw 0x08
movwf PCLATH
movf len, w
call HELLO1
iorlw 0x00
btfsc STATUS, Z
return
clrf PCLATH ; pagina 0
call LCD_DATA_WRITE
incf len, f
goto NEXT_CHAR
;MENSAGE 2======================================
WRITE_MESSAGE2
clrf len
NEXT_CHAR1
movlw 0x08
movwf PCLATH
movf len, w
call HELLO2
iorlw 0x00
btfsc STATUS, Z
return
clrf PCLATH ; pagina 0
call LCD_DATA_WRITE
incf len, f
goto NEXT_CHAR1
;VECTOR DE INTERRUPCION=========================
vecint
bcf PIR1, TMR2IF
decfsz counter, f
retfie
movlw d'10'
movwf counter
movlw MOVEDISP RIGHTSHIFT
call LCD_SHIFT
retfie
;MENSAGES DE LCD========================================
PROGDATA CODE
org 0x800
HELLO1
addwf PCL,f
retlw ' '
retlw ' '
retlw ' '
retlw 'H'
retlw 'E'
retlw 'L'
retlw 'L'
retlw 'O'
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw 0x00
HELLO2
addwf PCL,f
retlw ' '
retlw ' '
retlw ' '
retlw 'W'
retlw 'O'
retlw 'R'
retlw 'L'
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw 0x00
LCD_CLEAR
bcf PORTA, RS
bcf PORTA, RW
movlw 0x01
movwf PORTB
call LCD_E
call LCD_BUSY
return
LCD_HOME
bcf PORTA, RS
bcf PORTA, RW
movlw 0x02
movwf PORTB
call LCD_E
call LCD_BUSY
return
LCD_FUNCTION_SET
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 5
andlw 0x1F
iorwf PORTB, F
call LCD_E
call LCD_BUSY
return
LCD_SHIFT
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 4
andlw 0x0C
iorwf PORTB, F
call LCD_E
call LCD_BUSY
return
LCD_ONOFF
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 3
andlw 0x07
iorwf PORTB, F
call LCD_E
call LCD_BUSY
return
LCD_ENTRY_MODE
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 2
andlw 0x03
iorwf PORTB, F
call LCD_E call
LCD_BUSY
return
LCD_BUSY
bcf PORTA, RS
bsf PORTA, RW
bsf STATUS, RP0
bcf STATUS, RP1
clrf TRISB
comf TRISB, F
bcf STATUS, RP0
bsf PORTA, E
nop
WAIT_BUSY
btfsc PORTB, 7
goto WAIT_BUSY
bcf PORTA, E
bsf STATUS, RP0
bcf STATUS, RP1
clrf TRISB
bcf STATUS, RP0
return
LCD_ADDRESS_SET
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 7
andlw 0x7F
iorwf PORTB, F
call LCD_E
call LCD_BUSY
return
LCD_ADDRESS_READ
bcf PORTA, RS
bsf PORTA, RW
bsf STATUS, RP0
bcf STATUS, RP1
movlw 0xFF
movwf TRISB
bcf STATUS, RP0
bsf PORTA, E
nop
movf PORTB, w
andlw 0x7F
bcf PORTA, E
call LCD_BUSY
return
LCD_DATA_WRITE
bsf PORTA, RS
bcf PORTA, RW
movwf PORTB
call LCD_E
call LCD_BUSY
return
LCD_DATA_READ
bsf PORTA, RS
bsf PORTA, RW
bsf STATUS, RP0
bcf STATUS, RP1
movlw 0xFF
movwf TRISB
bcf STATUS, RP0
bsf PORTA, E
nop
movf PORTB, w
bcf PORTA, E
call LCD_BUSY
return
end
#include "p16f877A.inc"
#include "LCD.inc"
__CONFIG _WDT_OFF & _HS_OSC & _CP_OFF & _LVP_OFF
list p = 16f877A
cblock 0x20
len,
counter
endc
VECTORS
CODE org 0x00
goto inicio
org 0x04
goto vecint
INICIO CODE
;INICIO DEL PROGRAMA================================================
inicio
bsf STATUS, RP0
bcf STATUS, RP1
clrf PIE1
bsf PIE1, TMR2IE
movlw 0xC3
movwf PR2
movlw 0x06
movwf ADCON1
movlw 0xF8
movwf TRISA
clrf TRISB
bcf STATUS, RP0
;INICIALIZACION DE LCD==========================================
clrf PORTB
call LCD_CLEAR ;LIMPIO LCD
call LCD_HOME ;MANDO EL CURSOR A INICIO
movlw INCREMENT SHIFTCURSOR ;VALORES DEL CURSOR
call LCD_ENTRY_MODE ;MODALIDAD DE ENTRADA
movlw _8BITS _2LINES _5X7 ;VALORES DE CONFIGURACION
call LCD_FUNCTION_SET ;TIPO DE LCD
movlw DISPON ;CHACAR LCD
call LCD_ONOFF ;ENCENDER LCD
;RUTINAS DE MENSAJES=======================================
CALL LINEA_1 ;LLAMA RUTINA DE LINEA 1
CALL LINEA_2 ;LLAMA RUTINA DE LINEA 2
;TERMINA EL PROGRAMA CICLO INFINITO===============================
loop
goto loop
;MENSAJE LINEA 1==========================================
LINEA_1
;===================================================================
MOVLW 0X80 ; ;
MOVWF PORTB ;RUTINA PARA DIRECCIONAR LA POSICION 1a LINEA ;
CALL LCD_ADDRESS_SET ; DESDE 0X80 HASTA 0X8F ;
CLRF PORTB ; ;
;===================================================================
call WRITE_MESSAGE1
clrf PCLATH
movlw 0x73
movwf T2CON ;PS:16 PST:16 TMR=OFF
clrf TMR2
movlw 0xC0
movwf INTCON
movlw d'10'
movwf counter
bsf T2CON, TMR2ON
RETURN
;MENSAGE LINEA 2==============================================
LINEA_2
;==========================================================
MOVLW 0XC0 ; ;
MOVWF PORTB ;RUTINA PARA DIRECCIONAR LA POSICION 2a LINEA;
CALL LCD_ADDRESS_SET ; DESDE 0XC0 HASTA 0XCF ;
CLRF PORTB ; ;
;========================================================
call WRITE_MESSAGE2
clrf PCLATH
movlw 0x73
movwf T2CON ;PS:16 PST:16 TMR=OFF
clrf TMR2
movlw 0xC0
movwf INTCON
movlw d'10'
movwf counter
bsf T2CON, TMR2ON
RETURN
;MENSAJE 1================================
WRITE_MESSAGE1
clrf len
NEXT_CHAR
movlw 0x08
movwf PCLATH
movf len, w
call HELLO1
iorlw 0x00
btfsc STATUS, Z
return
clrf PCLATH ; pagina 0
call LCD_DATA_WRITE
incf len, f
goto NEXT_CHAR
;MENSAGE 2======================================
WRITE_MESSAGE2
clrf len
NEXT_CHAR1
movlw 0x08
movwf PCLATH
movf len, w
call HELLO2
iorlw 0x00
btfsc STATUS, Z
return
clrf PCLATH ; pagina 0
call LCD_DATA_WRITE
incf len, f
goto NEXT_CHAR1
;VECTOR DE INTERRUPCION=========================
vecint
bcf PIR1, TMR2IF
decfsz counter, f
retfie
movlw d'10'
movwf counter
movlw MOVEDISP RIGHTSHIFT
call LCD_SHIFT
retfie
;MENSAGES DE LCD========================================
PROGDATA CODE
org 0x800
HELLO1
addwf PCL,f
retlw ' '
retlw ' '
retlw ' '
retlw 'H'
retlw 'E'
retlw 'L'
retlw 'L'
retlw 'O'
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw 0x00
HELLO2
addwf PCL,f
retlw ' '
retlw ' '
retlw ' '
retlw 'W'
retlw 'O'
retlw 'R'
retlw 'L'
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw 0x00
LCD_CLEAR
bcf PORTA, RS
bcf PORTA, RW
movlw 0x01
movwf PORTB
call LCD_E
call LCD_BUSY
return
LCD_HOME
bcf PORTA, RS
bcf PORTA, RW
movlw 0x02
movwf PORTB
call LCD_E
call LCD_BUSY
return
LCD_FUNCTION_SET
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 5
andlw 0x1F
iorwf PORTB, F
call LCD_E
call LCD_BUSY
return
LCD_SHIFT
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 4
andlw 0x0C
iorwf PORTB, F
call LCD_E
call LCD_BUSY
return
LCD_ONOFF
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 3
andlw 0x07
iorwf PORTB, F
call LCD_E
call LCD_BUSY
return
LCD_ENTRY_MODE
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 2
andlw 0x03
iorwf PORTB, F
call LCD_E call
LCD_BUSY
return
LCD_BUSY
bcf PORTA, RS
bsf PORTA, RW
bsf STATUS, RP0
bcf STATUS, RP1
clrf TRISB
comf TRISB, F
bcf STATUS, RP0
bsf PORTA, E
nop
WAIT_BUSY
btfsc PORTB, 7
goto WAIT_BUSY
bcf PORTA, E
bsf STATUS, RP0
bcf STATUS, RP1
clrf TRISB
bcf STATUS, RP0
return
LCD_ADDRESS_SET
bcf PORTA, RS
bcf PORTA, RW
clrf PORTB
bsf PORTB, 7
andlw 0x7F
iorwf PORTB, F
call LCD_E
call LCD_BUSY
return
LCD_ADDRESS_READ
bcf PORTA, RS
bsf PORTA, RW
bsf STATUS, RP0
bcf STATUS, RP1
movlw 0xFF
movwf TRISB
bcf STATUS, RP0
bsf PORTA, E
nop
movf PORTB, w
andlw 0x7F
bcf PORTA, E
call LCD_BUSY
return
LCD_DATA_WRITE
bsf PORTA, RS
bcf PORTA, RW
movwf PORTB
call LCD_E
call LCD_BUSY
return
LCD_DATA_READ
bsf PORTA, RS
bsf PORTA, RW
bsf STATUS, RP0
bcf STATUS, RP1
movlw 0xFF
movwf TRISB
bcf STATUS, RP0
bsf PORTA, E
nop
movf PORTB, w
bcf PORTA, E
call LCD_BUSY
return
end