;**************************** Librería "LCD_4BIT.

INC" **************************** ******* ; ; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2 ; líneas por 16 caracteres, compatible con el modelo LM016L. ; ; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits . Las ; conexiones son: ; Las 4 líneas superiores del módulo LCD, pines <DB7:DB4> se conectan a las 4 ; líneas superiores del Puerto B del PIC, pines <RB7:RB4>. ; Pin RS del LCD a la línea RA0 del PIC. ; Pin R/W del LCD a la línea RA1 del PIC, o a masa. ; Pin Enable del LCD a la línea RA2 del PIC. ; ; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la libre ría ; RETARDOS.INC. ; ; ZONA DE DATOS **************************************************************** ***** CBLOCK LCD_Dato LCD_GuardaDato LCD_GuardaTRISB LCD_Auxiliar1 LCD_Auxiliar2 ENDC LCD_CaracteresPorLinea EQU línea de la pantalla. #DEFINE #DEFINE #DEFINE #DEFINE LCD_PinRS LCD_PinRW LCD_PinEnable LCD_BusDatos PORTA,0 PORTA,1 PORTA,2 PORTB .16 ; Número de caracteres por

; Subrutina "LCD_Inicializa" ----------------------------------------------------------; ; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por soft ware, ; borra memoria y enciende pantalla. El fabricante especifica que para garantiza r la ; configuración inicial hay que hacerla como sigue: ; LCD_Inicializa bsf STATUS,RP0 ; Configura las líneas conectadas al pines RS, bcf LCD_PinRS ; R/W y E. bcf LCD_PinEnable bcf LCD_PinRW bcf STATUS,RP0 bcf LCD_PinRW ; En caso de que esté conectado le indica ; que se va a escribir en el LCD. bcf LCD_PinEnable ; Impide funcionamiento

del LCD poniendo E=0. bcf LCD_PinRS poniendo RS=0. call Retardo_20ms movlw b'00110000' call LCD_EscribeLCD call Retardo_5ms movlw b'00110000' call LCD_EscribeLCD call Retardo_200micros movlw b'00110000' call LCD_EscribeLCD call Retardo_20micros simular en PROTEUS. movlw b'00100000' call LCD_EscribeLCD call Retardo_20micros simular en PROTEUS. ; Ahora configura el resto de los parámetros: call LCD_2Lineas4Bits5x7 5x7 puntos. call LCD_Borra impia. Cursor al principio call LCD_CursorOFF call LCD_CursorIncr return

; Activa el Modo Comando

; Escribe el dato en el LCD.

; Este retardo es necesario para ; Interface de 4 bits. ; Este retardo es necesario para

; LCD de 2 líneas y caracteres de ; Pantalla encendida y l ; de la línea 1. Cursor apagado. ; Cursor en modo incrementar.

; Subrutina "LCD_EscribeLCD" ---------------------------------------------------------; ; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin ; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que ; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y des pués se ; vuelve a enviar este dato sin cambiarlo. LCD_EscribeLCD andlw b'11110000' alto del dato que es el movwf LCD_Dato o guarda. movf LCD_BusDatos,W parte baja andlw b'00001111' e debe alterar. iorwf LCD_Dato,F l dato de entrada a parte baja lo bsf o 1. movf que tenía antes movwf movlw del Puerto B se que había antes. STATUS,RP0 TRISB,W TRISB. LCD_GuardaTRISB b'00001111' dejan ; Se queda con el nibble ; que hay que enviar y l ; Lee la información actual de la ; del Puerto B, que no s ; Enviará la parte alta de ; y en l ; Acceso al Banc ; Guarda la configuración ; Las 4 líneas inferiores

Pantalla apaga . como estaban y las 4 s . Permite funcionamiento .RP0 o 0. . Dirección 14h de la DDRA M goto LCD_EnviaComando LCD_Linea4 . pulso y termina impidi . bcf STATUS. Dirección 00h de la DDRA M goto LCD_EnviaComando LCD_Linea2 . movf LCD_Dato. Cursor al prin cipio de la Línea 1. dirección 40h de la DDRA M más el valor del goto LCD_EnviaComando . movlw b'00000110' goto LCD_EnviaComando LCD_Linea1 .Los comandos que pueden ser ejecutados son: . Acceso al Banc . Acceso al Banc . movlw b'11000000' . LCD_PosicionLinea2 . Dirección 54h de la DDRA M goto LCD_EnviaComando LCD_PosicionLinea1 . Cursor a posición de la Línea 1. bsf STATUS. movwf LCD_BusDatos bsf LCD_PinEnable del LCD mediante un pequeño bcf LCD_PinEnable endo el funcionamiento del LCD. . LCD_OFF . Dirección 40h de la DDRA M goto LCD_EnviaComando LCD_Linea3 . registro W. a partir de la iorlw b'11000000' . LCD_CursorIncr . la configuración del Puerto B. Acceso al Banc . Subrutinas variadas para el control del módulo LCD ---------------------------------------. .RP0 o 0.andwf PORTB. dirección 00h de la DDRA M más el valor del goto LCD_EnviaComando .RP0 o 1. return .W movwf TRISB bcf STATUS.W iar. Restaura el antiguo valor en movf LCD_GuardaTRISB. Recupera el dato a env . Cursor al prin cipio de la Línea 4 movlw b'11010100' . Cursor a posición de la Línea 2. a partir de la iorlw b'10000000' .F uperiores como salida. Cursor al prin cipio de la Línea 3 movlw b'10010100' . Cursor en modo increme ntar. Envía el dato al módulo LCD. movlw b'10000000' . registro W. Cursor al prin cipio de la Línea 2. .

