Sie sind auf Seite 1von 7

;**************************** Librera "LCD_4BIT.INC" **************************** ******* ; ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. Lpez.

www.pic16f84a.com ; Editorial Ra-Ma. www.ra-ma.es ; =================================================================== ; ; 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_GuardaTRISD LCD_Auxiliar1 LCD_Auxiliar2 ENDC LCD_CaracteresPorLinea EQU lnea de la pantalla. #DEFINE #DEFINE #DEFINE #DEFINE LCD_PinRS LCD_PinRW LCD_PinEnable LCD_BusDatos PORTB,0 PORTB,1 PORTB,2 PORTD .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 est conectado le indica va a escribir en el LCD. bcf LCD_PinEnable 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

; En caso de que ; que se ; Impide funcionamiento ; 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 que haba antes. bsf STATUS,RP0 ; 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

o 1. movf TRISD,W que tena antes TRISB. movwf LCD_GuardaTRISD movlw b'00001111' del Puerto B se dejan andwf PORTD,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_GuardaTRISD,W movwf TRISD bcf STATUS,RP0 o 0. return ; Guarda la configuracin ; Las 4 lneas inferiores ; 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 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_2Lineas4Bits5x7 2 lneas, con caracteres movlw b'00101000' al PIC mediante bus de ; goto LCD_EnviaComando

; 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 ; 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 ; 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 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 ; 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

; 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. ; ; ; ; ; =================================================================== Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" E. Palacios, F. Remiro y L. Lpez. www.pic16f84a.com Editorial Ra-Ma. www.ra-ma.es ===================================================================

Das könnte Ihnen auch gefallen