;muestra en LCD -MENSAJES en interfase de 4 bits- nombre del archivo lcd3--version 2 ;se usara 4 bits MSB del puertob para envio de datos a 4bits - RB4 RB5 RB6 RB7 respectivamente conectados a D4 D5 D6 D7 y RB0 RB1 a RS y E respectivamente- RW va a masa. ;--------------------------------------------------------------------- ;RECORDAR CAMBIAR DIRECCIONES DE REGISTROS DE PROPOSITO GENERAL A PARTIR DE 20h SI UTILIZA EL PIC 16F818 ;--------------------------------------------------------------------- list p=16f84 #include p16f84.inc ;---Listado de registros especiales utilizado en este programa-- portb equ 06h ;el puerto b esta en la posicion 06h de la ram porta equ 05h;el puerto b esta en la posicion 05h de la ram trisa equ 85h ;regis de config de puerto b esta en la direcc 85h de la ram trisb equ 86h ;regis de config de puerto b esta en la direcc 86h de la ram status equ 03h ;registro de estado esta en la direcc 03h de la ram ;---Fin de listado de registros especiales utilizado en este programa-- ;Comienza listado de registros de proposito general empleados en este programa ;--------------registros de subrutina retardo------------- temp5 equ 20h ;--------------Fin registros de subrutina retardo--------- ;--------------registros de subrutina INSTRUC/ESCRIB--------- aux equ 21h ;--------------Fin registros de subrutina INSTRUC/ESCRIB-------- ;------------- registros de subrutina espera y larga-------- tempo1 equ 26h tempo2 equ 28h tempo3 equ 2Ah ;------------- Fin registros de subrutina espera y largaespera------ ;--------Fin del listado de registros de proposito general empleados en este programa-------- ;------INICIO programa principal----- inicio bsf status,5 ;se posiciona en banco1 clrf trisb ;define el portb como salida movlw b'00001100' movwf trisa bcf status,5; se posiciona en banco 0 call lcd; se llama subrutina de inicializacion del LCD call copyright; escribe copyright call largaespera mostrar btfsc porta,2; si en el pin 2 del porta hay un 0 entonces muestra mensaje1-alternado con mensaje3 goto frase2 call mensaje1 call espera frase2 btfsc porta,3; si en el pin 3 del porta hay un 0 entonces muestra mensaje2-alternado con mensaje3 goto frase3 call mensaje2 call espera frase3 call copyright; si recibe un 0 en pines 2 y 3 de porta muestra mensaje3 call espera goto mostrar ;---fin programa principal----------- ;--------SUBRUTINAS------------- ;-------Subrutina LCD ------------------------------------ ;esta subrutina inicia la pantalla LCD ;esta subrutina no utiliza registros de proposito general lcd movlw 02h; carga w con literal 02h RB1=1 o sea E=1 habilito LCD call instruc; enviaremos este valor al portb y por lo tanto al LCD ;------------otra instruccion----------- movlw 28h; carga w con literal 28h ;la intrucc asociada dice: interfase de datos de 4 bits y se va a usar 2 lineas - corresponde a la intruccion ACTIVAR FUNCION call instruc; enviaremos este valor al portb y por lo tanto al LCD ;------------otra instruccion----------- movlw 06h; carga w con literal 06h ;la intrucc asociada dice: dato fijo en pantalla- corresponde a la intruccion SELECCIONAR MODO call instruc; enviaremos este valor al portb y por lo tanto al LCD ;------------otra instruccion----------- movlw 0Ch; carga w con literal 0Ch ;la intrucc asociada dice: encienda la pantalla y desactive el cursor- corresponde a la intruccion ENCENDER O APAGAR PANTALLA call instruc; enviaremos este valor al portb y por lo tanto al LCD ;------------otra instruccion----------- movlw 01h; carga w con literal 01h ;la intrucc asociada dice: BORRAR PANTALLA call instruc; enviaremos este valor al portb y por lo tanto al LCD return ;esta subrutina inicio la pantalla LCD ;-------Fin Subrutina LCD -------- ;--------------------Subrutina INSTRC/ESCRIB------------------------- ;Subrutina que manda una instruccion o dato al LCD ;Esta subrutina utiliza el registro de proposito general aux instruc bcf portb,0; RB0=0 o sea RS=0 es una instruccion para LCD goto dato2 escrib bsf portb,0; RB0=1 o sea RS=1 es una dato para LCD dato2 ;lo que se va hacer es para no alterar el contenido de los 4 bit menos significativos dell portb movwf aux; guarda contenido de w en aux movlw 0fh; carga 00001111 en w andwf portb,1; AND entre w=00001111 y portb y guarda resultado en portb ;lo que se termino de hacer es para no alterar el contenido de los 4 bit menos significativos dell portb movf aux,0; carga aux en w andlw b'11110000'; AND entre literal 11110000 y w en el cual esta copiado aux (guarda el resultdado en w) iorwf portb,1; OR entre w y portb - guarda resultado en portb bsf portb,1; RB1=1 o sea E=1 habilito LCD call retardo bcf portb,1; RB1=E=0 deshabilita LCD call retardo ;---terminó envio 4 bit MSB------- ;---comienza el envio de 4 bit LSB--- movlw 0fh; carga 00001111 en w andwf portb,1; AND entre w=00001111 y portb - guarda resultado en portb swapf aux,0; intercambia NIBLES de aux y lo guarda en w andlw b'11110000'; AND entre literal 11110000 y w en el cual esta copiado aux con los NIBLES intercambiados (guarda el resultdado en w) iorwf portb,1; OR entre w y portb - guarda resultado en portb ;lo que se termino de hacer es para no alterar el contenido de los 4 bit menos significativos dell portb bsf portb,1; RB1=1 o sea E=1 habilito LCD call retardo call retardo bcf portb,1; RB1=E=0 deshabilita LCD call retardo ;---termino el envio de lo 4bit LSB--- return ;---------Fin subrutina que manda instruccion o dato al LCD------ ;------------------Fin Subrutina INSTRC/ESCRIB------------------------ ;----------------Subrutina retardo---------------------------------- ;Esta subrutina utiliza el registro de proposito general temp5 retardo movlw 0ffh; carga literal 0ffh en w movwf temp5; mueve contenido de w a temp5 decr decfsz temp5,1; decrementa temp5 y guarda resultado en temp5- salta la intruccion siguiente si temp5 es igual a cero goto decr movlw 0ffh; carga literal 0ffh en w movwf temp5; mueve contenido de w a temp5 decr2 decfsz temp5,1; decrementa temp5 y guarda resultado en temp5- salta la intruccion siguiente si temp5 es igual a cero goto decr2 return ;---------------- Fin Subrutina retardo---------------------------------- ;----------Subrutina largaespera - ----------------------- largaespera ;Escribe una E en display para indicar larga espera movlw 0C7h; call instruc movlw "E"; call escrib ;Termino de escribir la E retardo4 incf tempo1,1 retardo5 incf tempo2,1 retardo6 incf tempo3,1 btfss tempo3,7 goto retardo6 clrf tempo3 btfss tempo2,7 goto retardo5 clrf tempo2 btfss tempo1,7 goto retardo4 clrf tempo1 ;Llama reiteradas veces a subrutina espera -para incrementar espera ;Tanto como subrutina espera y largaespera utilizan los mismos registros de proposito general call espera call espera ; Termino de llamar reiteradas veces a subrutina espera ;Limpia la E en display que escribio al principio movlw 0C7h; call instruc movlw " "; call escrib ;Termino de limpiar la E return ;-----Fin subrutina largaespera----------------------- ;----------Subrutina espera -( Retardo general)-------- ;Esta subrutina utiliza los registros de proposito general- temp1-temp2-temp3 ;Son los mismos que utiliza la subrutina largaespera espera nop retardo1 incf tempo1,1 retardo2 incf tempo2,1 retardo3 incf tempo3,1 btfss tempo3,6 goto retardo3 clrf tempo3 btfss tempo2,5 goto retardo2 clrf tempo2 btfss tempo1,4 goto retardo1 clrf tempo1 return ;-------------------Fin subrutina espera------------ ;---Subrutina copyright----------- copyright movlw 80h; se indica posicion de memoria del LCD en que quiere escibir el dato call instruc movlw " "; call escrib movlw 81h; call instruc movlw "E"; call escrib ;repito con el resto de los caracteres movlw 82h; call instruc movlw "E"; call escrib movlw 83h; call instruc movlw "T"; call escrib movlw 84h; call instruc movlw " "; call escrib movlw 85h; call instruc movlw "5"; call escrib movlw 86h; call instruc movlw " "; call escrib movlw 87h; call instruc movlw " "; call escrib call espera call espera call espera call espera return ;---Fin subrutina copyright----------------------------------------------- ;---Subrutina mensaje1----------- mensaje1 movlw 01h ; call instruc; borrar pantalla movlw 80h; se indica posicion de memoria del LCD en que quiere escibir el dato call instruc movlw "R"; este es el primer caracter del mensaje - al estar entre comillas se le indica al compilador que el dato requerido s el valo ASCII del caracter call escrib ;repito con el resto de los caracteres movlw 81h; call instruc movlw "E"; call escrib movlw 82h; call instruc movlw "C"; call escrib movlw 83h; call instruc movlw "R"; call escrib movlw 84h; call instruc movlw "E"; call escrib movlw 85h; call instruc movlw "O"; call escrib movlw 86h; call instruc movlw "."; call escrib movlw 87h; call instruc movlw "."; call escrib movlw 88h; call instruc movlw "."; call escrib movlw 89h; call instruc movlw "."; call escrib movlw 8Ah; call instruc movlw "."; call escrib movlw 8Bh; call instruc movlw "."; call escrib call espera call espera call espera call espera return ;---Fin subrutina mensaje1----------------------------------------------- ;---Subrutina mensaje2----------- mensaje2 movlw 01h ; call instruc; borrar pantalla movlw 80h; se indica posicion de memoria del LCD en que quiere escibir el dato call instruc movlw "A"; este es el primer caracter del mensaje - al estar entre comillas se le indica al compilador que el dato requerido s el valo ASCII del caracter call escrib ;repito con el resto de los caracteres movlw 81h; call instruc movlw "L"; call escrib movlw 82h; call instruc movlw "A"; call escrib movlw 83h; call instruc movlw "R"; call escrib movlw 84h; call instruc movlw "M"; call escrib movlw 85h; call instruc movlw "A"; call escrib movlw 86h; call instruc movlw "."; call escrib movlw 87h; call instruc movlw "."; call escrib movlw 88h; call instruc movlw "."; call escrib movlw 89h; call instruc movlw "."; call escrib movlw 8Ah; call instruc movlw "."; call escrib movlw 8Bh; call instruc movlw "."; call escrib call espera call espera call espera call espera return ;---Fin subrutina mensaje2----------------------------------------------- ;--------FIN SUBRUTINAS------------- end