movlw b'00001110' goto LCD_EnviaComando LCD_CursorOFF ursor apagado. Trabaja en Modo Dato. . comando ha sido entregada a través del registro W. memoria DDRAM y pone el movlw b'00000001' la línea 1. btfss LCD_PinRS . call Retardo_50micros return . Define la pantalla de . Subrutina "LCD_CodigoCGROM" ---------------------------------------------------------. Guarda el dato a enviar.W . movlw b'00001100' goto LCD_EnviaComando LCD_Borra pantalla. Para ello pasa el . con caracteres movlw b'00101000' al PIC mediante bus de .da. cursor a principio de . goto LCD_Envia LCD_Caracter bsf LCD_PinRS . A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la . goto LCD_EnviaComando LCD_2Lineas4Bits5x7 2 líneas. Pantalla encendida y c . "LCD_Caracter". Pantalla encendida y c . a través del registro W. . nibble bajo del dato a enviar a parte alta del byte. swapf LCD_GuardaDato. call LCD_EscribeLCD . LCD_Envia movwf LCD_GuardaDato . Trabaja en Modo Comando. 2 ms en modo comando y 50 s en modo cáracter. Obtiene el código para correcta visualización. . Ahora envía el nibble bajo. Escribe un comando en el registro del módulo LCD. LCD_EnviaComando bcf LCD_PinRS . . poniendo RS=1. Se envía al visualizador LCD. Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ----------------------------------. Escribe en la memoria DDRAM del LCD el carácter ASCII introducid o a . movlw b'00001000' goto LCD_EnviaComando LCD_CursorON ursor encendido. goto LCD_EnviaComando . call LCD_CodigoCGROM . . Borra toda la . Primero envía el nibble alto. de 5x7 puntos y conexión . Debe garantizar una co rrecta escritura manteniendo call Retardo_2ms . poniendo RS=0. La palabra de . call LCD_EscribeLCD . Activa el Modo Comando. 4 bits. "LCD_EnviaComando". Activa el "Mod o Dato".

