Vous êtes sur la page 1sur 20

;**************************** Librera "LCD_4BIT.

INC" **************************** ******* ; ; Estas subrutinas permiten realizar las tareas bsicas de control de un mdulo LCD de 2 ; lneas 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 lneas superiores del mdulo LCD, pines <DB7:DB4> se conectan a las 4 ; lneas superiores del Puerto B del PIC, pines <RB7:RB4>. ; Pin RS del LCD a la lnea RA0 del PIC. ; Pin R/W del LCD a la lnea RA1 del PIC, o a masa. ; Pin Enable del LCD a la lnea RA2 del PIC. ; ; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la libre ra ; RETARDOS.INC. ; ; ZONA DE DATOS **************************************************************** ***** CBLOCK LCD_Dato LCD_GuardaDato LCD_GuardaTRISB LCD_Auxiliar1 LCD_Auxiliar2 ENDC LCD_CaracteresPorLinea EQU lnea de la pantalla. #DEFINE #DEFINE #DEFINE #DEFINE LCD_PinRS LCD_PinRW LCD_PinEnable LCD_BusDatos PORTA,0 PORTA,1 PORTA,2 PORTB .16 ; Nmero de caracteres por

; Subrutina "LCD_Inicializa" ----------------------------------------------------------; ; Inicializacin del mdulo LCD: Configura funciones del LCD, produce reset por soft ware, ; borra memoria y enciende pantalla. El fabricante especifica que para garantiza r la ; configuracin inicial hay que hacerla como sigue: ; LCD_Inicializa bsf STATUS,RP0 ; Configura las lneas 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 parmetros: 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 lneas y caracteres de ; Pantalla encendida y l ; de la lnea 1. Cursor apagado. ; Cursor en modo incrementar.

; Subrutina "LCD_EscribeLCD" ---------------------------------------------------------; ; Enva el dato del registro de trabajo W al bus de dato y produce un pequeo pulso en el pin ; Enable del LCD. Para no alterar el contenido de las lneas de la parte baja del Puerto B que ; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas lneas y des pus 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 tena antes movwf movlw del Puerto B se que haba antes. STATUS,RP0 TRISB,W TRISB. LCD_GuardaTRISB b'00001111' dejan ; Se queda con el nibble ; que hay que enviar y l ; Lee la informacin actual de la ; del Puerto B, que no s ; Enviar la parte alta de ; y en l ; Acceso al Banc ; Guarda la configuracin ; Las 4 lneas inferiores

andwf PORTB,F uperiores como salida. bcf STATUS,RP0 o 0. ; movf LCD_Dato,W iar. movwf LCD_BusDatos bsf LCD_PinEnable del LCD mediante un pequeo bcf LCD_PinEnable endo el funcionamiento del LCD. bsf STATUS,RP0 o 1. Restaura el antiguo valor en movf LCD_GuardaTRISB,W movwf TRISB bcf STATUS,RP0 o 0. return

; como estaban y las 4 s ; Acceso al Banc ; Recupera el dato a env ; Enva el dato al mdulo LCD. ; Permite funcionamiento ; pulso y termina impidi ; Acceso al Banc ; la configuracin del Puerto B. ; Acceso al Banc

; Subrutinas variadas para el control del mdulo LCD ---------------------------------------; ;Los comandos que pueden ser ejecutados son: ; LCD_CursorIncr ; Cursor en modo increme ntar. movlw b'00000110' goto LCD_EnviaComando LCD_Linea1 ; Cursor al prin cipio de la Lnea 1. movlw b'10000000' ; Direccin 00h de la DDRA M goto LCD_EnviaComando LCD_Linea2 ; Cursor al prin cipio de la Lnea 2. movlw b'11000000' ; Direccin 40h de la DDRA M goto LCD_EnviaComando LCD_Linea3 ; Cursor al prin cipio de la Lnea 3 movlw b'10010100' ; Direccin 14h de la DDRA M goto LCD_EnviaComando LCD_Linea4 ; Cursor al prin cipio de la Lnea 4 movlw b'11010100' ; Direccin 54h de la DDRA M goto LCD_EnviaComando LCD_PosicionLinea1 ; Cursor a posicin de la Lnea 1, a partir de la iorlw b'10000000' ; direccin 00h de la DDRA M ms el valor del goto LCD_EnviaComando ; registro W. LCD_PosicionLinea2 ; Cursor a posicin de la Lnea 2, a partir de la iorlw b'11000000' ; direccin 40h de la DDRA M ms el valor del goto LCD_EnviaComando ; registro W. LCD_OFF ; Pantalla apaga

