hola yo tengo problemas con el lcd, al compilar me salen estos errores
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Documents and Settings\Ariel\Escritorio\tem-1\tem1.mcs".
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F877A "Est met.asm" /l"Est met.lst" /e"Est met.err" /d__DEBUG=1
Error[115] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\RUTINALCD.INC 96 : Duplicate label ("RD" or redefining symbol that cannot be redefined)
Message[302] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\RUTINALCD.INC 101 : Register in operand not in bank 0. Ensure that bank bits are correct.
Warning[202] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\RUTINALCD.INC 102 : Argument out of range. Least significant bits used.
Message[302] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\RUTINALCD.INC 103 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[305] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\MUL16X8BIT.INC 53 : Using default destination of 1 (file).
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 252 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 254 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 307 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 313 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 328 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 338 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 340 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 357 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 486 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 497 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 500 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 508 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 523 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 526 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 541 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 543 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 545 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 558 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 562 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 575 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 578 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 587 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 618 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 621 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 624 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 641 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 646 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 663 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 667 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 677 : Register in operand not in bank 0. Ensure that bank bits are correct.
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `C:\Documents and Settings\Ariel\Escritorio\tem-1\tem1.mcp' failed.
Preprocessor symbol `__DEBUG' is defined.
Thu Dec 09 12:18:48 2010
----------------------------------------------------------------------
BUILD FAILED
la rutina del lcd es esta, nos e donde estew el errror, me podrian ayudar....
para un LCD de 16x2 para LCD Hitachi HD44780
;Esta rutina es para el 16F87x.
;Comunicación 8 Bit, RS, RW y E.
;
;Configuración del hardware:
;RB0 a DB0; RB1 a DB1;... RB7 a DB7
;RD0 a RS; RD1 a R/W; RD2 a E
;
;*************
;SE NECESITA:
;*************
;
;* Rutina de temporización de 5ms llamada DELAY_5MS. Lo debe definir el usuario para no modificar constantemente la rutina
; así se puede usar con 8Mhz, 4Mhz, etc.
;* RAM: cursor (ver MOV_DESP)
;* curdisp (ver CUR_DISP)
;* poeslcd (ver PO_ES_LCD)
;
;***************
;LO QUE CONSUME
;***************
;- 3 pociciones de la RAM
;- 2 pociciones de la pila más uno desde el programa principal, Total 3 Stack.
;
;*********
;RUTINAS:
;*********
;
;LCD_PORT, para configurar los puerto de comunicación con el LCD. Ver encabezado de la rutina.
;
;LCD_INI, inicializa el LCD para bus de 8 bits, las 2 líneas de LCD y resolución 5x7. Se ejecuta automáticamente, pero se dispone de ella
; por si el usuario lo necesita.
;
;B_DISPLAY, Borra el display y la memoria del LCD.
;
;MOV_DESP, configura al cursor, tanto el movimiento y desplazamiento. B'000001MS': M 1 Incremento 0 decremento del cursor.
; S 1 Desplaza la visualización (útil para cuando se exede los 16 caracteres por línea) 0 modo normal.
; antes de llamar a esta rutina, cargar en la pocición CURSOR la configuración deseada. Predeterminado B'00000110'
;
;CUR_DISP, Se configura si se prende o apaga al cursor y al display, y si el cursor parpadea o no.
; B'00001DCB' D 1 Display encendido 0 Display apagado. C 1 cursor encendido 0 cursor apagado. B 1 Cursor parpadea 0 cursor no parpadea.
; antes de llamar a esta rutina, cargar en la pocición CURDISP la configuración deseada. Predeterminado B'00001100'
;
;PO_ES_LCD, Pocición para escribir en LCD. La primer Línea comienza desde H'80' hasta H'8F'
; y la segunda línea desde H'C0' hasta H'CF' Útil para subir o bajar el cursor y elegir desde dónde se empieza a escribir.
; antes de llamar a esta rutina, carga en la pocición POESLCD la configuración deseada. Predeterminado B'10000000' (H'80') y B'11000000' (H'C0')
;
;LCD_DATO, Envía los datos a mostrar en la pantalla del LCD.
;
;PRE_LCD, configura al LCD en forma predeterminada con los valores B'00000110' B'00001100' B'10000000'; También borra el Display. Al utilizar esta rutina
; se ahorran muchos pasos.
;
;***********************************************************
;MODO DE USO
;***********************************************************
;
;Alternativa 1
;*************
;Primero: ejecutar la rutina LCD_PORT
;Segundo: solo si se necesita, ejecutar la rutina B_DISPLAY es recomendable. (ver en rutinas)
;Tercero: cargar en la variable CURSOR la configuración deseada (ver en RUTINAS) y luego ejecutar la rutina MOV_DESP
;Cuarto: cargar en la variable CURDISP la configuración deseada (ver en RUTINAS) y luego ejecutar la rutina CUR_DIP
;Quinto: cargar en la variable POESLCD la configuración deseada (ver en RUTINAS) y luego ejecutar la rutina PO_ES_LCD
;Sexto: el LCD ya está configurado. Se debe cargar en el registro W el código ASCII a mostrar en el LCD y luego ejecutar la rutina LCD_DATO.
;Séptimo: Cuando se cargaron las 16 pociciones de memoria y/o se quiere bajar o subir de línea repetir el quinto paso y luego el sexto.
;
;Alternativa 2.
;**************
;Primero: ejecutar PRE_LCD
;segundo: el LCD ya está configurado. Se debe cargar en el registro W el código ASCII a mostrar en el LCD y luego ejecutar la rutina LCD_DATO.
;tercero: Cuando se cargaron las 16 pociciones de memoria y/o se quiere bajar o subir de línea repetir el quinto paso y luego el sexto
; de la alternativa 1.
;
;***********************************************************
;NOTA:
;***********************************************************
;
;Importante: Todas las rutinas se deben ejecutar con la instrucción CALL y las variables se deben escribir en minúscula como está en
; el apartado senecesita.
; También es recomendable desactivar las interrupciones antes de ejecutar cualquier rutina.
;
;Esta rutina se puede utilizar tranquilamente en un PIC 16F84, para ello, se deben anular las líneas MOVLW H'06' y MOVWF ADCON1
;BCF STATUS,RP1 que se encuentra en la rutina LCD_PORT
;
;*****************************************************************************
;Configura los puertos A y B para la comunicación con el LCD
;Pone al PORTB como salida y a los BITs 0, 1, 2, 5 del puerto A como salidas y
;a los BITs 3 y 4 como entradas.
;*****************************************************************************
;
;*****************************************************************************
;RENOMBRAMOS PUERTOS
;*****************************************************************************
;
RB EQU H'06'
RD EQU H'08'
;
;
LCD_PORT BSF STATUS,RP0 ;Cambio de banco a 1
BCF STATUS,RP1 ;Idem anterior.
CLRF TRISB ;RB se programa como salida
MOVLW d'00011000' ;RA<4:3> se programan como entradas
MOVWF TRISD ;RA<2:0> se programan como salidas
MOVLW H'06' ;Cargo el valor 6 al W y lo paso
MOVWF ADCON0 ;al registro para hacer a porta salidas digitales.
BCF STATUS,RP0 ;Selecciona el banco 0 de datos
BCF RD,0 ;Desactiva RS del modulo LCD
BCF RD,2 ;Desactiva E del modulo LCD
;
LCD_INI MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
RETURN
;
LCD_REG BCF RD,0 ;Desactiva RS (Modo instruccion)
MOVWF RB ;Saca el codigo de instruccion
CALL LCD_BUSY ;Espera a que se libere el LCD
LCD_E BSF RD,2 ;Activa señal E
NOP ;Espera 1uS
BCF RD,2 ;Desactiva señal E
RETURN
;
LCD_BUSY BSF RD,1 ;Pone el LCD en modo lectura
BSF STATUS,5 ;Selecciona el Banco 1
MOVLW 0xFF
MOVWF PORTB ;Puerta B act£a de entrada
BCF STATUS,5 ;Selecciona el Banco 0
BSF RD,2 ;Activa el LCD (Señal E)
NOP
L_BUSY BTFSC RB,7 ;Chequea el bit BUSY
GOTO L_BUSY ;Est a "1" (Ocupado)
BCF RD,2 ;Desactiva el LCD (Se¤al E)
BSF STATUS,5 ;Selecciona el Banco 1
CLRF PORTB ;Puerta B actua como salida
BCF STATUS,5 ;Selecciona el Banco 0
BCF RD,1 ;Pone el LCD en modo escritura
RETURN
;
B_DISPLAY MOVLW B'00000001'
CALL LCD_REG
RETURN
;
MOV_DESP MOVFW cursor
CALL LCD_REG
RETURN
;
CUR_DISP MOVFW curdisp
CALL LCD_REG
RETURN
;
PO_ES_LCD MOVFW poeslcd
CALL LCD_REG
RETURN
;
LCD_DATO BCF RD,0 ;Desactiva RS (Modo instrucci¢n)
MOVWF RB ;Valor ASCII a sacar por RB
CALL LCD_BUSY ;Espera a que se libere el LCD
BSF RD,0 ;Activa RS (Modo dato)
GOTO LCD_E ;Genera pulso en señal E
;
PRE_LCD CALL LCD_PORT
CALL B_DISPLAY
MOVLW B'00000110'
MOVWF cursor
CALL MOV_DESP
MOVLW B'00001100'
MOVWF curdisp
CALL CUR_DISP
MOVLW B'10000000'
MOVWF poeslcd
CALL PO_ES_LCD
RETURN
;
;****************
;NOTA AL MARGEN:
;****************
;Si se tiene limitada la memoria de programa, se puede eliminar la rutina PRE_LCD
;También se puede eliminar las variables y trabajar directamente desde W
;para ello, se debe eliminar la primer línea (no la etiqueta) de las rutinas
;MOV_DESP, CUR_DISP, PO_ES_LCD y antes de ejecutar estas rutinas, se debe cargar en W
;la configuración deseada. Recuerden que, si se hace esta modificación, la rutina PRE_LCD, no funcionará.
;La razón de utilizar las variables, es para que el usuario pueda guardar la configuración
;al principio del programa, hacer otras tareas y luego inicializar el LCD.
gracias
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Documents and Settings\Ariel\Escritorio\tem-1\tem1.mcs".
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F877A "Est met.asm" /l"Est met.lst" /e"Est met.err" /d__DEBUG=1
Error[115] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\RUTINALCD.INC 96 : Duplicate label ("RD" or redefining symbol that cannot be redefined)
Message[302] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\RUTINALCD.INC 101 : Register in operand not in bank 0. Ensure that bank bits are correct.
Warning[202] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\RUTINALCD.INC 102 : Argument out of range. Least significant bits used.
Message[302] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\RUTINALCD.INC 103 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[305] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\MUL16X8BIT.INC 53 : Using default destination of 1 (file).
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 252 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 254 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 307 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 313 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 328 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 338 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 340 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 357 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 486 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 497 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 500 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 508 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 523 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 526 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 541 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 543 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 545 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 558 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 562 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 575 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 578 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 587 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 618 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 621 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 624 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 641 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 646 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 663 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 667 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\ARIEL\ESCRITORIO\TEM-1\EST MET.ASM 677 : Register in operand not in bank 0. Ensure that bank bits are correct.
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `C:\Documents and Settings\Ariel\Escritorio\tem-1\tem1.mcp' failed.
Preprocessor symbol `__DEBUG' is defined.
Thu Dec 09 12:18:48 2010
----------------------------------------------------------------------
BUILD FAILED
la rutina del lcd es esta, nos e donde estew el errror, me podrian ayudar....
para un LCD de 16x2 para LCD Hitachi HD44780
;Esta rutina es para el 16F87x.
;Comunicación 8 Bit, RS, RW y E.
;
;Configuración del hardware:
;RB0 a DB0; RB1 a DB1;... RB7 a DB7
;RD0 a RS; RD1 a R/W; RD2 a E
;
;*************
;SE NECESITA:
;*************
;
;* Rutina de temporización de 5ms llamada DELAY_5MS. Lo debe definir el usuario para no modificar constantemente la rutina
; así se puede usar con 8Mhz, 4Mhz, etc.
;* RAM: cursor (ver MOV_DESP)
;* curdisp (ver CUR_DISP)
;* poeslcd (ver PO_ES_LCD)
;
;***************
;LO QUE CONSUME
;***************
;- 3 pociciones de la RAM
;- 2 pociciones de la pila más uno desde el programa principal, Total 3 Stack.
;
;*********
;RUTINAS:
;*********
;
;LCD_PORT, para configurar los puerto de comunicación con el LCD. Ver encabezado de la rutina.
;
;LCD_INI, inicializa el LCD para bus de 8 bits, las 2 líneas de LCD y resolución 5x7. Se ejecuta automáticamente, pero se dispone de ella
; por si el usuario lo necesita.
;
;B_DISPLAY, Borra el display y la memoria del LCD.
;
;MOV_DESP, configura al cursor, tanto el movimiento y desplazamiento. B'000001MS': M 1 Incremento 0 decremento del cursor.
; S 1 Desplaza la visualización (útil para cuando se exede los 16 caracteres por línea) 0 modo normal.
; antes de llamar a esta rutina, cargar en la pocición CURSOR la configuración deseada. Predeterminado B'00000110'
;
;CUR_DISP, Se configura si se prende o apaga al cursor y al display, y si el cursor parpadea o no.
; B'00001DCB' D 1 Display encendido 0 Display apagado. C 1 cursor encendido 0 cursor apagado. B 1 Cursor parpadea 0 cursor no parpadea.
; antes de llamar a esta rutina, cargar en la pocición CURDISP la configuración deseada. Predeterminado B'00001100'
;
;PO_ES_LCD, Pocición para escribir en LCD. La primer Línea comienza desde H'80' hasta H'8F'
; y la segunda línea desde H'C0' hasta H'CF' Útil para subir o bajar el cursor y elegir desde dónde se empieza a escribir.
; antes de llamar a esta rutina, carga en la pocición POESLCD la configuración deseada. Predeterminado B'10000000' (H'80') y B'11000000' (H'C0')
;
;LCD_DATO, Envía los datos a mostrar en la pantalla del LCD.
;
;PRE_LCD, configura al LCD en forma predeterminada con los valores B'00000110' B'00001100' B'10000000'; También borra el Display. Al utilizar esta rutina
; se ahorran muchos pasos.
;
;***********************************************************
;MODO DE USO
;***********************************************************
;
;Alternativa 1
;*************
;Primero: ejecutar la rutina LCD_PORT
;Segundo: solo si se necesita, ejecutar la rutina B_DISPLAY es recomendable. (ver en rutinas)
;Tercero: cargar en la variable CURSOR la configuración deseada (ver en RUTINAS) y luego ejecutar la rutina MOV_DESP
;Cuarto: cargar en la variable CURDISP la configuración deseada (ver en RUTINAS) y luego ejecutar la rutina CUR_DIP
;Quinto: cargar en la variable POESLCD la configuración deseada (ver en RUTINAS) y luego ejecutar la rutina PO_ES_LCD
;Sexto: el LCD ya está configurado. Se debe cargar en el registro W el código ASCII a mostrar en el LCD y luego ejecutar la rutina LCD_DATO.
;Séptimo: Cuando se cargaron las 16 pociciones de memoria y/o se quiere bajar o subir de línea repetir el quinto paso y luego el sexto.
;
;Alternativa 2.
;**************
;Primero: ejecutar PRE_LCD
;segundo: el LCD ya está configurado. Se debe cargar en el registro W el código ASCII a mostrar en el LCD y luego ejecutar la rutina LCD_DATO.
;tercero: Cuando se cargaron las 16 pociciones de memoria y/o se quiere bajar o subir de línea repetir el quinto paso y luego el sexto
; de la alternativa 1.
;
;***********************************************************
;NOTA:
;***********************************************************
;
;Importante: Todas las rutinas se deben ejecutar con la instrucción CALL y las variables se deben escribir en minúscula como está en
; el apartado senecesita.
; También es recomendable desactivar las interrupciones antes de ejecutar cualquier rutina.
;
;Esta rutina se puede utilizar tranquilamente en un PIC 16F84, para ello, se deben anular las líneas MOVLW H'06' y MOVWF ADCON1
;BCF STATUS,RP1 que se encuentra en la rutina LCD_PORT
;
;*****************************************************************************
;Configura los puertos A y B para la comunicación con el LCD
;Pone al PORTB como salida y a los BITs 0, 1, 2, 5 del puerto A como salidas y
;a los BITs 3 y 4 como entradas.
;*****************************************************************************
;
;*****************************************************************************
;RENOMBRAMOS PUERTOS
;*****************************************************************************
;
RB EQU H'06'
RD EQU H'08'
;
;
LCD_PORT BSF STATUS,RP0 ;Cambio de banco a 1
BCF STATUS,RP1 ;Idem anterior.
CLRF TRISB ;RB se programa como salida
MOVLW d'00011000' ;RA<4:3> se programan como entradas
MOVWF TRISD ;RA<2:0> se programan como salidas
MOVLW H'06' ;Cargo el valor 6 al W y lo paso
MOVWF ADCON0 ;al registro para hacer a porta salidas digitales.
BCF STATUS,RP0 ;Selecciona el banco 0 de datos
BCF RD,0 ;Desactiva RS del modulo LCD
BCF RD,2 ;Desactiva E del modulo LCD
;
LCD_INI MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
RETURN
;
LCD_REG BCF RD,0 ;Desactiva RS (Modo instruccion)
MOVWF RB ;Saca el codigo de instruccion
CALL LCD_BUSY ;Espera a que se libere el LCD
LCD_E BSF RD,2 ;Activa señal E
NOP ;Espera 1uS
BCF RD,2 ;Desactiva señal E
RETURN
;
LCD_BUSY BSF RD,1 ;Pone el LCD en modo lectura
BSF STATUS,5 ;Selecciona el Banco 1
MOVLW 0xFF
MOVWF PORTB ;Puerta B act£a de entrada
BCF STATUS,5 ;Selecciona el Banco 0
BSF RD,2 ;Activa el LCD (Señal E)
NOP
L_BUSY BTFSC RB,7 ;Chequea el bit BUSY
GOTO L_BUSY ;Est a "1" (Ocupado)
BCF RD,2 ;Desactiva el LCD (Se¤al E)
BSF STATUS,5 ;Selecciona el Banco 1
CLRF PORTB ;Puerta B actua como salida
BCF STATUS,5 ;Selecciona el Banco 0
BCF RD,1 ;Pone el LCD en modo escritura
RETURN
;
B_DISPLAY MOVLW B'00000001'
CALL LCD_REG
RETURN
;
MOV_DESP MOVFW cursor
CALL LCD_REG
RETURN
;
CUR_DISP MOVFW curdisp
CALL LCD_REG
RETURN
;
PO_ES_LCD MOVFW poeslcd
CALL LCD_REG
RETURN
;
LCD_DATO BCF RD,0 ;Desactiva RS (Modo instrucci¢n)
MOVWF RB ;Valor ASCII a sacar por RB
CALL LCD_BUSY ;Espera a que se libere el LCD
BSF RD,0 ;Activa RS (Modo dato)
GOTO LCD_E ;Genera pulso en señal E
;
PRE_LCD CALL LCD_PORT
CALL B_DISPLAY
MOVLW B'00000110'
MOVWF cursor
CALL MOV_DESP
MOVLW B'00001100'
MOVWF curdisp
CALL CUR_DISP
MOVLW B'10000000'
MOVWF poeslcd
CALL PO_ES_LCD
RETURN
;
;****************
;NOTA AL MARGEN:
;****************
;Si se tiene limitada la memoria de programa, se puede eliminar la rutina PRE_LCD
;También se puede eliminar las variables y trabajar directamente desde W
;para ello, se debe eliminar la primer línea (no la etiqueta) de las rutinas
;MOV_DESP, CUR_DISP, PO_ES_LCD y antes de ejecutar estas rutinas, se debe cargar en W
;la configuración deseada. Recuerden que, si se hace esta modificación, la rutina PRE_LCD, no funcionará.
;La razón de utilizar las variables, es para que el usuario pueda guardar la configuración
;al principio del programa, hacer otras tareas y luego inicializar el LCD.
gracias