un carácter especial. En (W) el código buscado . Código CGROM de la "ñ". .Z goto LCD_Grado movlw b'11101110' o hay símbolo para movwf LCD_Dato OM). LCD_LineaEnBlanco movlw LCD_CaracteresPorLinea goto LCD_EnviaBlancos LCD_UnEspacioBlanco movlw .Z goto LCD_EnheMayuscula movlw b'11101110' movwf LCD_Dato goto LCD_FinCGROM LCD_EnheMayuscula movf LCD_Dato. return . sublw 'Ñ' btfss STATUS. En (W) el código definido en la tabla CGROM. tabla CGROM del LM016L no coinciden con los códigos ASCII. a . ¿Es el símbolo "º"? . movwf LCD_Dato LCD_FinCGROM movf LCD_Dato.W de entrada. sublw 'º' btfss STATUS. o . a códigos CGROM par que que puedan ser visualizado en el módulo LM016L. goto LCD_FinCGROM LCD_Grado movf LCD_Dato. . No es "º". (N . No es "ñ".2 goto LCD_EnviaBlancos . Guarda el valor del ca .1 goto LCD_EnviaBlancos LCD_DosEspaciosBlancos movlw . LCD_CodigoCGROM movwf LCD_Dato rácter y comprueba si es LCD_EnheMinuscula sublw 'ñ' btfss STATUS. Código CGROM del símbolo "º" . . ..Z goto LCD_FinCGROM movlw b'11011111' . Recupera el código ASCII .W . la "Ñ" mayúscula en la CGR . . Recupera el código ASCII . ¿Es la "ñ"? . . No es "Ñ". . .W de entrada. Visualiza espacios en blanco. Código CGROM de la "ñ". Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" ------------------------------. . . "º" y otros. Así por ejemplo. ¿Es la "Ñ"? . . Entrada: Salida: En (W) el código ASCII del carácter que se desea visualizar. el códig ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh. Esta subrutina convierte los códigos ASCII de la "Ñ".

. .F ). Lo visualiza.3 LCD_EnviaBlancos movwf LCD_Auxiliar1 o contador. el valor hexadecimal que almacena en el nibble . . . Ejemplos: . Visualiza en el lugar actual de la pantalla. Pone el nibble alto en la part . pero en caso de que el nibble alto sea cero . call LCD_Nibble .Si (W)=b'01010110'. Subrutina "LCD_Byte" igual que la anterior. LCD_Byte movwf LCD_Auxiliar2 . .LCD_TresEspaciosBlancos movlw . call LCD_Caracter anco como se decfsz LCD_Auxiliar1. lugar actual de la pantalla. . movlw ' ' . y si (W)=b'00001110'. goto LCD_EnviaOtroBlanco return . visualiza en su lugar un espacio en blanco. . return .W e bajo. El nibble alto de W no es tenido en cuenta. visualiza " E" (un espacio blanco delante). No es cero y lo visualiza. Visualiza tanto espacios en bl . Subrutina "LCD_Nibble" --------------------------------------------------------------. call LCD_Caracter goto LCD_VisualizaBajo LCD_ByteCompleto movwf LCD_Auxiliar2 LCD_VisualizaAlto swapf LCD_Auxiliar2. Lo visualiza. . haya cargado en (LCD_Auxiliar1 . Subrutina "LCD_ByteCompleto". Analiza si el nibble a lto es cero. visualiza el byte que almacena el registro W en el . . Guarda el valor de entrada. . Repite el proceso con el nibbl . . (LCD_Auxiliar1) se utiliza com . Guarda el valor de entrada.Z . se visualizará "6". Si es cero lo apaga. Subrutinas "LCD_ByteCompleto" y "LCD_Byte" ------------------------------------------. andlw b'11110000' . LCD_EnviaOtroBlanco movlw ' ' acio en blanco. goto LCD_VisualizaAlto . . Esto es un esp .W e baja. call LCD_Nibble LCD_VisualizaBajo movf LCD_Auxiliar2. bajo del registro W. btfss STATUS. si (W)=b'10101110' visualiza "AE". Por ejemplo si (W)=b'10101110' vis ualiza "AE" . . Utilizan la subrutina "LCD_Nibble" que se analiza más adelante. Por ejemplo. Visualiza un e spacio en blanco.

En los comentarios. Sí. por tanto. se visualizará "E". movwf LCD_Auxiliar1 . Retardo_10micros . se le sum a el ASCII de la 'A'. LCD_FinVisualizaDigito goto LCD_Caracter . Comprueba si hay que r epresentarlo con letra. resulta que ca da . la llamada a subrutina "call" tarda 2 ciclos máquina. "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina. ZONA DE DATOS **************************************************************** ***** CBLOCK R_ContA tardos. Contadores para los re . . RETARDOS de 4 hasta 10 microsegundos -------------------------------------------------. desde 4 microsegundos hasta 20 segu ndos. . . Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal . R_ContB R_ContC ENDC . . .INC" **************************** ***** . ciclo máquina tarda 4 x 1/4MHz = 1 s.W addlw '0' . . de cuarzo a 4 MHz. Se hace con un "goto" . . para n o sobrecargar la pila. El número se pas a a carácter ASCII sumándole goto LCD_FinVisualizaDigito . sublw 0x09 . el ASCII del cero y lo visualiza.**************************** Librería "RETARDOS. Como cada ciclo máquina son 4 ciclos de reloj. .W addlw 'A'-0x0A . . el retorno de subrutina . Además se pueden implementar otras subrutinas muy fácilmente. Lo guarda. . LCD_EnviaByteLetra movf LCD_Auxiliar1. LCD_Nibble andlw b'00001111' . .C goto LCD_EnviaByteLetra movf LCD_Auxiliar1. Librería con múltiples subrutinas de retardos. . Y visualiza el carácter. . Se queda con la parte baja. "cm" significa "ciclos máquina". La llamada "call" aporta 2 cic . .Si (W)=b'10101110'. . A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 M HZ. btfss STATUS..

goto RetardoMicros . Aporta 1 ciclo máquina. Retardo_500micros . goto RetardoMicros . nop . Retardo_200micros . nop . . Este es el valor de "K". El salto del retorno a porta 2 ciclos máquina. Aporta 1 ciclo máquina. goto RetardoMicros . Aporta 2 ciclos máquina.los máquina. Este es el valor de "K". nop . . movlw d'64' . goto RetardoMicros . Aporta 2 ciclos máquina. Retardo_20micros . 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina. La llamada "call" aporta 2 cic los máquina. . Retardo_5micros . Retardo_4micros . RetardoMicros movwf R_ContA . Aporta 1 ciclo máquina. Este es el valor de "K". La llamada "call" aporta 2 cic los máquina. Retardo_50micros . Aporta 1 ciclo máquina. . Aporta 1 ciclo máquina. Aporta 1 ciclo máquina. Aporta 1 ciclo máquina. nop . Este es el valor de "K". movlw d'31' . Aporta 1 ciclo máquina. Aporta 1 ciclo máquina. Aporta 1 ciclo máquina. movlw d'164' . El próximo bloque "RetardoMicros" tarda: . La llamada "call" aporta 2 cic los máquina. Aporta 2 ciclos máquina. movlw d'14' . nop . Aporta 1 ciclo máquina. La llamada "call" aporta 2 cic los máquina. Rmicros_Bucle . La llamada "call" aporta 2 cic los máquina. movlw d'5' . nop . nop . La llamada "call" aporta 2 cic los máquina. RETARDOS de 20 hasta 500 microsegundos ----------------------------------------------. return . Este es el valor de "K". nop . . Aporta 1 ciclo máquina. nop . Aporta 1 ciclo máquina. Aporta 1 ciclo máquina. Aporta 2 ciclos máquina. Aporta 1 ciclo máquina. Retardo_100micros . La llamada "call" aporta 2 cic los máquina.

movlw d'1' . movlw d'10' .F . La llamada "call" apor ta 2 ciclos máquina. La llamada "call" aporta 2 cic los máquina. return . La llamada "call" aporta 2 cic los máquina.Retardo_20micros : 2 + 1 + (2 + 3K) = 20 cm = 20 s. . Aporta 2 ciclos máquina. . Aporta 2 ciclos máquina. Aporta 1 ciclo máquina. Aporta 1 ciclo máquina.decfsz R_ContA. goto Retardos_ms . La llamada "call" aporta 2 cic los máquina. Aporta 1 ciclo máquina. . La llamada "call" apor ta 2 ciclos máquina. Aporta 2 ciclos máquina. . La llamada "call" apor ta 2 ciclos máquina. . Aporta 2 ciclos máquina. goto Retardos_ms . . (para K= 64 y 4 MHz). Aporta 1 ciclo máquina. goto Retardos_ms . goto Retardos_ms . goto Retardos_ms .Retardo_200micros: 2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 s. Retardo_2ms . movlw d'200' . Retardo_200ms .En total estas subrutinas tardan: . Este es el valor de "M". Retardo_100ms . La llamada "call" aporta 2 cic los máquina. (K-1)x1 cm (cuando no salta) + 2 cm (al saltar). El salto del retorno a porta 2 ciclos máquina. Este es el valor de "M". (para K= 14 y 4 MHz). movlw d'2' . Este es el valor de "M". . Este es el valor de "M". . Retardo_1ms .Retardo_500micros: 2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 s. . Aporta 2 ciclos máquina. Este es el valor de "M". Retardo_10ms . Retardo_5ms . (para K= 5 y 4 MHz). .Retardo_50micros : 2 + 1 + 1 + 2 + (2 + 3K) = 50 cm = 50 s. movlw d'20' . goto Retardos_ms . goto Retardos_ms . Aporta 1 ciclo máquina. Aporta 2 ciclos máquina. RETARDOS de 1 ms hasta 200 ms. Aporta 1 ciclo máquina. . Aporta 2 ciclos máquina. (para K=164 y 4 MHz). (para K= 31 y 4 MHz). La llamada "call" aporta 2 cic los máquina. .Retardo_100micros: 2 + 1 + 2 + (2 + 3K) = 100 cm = 100 s. Retardo_50ms . ------------------------------------------------------. Retardo_20ms . Aporta 1 ciclo máquina. movlw d'100' . movlw d'50' . movlw d'5' . Este es el valor de "M". Este es el valor de "M". Aporta 1 ciclo máquina. . Aporta (K-1)x2 ciclos máquina. Este es el valor de "M". . goto Rmicros_Bucle .

. Aporta Mx1 ciclos máquina. que a 4 MHz son 1002 s = 1 ms.Retardo_20ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 20007 cm = 20 ms. (M=200 y K=249). Retardo_10s . (M= 5 y K=249). (M= 10 y K=249). Aporta (K-1)xMx2 ciclos máquina. Este es el valor de "N". . Para K=249 y M=1 supone 1002 ciclos máquina . (M=100 y K=249). goto Retardo_1Decima . R1ms_BucleInterno nop . Aporta 1 ciclo máquina. La llamada "call" apor ta 2 ciclos máquina. Aporta Mx1 ciclos máquina. . goto R1ms_BucleExterno . . Aporta 1 ciclo máquina. RETARDOS de 0. Retardos_ms movwf R_ContB . . La llamada "call" apor ta 2 ciclos máquina. (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar). . . (M= 1 y K=249). Aporta (M-1)x2 ciclos máquina. . Retardo_5s .5 hasta 20 segundos -------------------------------------------------.Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. Aporta 2 ciclos máquina. Aporta 2 ciclos máquina. Retardo_20s .Retardo_2ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 2007 cm = 2 ms. . . .Retardo_5ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 5007 cm = 5 ms. return . ..F . Este es el valor de "N". movlw d'50' . . goto Retardo_1Decima . La llamada "call" apor ta 2 ciclos máquina.Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms.Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. movlw d'200' . 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 = . . . R1ms_BucleExterno movlw d'249' . Este es el valor de "N". Este es el valor de "K". Aporta 1 ciclo máquina. (M= 20 y K=249). . (M-1)x1 cm (cuando no salta) + 2 cm (al saltar). . El salto del retorno a porta 2 ciclos máquina. El próximo bloque "Retardos_ms" tarda: . decfsz R_ContB. = (2 + 4M + 4KM) ciclos máquina. (M= 50 y K=249).F . decfsz R_ContA. goto Retardo_1Decima . goto R1ms_BucleInterno . . movwf R_ContA . Aporta 2 ciclos máquina. .Retardo_50ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 50007 cm = 50 ms. movlw d'100' . Aporta KxMx1 c iclos máquina.Retardo_10ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 10007 cm = 10 ms. . (M= 2 y K=249). Aporta 1 ciclo máquina.En total estas subrutinas tardan: . . .

(N-1)x1 cm (cuando no salta) + 2 cm (al saltar). (N= 5. (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar). Aporta Nx1 ciclos máquina. M=100 y K=249). La llamada "call" apor ta 2 ciclos máquina. (N=200. . . decfsz R_ContA. Retardo_1Decima movwf R_ContC . Aporta (N-1)x2 ciclos máquina. + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 = .En total estas subrutinas tardan: . Este es el valor de "N". Aporta 1 ciclo máquina.5 s. R1Decima_BucleInterno nop . . Aporta MxNx1 ciclos máquina. . Aporta 1 ciclo máquina. M=100 y K=249). . movlw d'20' . Aporta 2 ciclos máquina. El próximo bloque "Retardo_1Decima" tarda: . R1Decima_BucleExterno2 movlw d'100' .Retardo_1s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 cm = 1 s.F . . movwf R_ContB . . . movlw d'5' . . Aporta 1 ciclo máquina. Este es el valor de "N".1 s = 1 décima de segundo.Retardo_10s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s. goto R1Decima_BucleExterno . El salto del retorno a porta 2 ciclos máquina. goto R1Decima_BucleExterno2 . decfsz R_ContC. Retardo_1s .F . . .F .Retardo_2s . . M=100 y K=249).Retardo_20s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s. (N=100. Aporta (K-1)xMxNx2 ciclos máquina. Retardo_500ms . return . . (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar). goto R1Decima_BucleInterno . M=100 y K=249). M=100 y K=249). = (2 + 4M + 4MN + 4KM) ciclos máquina. Aporta 1 ciclo máquina. goto Retardo_1Decima . Aporta 2 ciclos máquina. Aporta Nx1 ciclos máquina. movlw d'10' . goto Retardo_1Decima . Este es el valor de "M". Para K=249. Est e es el valor de "K". . (N= 10. . . . La llamada "call" apor ta 2 ciclos máquina. . Aporta MxNx1 ciclos máquina. 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 + . . (N= 50. . Aporta KxMxNx1 ciclos máquina. . M=100 y K=249). M=100 y N=1 supone 100011 . R1Decima_BucleExterno movlw d'249' . ciclos máquina que a 4 MHz son 100011 s = 100 ms = 0. movwf R_ContA .Retardo_5s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 cm = 5 s.Retardo_2s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 cm = 2 s.Retardo_500ms: 2 + 1 + (2 + 4N + 4MN + 4KMN) = 500025 cm = 0. La llamada "call" aporta 2 cic los máquina. . (N= 20. Aporta (M-1)xNx2 ciclos máquina. . Este es el valor de "N". decfsz R_ContB.

ZONA DE DATOS **************************************************************** ***** CBLOCK LCD_Dato LCD_GuardaDato LCD_GuardaTRISB LCD_Auxiliar1 LCD_Auxiliar2 ENDC LCD_CaracteresPorLinea EQU línea de la pantalla.16 . Pin RS del LCD a la línea RA0 del PIC. #DEFINE #DEFINE #DEFINE #DEFINE LCD_PinRS LCD_PinRW LCD_PinEnable LCD_BusDatos PORTA. RETARDOS. . En caso de que esté conectado le indica . . Las 8 líneas de datos del módulo LCD. . que se . líneas por 16 caracteres. Configura las líneas conectadas al pines RS. produce reset por soft ware. . bcf LCD_PinEnable bcf LCD_PinRW bcf STATUS. El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 8 bits .INC.1 PORTA.2 PORTB . Las . bcf LCD_PinRS . .0 PORTA. conexiones son: . Pin R/W del LCD a la línea RA1 del PIC. Pin Enable del LCD a la línea RA2 del PIC. . . Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la libre ría . .**************************** Librería "LCD_8BIT. Inicialización del módulo LCD: Configura funciones del LCD. Número de caracteres por . . Subrutina "LCD_Inicializa" ----------------------------------------------------------. compatible con el modelo LM016L. LCD_Inicializa bsf STATUS.RP0 .INC" **************************** ******* . . o a masa. pines <DB7:DB0> se conectan al Puerto B. Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2 . borra memoria y enciende pantalla. El fabricante especifica que para garantiza r la . ..RP0 bcf LCD_PinRW . . configuración inicial hay que hacerla como sigue: . R/W y E.

Pantalla encendida y l . . Cursor en modo increme ntar. de la línea 1. Dirección 54h de la DDRA M . Cursor al prin cipio de la Línea 1. Dirección 00h de la DDRA M goto LCD_EnviaComando LCD_Linea2 . Este retardo es necesario para . LCD de 2 líneas y caracteres de . movlw b'00110000' call LCD_Envia call Retardo_20micros simular en PROTEUS.Los comandos que pueden ser ejecutados son: . . movlw b'00000110' goto LCD_EnviaComando LCD_Linea1 .va a escribir en el LCD. Interface de 8 bits. call Retardo_200ms movlw b'00111000' call LCD_Envia LCD. Escribe el dato en el . movlw b'11000000' . . Cursor al prin cipio de la Línea 3 movlw b'10010100' . bcf LCD_PinRS poniendo RS=0. call LCD_Borra impia. Subrutinas variadas para el control del módulo LCD ---------------------------------------. Ahora configura el resto de los parámetros: call LCD_2Lineas8Bits5x7 5x7 puntos. . Cursor apagado. Cursor al prin cipio de la Línea 2. bus de 8. Activa el Modo Comando . Cursor al prin cipio de la Línea 4 movlw b'11010100' . LCD_CursorIncr . Cursor en modo incrementar. bcf LCD_PinEnable del LCD poniendo E=0. . movlw b'10000000' . Dirección 14h de la DDRA M goto LCD_EnviaComando LCD_Linea4 . Impide funcionamiento . Cursor al principio call LCD_CursorOFF call LCD_CursorIncr return . call Retardo_5ms movlw b'00110000' call LCD_Envia call Retardo_200micros movlw b'00110000' call LCD_Envia call Retardo_200micros simular en PROTEUS. Este retardo es necesario para . Dirección 40h de la DDRA M goto LCD_EnviaComando LCD_Linea3 .

"LCD_EnviaComando". a partir de la iorlw b'10000000' M más el valor del goto LCD_EnviaComando LCD_PosicionLinea2 Línea 2. Cursor a posición de la . Pantalla encendida y c .RP0 . La palabra de . registro W. poniendo RS=0. movlw b'00001110' goto LCD_EnviaComando LCD_CursorOFF ursor apagado. Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ----------------------------------. Borra toda la .goto LCD_EnviaComando LCD_PosicionLinea1 Línea 1. de 5x7 puntos y conexión . comando ha sido entregada a través del registro W. Pantalla apaga . Cursor a posición de la . . cursor a principio de . a partir de la iorlw b'11000000' M más el valor del goto LCD_EnviaComando LCD_OFF da. Pantalla encendida y c . call LCD_CodigoCGROM . movlw b'00001000' goto LCD_EnviaComando LCD_CursorON ursor encendido. Trabaja en Modo Dato. Acceso al Banc o 1. Trabaja en Modo Comando. goto LCD_EnviaComando . . . 8 bits. movwf LCD_GuardaTRISB . Activa el Modo Comando. . con caracteres movlw b'00111000' al PIC mediante bus de . . dirección 40h de la DDRA . movf TRISB. . memoria DDRAM y pone el movlw b'00000001' la línea 1. Obtiene el código para correcta visualización. Escribe un comando en el registro del módulo LCD. goto LCD_EnviaComando LCD_2Lineas8Bits5x7 2 líneas. Guarda el dato a enviar. "LCD_Caracter". bsf STATUS. LCD_Envia movwf LCD_GuardaDato . Guarda la configuración que tenía antes TRISB. LCD_EnviaComando bcf LCD_PinRS . Define la pantalla de . goto LCD_Envia LCD_Caracter bsf LCD_PinRS . a través del registro W. poniendo RS=1. registro W. movlw b'00001100' goto LCD_EnviaComando LCD_Borra pantalla. Activa el "Mod o Dato". Escribe en la memoria DDRAM del LCD el carácter ASCII introducid o a . dirección 00h de la DDRA .W .

la configuración del Puerto B. . Debe garantizar una co .clrf bcf o 0. No es "Ñ". TRISB STATUS. LCD_CodigoCGROM movwf LCD_Dato rácter y comprueba si es LCD_EnheMinuscula sublw 'ñ' btfss STATUS. ¿Es la "Ñ"? .RP0 o 1. el códig o . Entrada: En (W) el código ASCII del carácter que se desea visualizar. . . . Permite funcionamiento . goto LCD_FinCGROM . Acceso al Banc . a códigos CGROM par a que . . "º" y otros. Recupera el dato a enviar. Puerto B como salida. . . Guarda el valor del ca . Así por ejemplo. . btfss LCD_PinRS rrecta escritura manteniendo call Retardo_20ms modo cáracter. tabla CGROM del LM016L no coinciden con los códigos ASCII. la "Ñ" mayúscula en la CGR . que puedan ser visualizado en el módulo LM016L. . No es "ñ". .Z goto LCD_Grado movlw b'11101110' o hay símbolo para movwf LCD_Dato OM). Acceso al Banc . Acceso al Banc . call Retardo_50micros return . Código CGROM de la "ñ". Esta subrutina convierte los códigos ASCII de la "Ñ". A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la . . ¿Es la "ñ"? . .RP0 . sublw 'Ñ' btfss STATUS. . un carácter especial. Recupera el código ASCII .W movwf LCD_BusDatos bsf LCD_PinEnable del LCD mediante un pequeño nop bcf LCD_PinEnable endo el funcionamiento del LCD. pulso y termina impidi . bsf STATUS. ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh. (N . Restaura el antiguo valor en movf LCD_GuardaTRISB. Envía el dato al módulo LCD.W movwf TRISB bcf STATUS.RP0 o 0. Subrutina "LCD_CodigoCGROM" ---------------------------------------------------------.Z goto LCD_EnheMayuscula movlw b'11101110' movwf LCD_Dato goto LCD_FinCGROM LCD_EnheMayuscula movf LCD_Dato. Código CGROM de la "ñ".W de entrada. 2 ms en modo comando y 50 s en movf LCD_GuardaDato. . Salida: En (W) el código definido en la tabla CGROM. .

. Esto es un esp . Subrutina "LCD_Byte" igual que la anterior. visualiza " E" (un espacio blanco delante). sublw btfss goto movlw . No es "º".1 goto LCD_EnviaBlancos LCD_DosEspaciosBlancos movlw . movwf LCD_FinCGROM movf . . Visualiza tanto espacios en bl . . haya cargado en (LCD_Auxiliar1 . lugar actual de la pantalla. Subrutina "LCD_ByteCompleto".Z LCD_FinCGROM b'11011111' LCD_Dato LCD_Dato. goto LCD_EnviaOtroBlanco return . LCD_LineaEnBlanco movlw LCD_CaracteresPorLinea goto LCD_EnviaBlancos LCD_UnEspacioBlanco movlw . pero en caso de que el nibble alto sea cero .LCD_Grado movf de entrada.F ). Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" ------------------------------. Visualiza espacios en blanco. Recupera el código ASCII . (LCD_Auxiliar1) se utiliza com . y si (W)=b'00001110'. Subrutinas "LCD_ByteCompleto" y "LCD_Byte" ------------------------------------------. . Por ejemplo. call LCD_Caracter anco como se decfsz LCD_Auxiliar1. Guarda el valor de entrada. . ¿Es el símbolo "º"? . return LCD_Dato. En (W) el código buscado . LCD_Byte movwf LCD_Auxiliar2 . Utilizan la subrutina "LCD_Nibble" que se analiza más adelante. visualiza el byte que almacena el registro W en el . visualiza en su lugar un espacio en blanco.2 goto LCD_EnviaBlancos LCD_TresEspaciosBlancos movlw . Por ejemplo si (W)=b'10101110' vis ualiza "AE" .W 'º' STATUS. . . Código CGROM del símbolo "º" . . .3 LCD_EnviaBlancos movwf LCD_Auxiliar1 o contador. si (W)=b'10101110' visualiza "AE". LCD_EnviaOtroBlanco movlw ' ' acio en blanco.W .

Sí. Ejemplos: . para n o sobrecargar la pila. . El nibble alto de W no es tenido en cuenta. por tanto. .INC" **************************** **** . . Subrutina "LCD_Nibble" --------------------------------------------------------------. movwf LCD_Auxiliar1 . btfss STATUS. LCD_EnviaByteLetra movf LCD_Auxiliar1. Se queda con la parte baja. . btfss STATUS.Si (W)=b'01010110'. Lo guarda. return . Repite el proceso con el nibbl . . . Librería de subrutinas para el manejo de mensajes a visualizar en un visualizado r LCD. se visualizará "E". . Pone el nibble alto en la part . Se hace con un "goto" . Analiza si el nibble a . El número se pas a a carácter ASCII sumándole goto LCD_FinVisualizaDigito . LCD_Nibble andlw b'00001111' . Lo visualiza. CBLOCK . el valor hexadecimal que almacena en el nibble . sublw 0x09 . .Si (W)=b'10101110'. Y visualiza el carácter.W e bajo. Comprueba si hay que r epresentarlo con letra. . se le sum a el ASCII de la 'A'.W addlw '0' .C goto LCD_EnviaByteLetra movf LCD_Auxiliar1. el ASCII del cero y lo visualiza.andlw b'11110000' lto es cero. No es cero y lo visualiza. . Visualiza un e . Lo visualiza. se visualizará "6".W e baja. . call LCD_Nibble . . LCD_FinVisualizaDigito goto LCD_Caracter . bajo del registro W. Visualiza en el lugar actual de la pantalla.Z goto LCD_VisualizaAlto movlw ' ' spacio en blanco.**************************** Librería "LCD_MENS. . Guarda el valor de entrada. call LCD_Nibble LCD_VisualizaBajo movf LCD_Auxiliar2.W addlw 'A'-0x0A . Si es cero lo apaga. call LCD_Caracter goto LCD_VisualizaBajo LCD_ByteCompleto movwf LCD_Auxiliar2 LCD_VisualizaAlto swapf LCD_Auxiliar2.

Los mensajes tienen que estar situados dentro de las 256 primeras posiciones d e la . . decf LCD_ApuntaCaracter. visualizar. Posición inicial del mensaje. Guarda el valor de carácter.. . Mensajes . Compensa la posición que ocupa "addwf PC L. . . . movlw Mensaje0 . Lo único que hace es posicionar flag Z. Visualiza el mensaje. ..LCD_ApuntaCaracter arácter a visualizar to del comienzo de todos los mensajes.F . (posic ión de la etiqueta "Mensajes"). . Carga la posición del me nsaje. de mensaje. . Posición del primer carácter del m ensaje. respec . .". 0x00 . FinMensajes . ¡Etiqueta obliga toria! .F . .W call Mensajes . . es decir. . LCD_ValorCaracter a ENDC . Mensaje terminado en 0 x00. Halla la posición relati va del primer carácter subwf LCD_ApuntaCaracter.F . que sea "0x00". movf LCD_ValorCaracter. Subrutina "LCD_Mensaje" -------------------------------------------------------------. .Z . Código ASCII del carácter . Obtiene el código ASCII del carácter apuntado. movwf LCD_ValorCaracter .F". del mensaje respecto de etiqueta "Mens ajes". movlw Mensajes . tenga la siguiente estructura: . LCD_VisualizaOtroCaracter movf LCD_ApuntaCaracter. no pueden superar la dirección 0FFh. . Mensaje0 . . . memoria de programa. Indica la posición del c . sale fuera. DT ". . La llamada a esta subrutina se realizará siguiendo este ejemplo: ...F . addwf PCL. . Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta " Mensajes" y que . En caso btfsc STATUS. Mensaje1 ... . Visualiza por pantalla el mensaje apuntado por el registro W. que es código indicador final goto LCD_FinMensaje . LCD_Mensaje movwf LCD_ApuntaCaracter . call LCD_Mensaje .

movlw Mensajes va del primer carácter subwf LCD_ApuntaCaracter. subwf LCD_CursorPosicion. call LCD_Borra osición de la línea 1 y LCD_VisualizaCaracter movlw LCD_CaracteresPorLinea . Visualiza el carácter ASCII leído.W call Mensajes arácter apuntado. . Posición del primer carácter del m . L. al principio y al final para . . . movf LCD_ApuntaCaracter.Z goto LCD_NoEsFinalLinea LCD_EsFinalLinea call Retardo_200ms e este tiempo. . ¿Ha llegado a final de línea? .F . en una línea. Apunta a la posición del siguiente carácte r goto LCD_VisualizaOtroCaracter . incf LCD_ApuntaCaracter. Visualiza*un mensaje de mayor longitud que los 16 caracteres que pueden repres entarse . LCD_FinMensaje return . En el mensaje debe dejarse 16 espacios en blanco. conseguir que el desplazamiento del mensaje sea lo más legible posible. visualizado subwf LCD_ApuntaCaracter. que será el primero en la s . Vuelve al prog rama principal. por tanto se desplaza a través de la pantalla. movwf LCD_ValorCaracter movf LCD_ValorCaracter. Se sitúa en la primera p . LCD_PrimeraPosicion clrf LCD_CursorPosicion línea.W btfss STATUS.F . El cursor en la posición 0 de la . de desplazamiento haci . .F . para produ . ensajes". visualización de línea. Contabiliza la posición del cursor dentro de la ENDC . dentro del mensaje.F . Subrutina "LCD_MensajeMovimiento" ---------------------------------------------------.F . pantalla LCD LCD_MensajeMovimiento movwf LCD_ApuntaCaracter ensaje. Obtiene el ASCII del c . Lo mantiene visualizado durant Apunta a la posición del segundo carácter en pantalla.LCD_NoUltimoCaracter call LCD_Caracter . decf LCD_ApuntaCaracter. call Retardo_200ms movlw LCD_CaracteresPorLinea-1. borra la pantalla.F". Halla la posición relati del mensaje respecto de la etiqueta "M Compensa la posición que ocupa "addwf PC . . CBLOCK LCD_CursorPosicion . Guarda el valor de carácter. Lo único que hace es posicionar . iguiente goto LCD_PrimeraPosicion cir el efecto LCD_NoEsFinalLinea a la izquierda.

. que es . goto LCD_VisualizaCaracter r LCD_FinMovimiento return rama principal. . que sea "0x00". cursor . . Vuelve a visualizar el siguiente carácte .Z código indicador final goto LCD_FinMovimiento LCD_NoUltimoCaracter2 call LCD_Caracter incf LCD_CursorPosicion.F l en la pantalla. Contabiliza el incremento de posición de . En caso btfsc STATUS.F lizar. incf LCD_ApuntaCaracter. . de la línea.flag Z. de mensaje. sale fuera. Apunta a la siguiente posición por visua . Visualiza el carácter ASCII leído. Vuelve al prog .

Sign up to vote on this title
UsefulNot useful