da. movlw b'00001000' goto LCD_EnviaComando LCD_CursorON ursor encendido. movlw b'00001110' goto LCD_EnviaComando LCD_CursorOFF ursor apagado. movlw b'00001100' goto LCD_EnviaComando LCD_Borra pantalla, memoria DDRAM y pone el movlw b'00000001' la lnea 1. goto LCD_EnviaComando LCD_2Lineas4Bits5x7 2 lneas, con caracteres movlw b'00101000' al PIC mediante bus de ; goto LCD_EnviaComando ; Pantalla encendida y c

; Pantalla encendida y c

; Borra toda la ; cursor a principio de ; Define la pantalla de ; de 5x7 puntos y conexin ; 4 bits.

; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ----------------------------------; ; "LCD_EnviaComando". Escribe un comando en el registro del mdulo LCD. La palabra de ; comando ha sido entregada a travs del registro W. Trabaja en Modo Comando. ; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carcter ASCII introducid o a ; a travs del registro W. Trabaja en Modo Dato. ; LCD_EnviaComando bcf LCD_PinRS ; Activa el Modo Comando, poniendo RS=0. goto LCD_Envia LCD_Caracter bsf LCD_PinRS ; Activa el "Mod o Dato", poniendo RS=1. call LCD_CodigoCGROM ; Obtiene el cdigo para correcta visualizacin. LCD_Envia movwf LCD_GuardaDato ; Guarda el dato a enviar. call LCD_EscribeLCD ; Primero enva el nibble alto. swapf LCD_GuardaDato,W ; Ahora enva el nibble bajo. Para ello pasa el ; nibble bajo del dato a enviar a parte alta del byte. call LCD_EscribeLCD ; Se enva al visualizador LCD. btfss LCD_PinRS ; Debe garantizar una co rrecta escritura manteniendo call Retardo_2ms ; 2 ms en modo comando y 50 s en modo cracter. call Retardo_50micros return ; Subrutina "LCD_CodigoCGROM" ---------------------------------------------------------; ; A partir del carcter ASCII nmero 127 los cdigos de los caracteres definidos en la

; o ; ; ; a ; ; ; ;

tabla CGROM del LM016L no coinciden con los cdigos ASCII. As por ejemplo, el cdig ASCII de la "" en la tabla CGRAM del LM016L es EEh. Esta subrutina convierte los cdigos ASCII de la "", "" y otros, a cdigos CGROM par que que puedan ser visualizado en el mdulo LM016L. Entrada: Salida: En (W) el cdigo ASCII del carcter que se desea visualizar. En (W) el cdigo definido en la tabla CGROM. ; Guarda el valor del ca ; un carcter especial. ; Es la ""? ; No es "". ; Cdigo CGROM de la "".

LCD_CodigoCGROM movwf LCD_Dato rcter y comprueba si es LCD_EnheMinuscula sublw '' btfss STATUS,Z goto LCD_EnheMayuscula movlw b'11101110' movwf LCD_Dato goto LCD_FinCGROM LCD_EnheMayuscula movf LCD_Dato,W de entrada. sublw '' btfss STATUS,Z goto LCD_Grado movlw b'11101110' o hay smbolo para movwf LCD_Dato OM). goto LCD_FinCGROM LCD_Grado movf LCD_Dato,W de entrada. sublw '' btfss STATUS,Z goto LCD_FinCGROM movlw b'11011111' . movwf LCD_Dato LCD_FinCGROM movf LCD_Dato,W . return

; Recupera el cdigo ASCII ; Es la ""? ; No es "". ; Cdigo CGROM de la "". (N ; la "" mayscula en la CGR

; Recupera el cdigo ASCII ; Es el smbolo ""? ; No es "". ; Cdigo CGROM del smbolo ""

; En (W) el cdigo buscado

; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" ------------------------------; ; Visualiza espacios en blanco. LCD_LineaEnBlanco movlw LCD_CaracteresPorLinea goto LCD_EnviaBlancos LCD_UnEspacioBlanco movlw .1 goto LCD_EnviaBlancos LCD_DosEspaciosBlancos movlw .2 goto LCD_EnviaBlancos

LCD_TresEspaciosBlancos movlw .3 LCD_EnviaBlancos movwf LCD_Auxiliar1 o contador. LCD_EnviaOtroBlanco movlw ' ' acio en blanco. call LCD_Caracter anco como se decfsz LCD_Auxiliar1,F ). goto LCD_EnviaOtroBlanco return

; (LCD_Auxiliar1) se utiliza com ; Esto es un esp ; Visualiza tanto espacios en bl ; haya cargado en (LCD_Auxiliar1

; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" ------------------------------------------; ; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el ; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE". ; ; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero ; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' vis ualiza "AE" ; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante). ; ; Utilizan la subrutina "LCD_Nibble" que se analiza ms adelante. ; LCD_Byte movwf LCD_Auxiliar2 ; Guarda el valor de entrada. andlw b'11110000' ; Analiza si el nibble a lto es cero. btfss STATUS,Z ; Si es cero lo apaga. goto LCD_VisualizaAlto ; No es cero y lo visualiza. movlw ' ' ; Visualiza un e spacio en blanco. call LCD_Caracter goto LCD_VisualizaBajo LCD_ByteCompleto movwf LCD_Auxiliar2 LCD_VisualizaAlto swapf LCD_Auxiliar2,W e baja. call LCD_Nibble LCD_VisualizaBajo movf LCD_Auxiliar2,W e bajo. ; call LCD_Nibble ; return ; Guarda el valor de entrada. ; Pone el nibble alto en la part ; Lo visualiza. ; Repite el proceso con el nibbl ; Lo visualiza.

; Subrutina "LCD_Nibble" --------------------------------------------------------------; ; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble ; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos: ; - Si (W)=b'01010110', se visualizar "6".

; - Si (W)=b'10101110', se visualizar "E". ; LCD_Nibble andlw b'00001111' ; Se queda con la parte baja. movwf LCD_Auxiliar1 ; Lo guarda. sublw 0x09 ; Comprueba si hay que r epresentarlo con letra. btfss STATUS,C goto LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw '0' ; El nmero se pas a a carcter ASCII sumndole goto LCD_FinVisualizaDigito ; el ASCII del cero y lo visualiza. LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw 'A'-0x0A ; S, por tanto, se le sum a el ASCII de la 'A'. LCD_FinVisualizaDigito goto LCD_Caracter ; Y visualiza el carcter. Se hace con un "goto" ; para n o sobrecargar la pila.

;**************************** Librera "RETARDOS.INC" **************************** ***** ; ; Librera con mltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segu ndos. ; Adems se pueden implementar otras subrutinas muy fcilmente. ; ; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal ; de cuarzo a 4 MHz. Como cada ciclo mquina son 4 ciclos de reloj, resulta que ca da ; ciclo mquina tarda 4 x 1/4MHz = 1 s. ; ; En los comentarios, "cm" significa "ciclos mquina". ; ; ZONA DE DATOS **************************************************************** ***** CBLOCK R_ContA tardos. R_ContB R_ContC ENDC ; ; RETARDOS de 4 hasta 10 microsegundos -------------------------------------------------; ; A continuacin retardos pequeos teniendo en cuenta que para una frecuencia de 4 M HZ, ; la llamada a subrutina "call" tarda 2 ciclos mquina, el retorno de subrutina ; "return" toma otros 2 ciclos mquina y cada instruccin "nop" tarda 1 ciclo mquina. ; Retardo_10micros ; La llamada "call" aporta 2 cic ; Contadores para los re

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

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

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

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

;**************************** Librera "LCD_8BIT.INC" **************************** ******* ; ; Estas subrutinas permiten realizar las tareas bsicas de control de un mdulo LCD de 2 ; lneas por 16 caracteres, compatible con el modelo LM016L. ; ; El visualizador LCD est conectado al Puerto B del PIC mediante un bus de 8 bits . Las ; conexiones son: ; Las 8 lneas de datos del mdulo LCD, pines <DB7:DB0> se conectan al Puerto B. ; Pin RS del LCD a la lnea RA0 del PIC. ; Pin R/W del LCD a la lnea RA1 del PIC, o a masa. ; Pin Enable del LCD a la lnea RA2 del PIC. ; ; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la libre ra ; RETARDOS.INC. ; ; ZONA DE DATOS **************************************************************** ***** CBLOCK LCD_Dato LCD_GuardaDato LCD_GuardaTRISB LCD_Auxiliar1 LCD_Auxiliar2 ENDC LCD_CaracteresPorLinea EQU lnea de la pantalla. #DEFINE #DEFINE #DEFINE #DEFINE LCD_PinRS LCD_PinRW LCD_PinEnable LCD_BusDatos PORTA,0 PORTA,1 PORTA,2 PORTB .16 ; Nmero de caracteres por

; Subrutina "LCD_Inicializa" ----------------------------------------------------------; ; Inicializacin del mdulo LCD: Configura funciones del LCD, produce reset por soft ware, ; borra memoria y enciende pantalla. El fabricante especifica que para garantiza r la ; configuracin inicial hay que hacerla como sigue: ; LCD_Inicializa bsf STATUS,RP0 ; Configura las lneas 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 del LCD poniendo E=0. bcf LCD_PinRS poniendo RS=0. call Retardo_200ms movlw b'00111000' call LCD_Envia LCD. call Retardo_5ms movlw b'00110000' call LCD_Envia call Retardo_200micros movlw b'00110000' call LCD_Envia call Retardo_200micros simular en PROTEUS. movlw b'00110000' call LCD_Envia call Retardo_20micros simular en PROTEUS. ; Ahora configura el resto de los parmetros: call LCD_2Lineas8Bits5x7 5x7 puntos, bus de 8. call LCD_Borra impia. Cursor al principio call LCD_CursorOFF call LCD_CursorIncr return

; Impide funcionamiento ; Activa el Modo Comando

; Escribe el dato en el

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

; LCD de 2 lneas y caracteres de ; Pantalla encendida y l ; de la lnea 1. Cursor apagado. ; Cursor en modo incrementar.

; Subrutinas variadas para el control del mdulo LCD ---------------------------------------; ;Los comandos que pueden ser ejecutados son: ; LCD_CursorIncr ; Cursor en modo increme ntar. movlw b'00000110' goto LCD_EnviaComando LCD_Linea1 ; Cursor al prin cipio de la Lnea 1. movlw b'10000000' ; Direccin 00h de la DDRA M goto LCD_EnviaComando LCD_Linea2 ; Cursor al prin cipio de la Lnea 2. movlw b'11000000' ; Direccin 40h de la DDRA M goto LCD_EnviaComando LCD_Linea3 ; Cursor al prin cipio de la Lnea 3 movlw b'10010100' ; Direccin 14h de la DDRA M goto LCD_EnviaComando LCD_Linea4 ; Cursor al prin cipio de la Lnea 4 movlw b'11010100' ; Direccin 54h de la DDRA M

goto LCD_EnviaComando LCD_PosicionLinea1 Lnea 1, a partir de la iorlw b'10000000' M ms el valor del goto LCD_EnviaComando LCD_PosicionLinea2 Lnea 2, a partir de la iorlw b'11000000' M ms el valor del goto LCD_EnviaComando LCD_OFF da. movlw b'00001000' goto LCD_EnviaComando LCD_CursorON ursor encendido. movlw b'00001110' goto LCD_EnviaComando LCD_CursorOFF ursor apagado. movlw b'00001100' goto LCD_EnviaComando LCD_Borra pantalla, memoria DDRAM y pone el movlw b'00000001' la lnea 1. goto LCD_EnviaComando LCD_2Lineas8Bits5x7 2 lneas, con caracteres movlw b'00111000' al PIC mediante bus de ; goto LCD_EnviaComando

; Cursor a posicin de la ; direccin 00h de la DDRA ; registro W. ; Cursor a posicin de la ; direccin 40h de la DDRA ; registro W. ; Pantalla apaga

; Pantalla encendida y c

; Pantalla encendida y c

; Borra toda la ; cursor a principio de ; Define la pantalla de ; de 5x7 puntos y conexin ; 8 bits.

; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ----------------------------------; ; "LCD_EnviaComando". Escribe un comando en el registro del mdulo LCD. La palabra de ; comando ha sido entregada a travs del registro W. Trabaja en Modo Comando. ; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carcter ASCII introducid o a ; a travs del registro W. Trabaja en Modo Dato. ; LCD_EnviaComando bcf LCD_PinRS ; Activa el Modo Comando, poniendo RS=0. goto LCD_Envia LCD_Caracter bsf LCD_PinRS ; Activa el "Mod o Dato", poniendo RS=1. call LCD_CodigoCGROM ; Obtiene el cdigo para correcta visualizacin. LCD_Envia movwf LCD_GuardaDato ; Guarda el dato a enviar. bsf STATUS,RP0 ; Acceso al Banc o 1. movf TRISB,W ; Guarda la configuracin que tena antes TRISB. movwf LCD_GuardaTRISB

clrf bcf o 0. ;

TRISB STATUS,RP0

; Puerto B como salida. ; Acceso al Banc ; Recupera el dato a enviar. ; Enva el dato al mdulo LCD. ; Permite funcionamiento ; pulso y termina impidi ; Acceso al Banc ; la configuracin del Puerto B. ; Acceso al Banc ; Debe garantizar una co ; 2 ms en modo comando y 50 s en

movf LCD_GuardaDato,W movwf LCD_BusDatos bsf LCD_PinEnable del LCD mediante un pequeo nop bcf LCD_PinEnable endo el funcionamiento del LCD. bsf STATUS,RP0 o 1. Restaura el antiguo valor en movf LCD_GuardaTRISB,W movwf TRISB bcf STATUS,RP0 o 0. btfss LCD_PinRS rrecta escritura manteniendo call Retardo_20ms modo cracter. call Retardo_50micros return

; Subrutina "LCD_CodigoCGROM" ---------------------------------------------------------; ; A partir del carcter ASCII nmero 127 los cdigos de los caracteres definidos en la ; tabla CGROM del LM016L no coinciden con los cdigos ASCII. As por ejemplo, el cdig o ; ASCII de la "" en la tabla CGRAM del LM016L es EEh. ; ; Esta subrutina convierte los cdigos ASCII de la "", "" y otros, a cdigos CGROM par a que ; que puedan ser visualizado en el mdulo LM016L. ; ; Entrada: En (W) el cdigo ASCII del carcter que se desea visualizar. ; Salida: En (W) el cdigo definido en la tabla CGROM. LCD_CodigoCGROM movwf LCD_Dato rcter y comprueba si es LCD_EnheMinuscula sublw '' btfss STATUS,Z goto LCD_EnheMayuscula movlw b'11101110' movwf LCD_Dato goto LCD_FinCGROM LCD_EnheMayuscula movf LCD_Dato,W de entrada. sublw '' btfss STATUS,Z goto LCD_Grado movlw b'11101110' o hay smbolo para movwf LCD_Dato OM). goto LCD_FinCGROM ; Guarda el valor del ca ; un carcter especial. ; Es la ""? ; No es "". ; Cdigo CGROM de la "".

; Recupera el cdigo ASCII ; Es la ""? ; No es "". ; Cdigo CGROM de la "". (N ; la "" mayscula en la CGR

LCD_Grado movf de entrada. sublw btfss goto movlw . movwf LCD_FinCGROM movf . return

LCD_Dato,W '' STATUS,Z LCD_FinCGROM b'11011111' LCD_Dato LCD_Dato,W

; Recupera el cdigo ASCII ; Es el smbolo ""? ; No es "". ; Cdigo CGROM del smbolo ""

; En (W) el cdigo buscado

; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" ------------------------------; ; Visualiza espacios en blanco. LCD_LineaEnBlanco movlw LCD_CaracteresPorLinea goto LCD_EnviaBlancos LCD_UnEspacioBlanco movlw .1 goto LCD_EnviaBlancos LCD_DosEspaciosBlancos movlw .2 goto LCD_EnviaBlancos LCD_TresEspaciosBlancos movlw .3 LCD_EnviaBlancos movwf LCD_Auxiliar1 o contador. LCD_EnviaOtroBlanco movlw ' ' acio en blanco. call LCD_Caracter anco como se decfsz LCD_Auxiliar1,F ). goto LCD_EnviaOtroBlanco return

; (LCD_Auxiliar1) se utiliza com ; Esto es un esp ; Visualiza tanto espacios en bl ; haya cargado en (LCD_Auxiliar1

; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" ------------------------------------------; ; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el ; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE". ; ; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero ; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' vis ualiza "AE" ; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante). ; ; Utilizan la subrutina "LCD_Nibble" que se analiza ms adelante. ; LCD_Byte movwf LCD_Auxiliar2 ; Guarda el valor de entrada.

andlw b'11110000' lto es cero. btfss STATUS,Z goto LCD_VisualizaAlto movlw ' ' spacio en blanco. call LCD_Caracter goto LCD_VisualizaBajo LCD_ByteCompleto movwf LCD_Auxiliar2 LCD_VisualizaAlto swapf LCD_Auxiliar2,W e baja. call LCD_Nibble LCD_VisualizaBajo movf LCD_Auxiliar2,W e bajo. ; call LCD_Nibble ; return

; Analiza si el nibble a ; Si es cero lo apaga. ; No es cero y lo visualiza. ; Visualiza un e

; Guarda el valor de entrada. ; Pone el nibble alto en la part ; Lo visualiza. ; Repite el proceso con el nibbl ; Lo visualiza.

; Subrutina "LCD_Nibble" --------------------------------------------------------------; ; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble ; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos: ; - Si (W)=b'01010110', se visualizar "6". ; - Si (W)=b'10101110', se visualizar "E". ; LCD_Nibble andlw b'00001111' ; Se queda con la parte baja. movwf LCD_Auxiliar1 ; Lo guarda. sublw 0x09 ; Comprueba si hay que r epresentarlo con letra. btfss STATUS,C goto LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw '0' ; El nmero se pas a a carcter ASCII sumndole goto LCD_FinVisualizaDigito ; el ASCII del cero y lo visualiza. LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw 'A'-0x0A ; S, por tanto, se le sum a el ASCII de la 'A'. LCD_FinVisualizaDigito goto LCD_Caracter ; Y visualiza el carcter. Se hace con un "goto" ; para n o sobrecargar la pila. ;**************************** Librera "LCD_MENS.INC" **************************** **** ; ; Librera de subrutinas para el manejo de mensajes a visualizar en un visualizado r LCD. CBLOCK

LCD_ApuntaCaracter arcter a visualizar to del comienzo de todos los mensajes,

; Indica la posicin del c ; respec ; (posic

in de la etiqueta "Mensajes"). LCD_ValorCaracter a ENDC

; Cdigo ASCII del carcter ; visualizar.

; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones d e la ; memoria de programa, es decir, no pueden superar la direccin 0FFh. ; Subrutina "LCD_Mensaje" -------------------------------------------------------------; ; Visualiza por pantalla el mensaje apuntado por el registro W. ; ; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta " Mensajes" y que ; tenga la siguiente estructura: ; ; Mensajes ; Etiqueta obliga toria! ; addwf PCL,F ; Mensaje0 ; Posicin inicial del mensaje. ; DT ".. ..", 0x00 ; Mensaje terminado en 0 x00. ; Mensaje1 ; ... ; ... ; FinMensajes ; ; La llamada a esta subrutina se realizar siguiendo este ejemplo: ; ; movlw Mensaje0 ; Carga la posicin del me nsaje. ; call LCD_Mensaje ; Visualiza el mensaje. ; LCD_Mensaje movwf LCD_ApuntaCaracter ; Posicin del primer carcter del m ensaje. movlw Mensajes ; Halla la posicin relati va del primer carcter subwf LCD_ApuntaCaracter,F ; del mensaje respecto de etiqueta "Mens ajes". decf LCD_ApuntaCaracter,F ; Compensa la posicin que ocupa "addwf PC L,F". LCD_VisualizaOtroCaracter movf LCD_ApuntaCaracter,W call Mensajes ; Obtiene el cdigo ASCII del carcter apuntado. movwf LCD_ValorCaracter ; Guarda el valor de carcter. movf LCD_ValorCaracter,F ; Lo nico que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es cdigo indicador final goto LCD_FinMensaje ; de mensaje, sale fuera.

LCD_NoUltimoCaracter call LCD_Caracter ; Visualiza el carcter ASCII ledo. incf LCD_ApuntaCaracter,F ; Apunta a la posicin del siguiente carcte r goto LCD_VisualizaOtroCaracter ; dentro del mensaje. LCD_FinMensaje return ; Vuelve al prog rama principal. ; Subrutina "LCD_MensajeMovimiento" ---------------------------------------------------; ; Visualiza*un mensaje de mayor longitud que los 16 caracteres que pueden repres entarse ; en una lnea, por tanto se desplaza a travs de la pantalla. ; ; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para ; conseguir que el desplazamiento del mensaje sea lo ms legible posible. ; CBLOCK LCD_CursorPosicion ; Contabiliza la posicin del cursor dentro de la ENDC ; pantalla LCD LCD_MensajeMovimiento movwf LCD_ApuntaCaracter ensaje. movlw Mensajes va del primer carcter subwf LCD_ApuntaCaracter,F ; ensajes". decf LCD_ApuntaCaracter,F ; L,F". LCD_PrimeraPosicion clrf LCD_CursorPosicion lnea. call LCD_Borra osicin de la lnea 1 y LCD_VisualizaCaracter movlw LCD_CaracteresPorLinea ; subwf LCD_CursorPosicion,W btfss STATUS,Z goto LCD_NoEsFinalLinea LCD_EsFinalLinea call Retardo_200ms e este tiempo. call Retardo_200ms movlw LCD_CaracteresPorLinea-1; visualizado subwf LCD_ApuntaCaracter,F ; iguiente goto LCD_PrimeraPosicion cir el efecto LCD_NoEsFinalLinea a la izquierda. movf LCD_ApuntaCaracter,W call Mensajes arcter apuntado. movwf LCD_ValorCaracter movf LCD_ValorCaracter,F ; Posicin del primer carcter del m ; Halla la posicin relati del mensaje respecto de la etiqueta "M Compensa la posicin que ocupa "addwf PC ; El cursor en la posicin 0 de la ; Se sita en la primera p ; borra la pantalla. Ha llegado a final de lnea?

; Lo mantiene visualizado durant Apunta a la posicin del segundo carcter en pantalla, que ser el primero en la s ; visualizacin de lnea, para produ ; de desplazamiento haci ; Obtiene el ASCII del c ; Guarda el valor de carcter. ; Lo nico que hace es posicionar

flag Z. En caso btfsc STATUS,Z cdigo indicador final goto LCD_FinMovimiento LCD_NoUltimoCaracter2 call LCD_Caracter incf LCD_CursorPosicion,F l en la pantalla. incf LCD_ApuntaCaracter,F lizar. goto LCD_VisualizaCaracter r LCD_FinMovimiento return rama principal.

; que sea "0x00", que es ; de mensaje, sale fuera. ; Visualiza el carcter ASCII ledo. ; Contabiliza el incremento de posicin de ; cursor ; Apunta a la siguiente posicin por visua ; Vuelve a visualizar el siguiente carcte ; de la lnea. ; Vuelve al prog

Vous aimerez peut-être aussi