LIST P=16F877a
INCLUDE <P16f877a.INC>
;***Comienzo a definir variables***
; Oscilador utilizado 4MHz.-
; ************************************************
ByteAlto equ 0x20 ; Registro para guardar Byte alto de la conversion.-
ByteBajo equ 0x21 ; Regsitro para guardar Byte bajo de la conversion.-
Contador equ 0x22 ; registro utilizado en demora.-
ASCII_H EQU 0x2B
ASCII_M EQU 0x2C
ASCII_L EQU 0x2D
HEXADECIMAL EQU 0x23 ;GUARDA EL DATOS DEL SENSOR
NUMASCCII EQU 0x24 ;RESULTADO DE CONVERSION HEX A ASCCII
CONTA1 EQU 0124H
CONTA2 EQU 0125H
CONTA3 EQU 0126H
; ************************************************
org 0x00
GOTO CONFIPIC
INICIO
CALL MENSAJE
PROCESO
bsf STATUS,5 ; Banco 1
movlw 0x8E ; Justificado a la derecha, Fosc/8, RA0 analógico, VDD, VSS.-
movwf ADCON1
bcf STATUS,5 ; Banco 0
movlw 0x41 ; Fosc/8, Canal 0, módulo habilitado.-
movwf ADCON0
call Demora_20us ; Demora de adquision.-
bsf ADCON0,GO
Espera
btfsc ADCON0,GO ; Espera a que termine conversion.-
goto Espera
movf ADRESH,0 ; Movemos resultado de la conversion.-
addwf ADRESH,0
CALL Hex_Ascii
CALL MOSTRAR_TEMPERATURA
;BSF PORTB,2
bsf STATUS,5 ; Banco 1
movf ADRESL,0
;movwf ByteBajo
bcf STATUS,5 ; Banco 0.-
bsf ADCON0,ADON ; Apago modulo de conversion.-
GOTO PROCESO
;**** Demora ****
Demora_20us
movlw 0x05 ;
movwf Contador ; Iniciamos contador1.-
Repeticion
decfsz Contador,1 ; Decrementa Contador1.-
goto Repeticion ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;; RUTINA PARA CONVERTIR HEX ASCCII ;;;;;;;;;;;;;;;;;;;;;;;
Hex_Ascii ;cargar en W el dato hex
movwf HEXADECIMAL
clrf ASCII_H ;Para BCD D'0'
clrf ASCII_M ;Para BCD D'0'
clrf ASCII_L ;Para BCD D'0'
Centenas movlw D'100' ;D'100' --> W
subwf HEXADECIMAL,0 ;HEXADECIMAL - D'100' --> W
btfss STATUS,C ;¿ HEXADECIMAL es menor que D'100' ?
goto Decenas ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_H,F ;Incrementa el contador de centenas BCD
goto Centenas ;Vuelve por otros D'100'
Decenas movlw D'10' ;D'10' --> W
subwf HEXADECIMAL,0 ;HEXADECIMAL - D'10' --> W
btfss STATUS,C ;¿ HEXADECIMAL es menor que D'10' ?
goto Unidades ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_M,F ;Incrementa el contador de decenas BCD
goto Decenas ;Vuelve por otros D'10'
Unidades movf HEXADECIMAL,0 ;El resto pertenece
movwf ASCII_L ;a las unidades BCD
clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL
Bcd_A_Ascii movlw H'30' ;H'30' --> W
iorwf ASCII_L,F ;Convierte de BCD a ASCII
iorwf ASCII_M,F ;Convierte de BCD a ASCII
movf ASCII_H,F ;ASCII_H --> F
btfsc STATUS,Z ;? ASCII_H es D'00' ?
goto Espacio ;Si
movlw H'30' ;H'30' --> W
iorwf ASCII_H,F ;Convierte de BCD a ASCII
return ;Retorna
Espacio
movlw '0' ;A' ' --> W
movwf ASCII_H ;A' ' --> ASCII_H
return ;Retorna
;**********************************************************************
; MOSTRAR MENSAJE DE BIENVENIDA
;**********************************************************************
MENSAJE
NOP
MOVLW 038H ; Inicio LCD a 8 bits, 2 linea
CALL CONTROL
MOVLW 0CH ; sentido giro 0000 0101
CALL CONTROL
MOVLW 01H
CALL CONTROL ; Limpia todo el display y retorna el cursor a la posicion de inicio de LCD ...
CALL RETARDO ; Tiempo prudencial para que la lcd ermnie la instruccion anterior der borrado ...
MOVLW " "
CALL DATO
MOVLW " "
CALL DATO
MOVLW " "
CALL DATO
MOVLW "S"
CALL DATO
MOVLW "E"
CALL DATO
MOVLW "N"
CALL DATO
MOVLW "S"
CALL DATO
MOVLW "A"
CALL DATO
MOVLW "D"
CALL DATO
MOVLW "O"
CALL DATO
MOVLW " "
CALL DATO
MOVLW "D"
CALL DATO
MOVLW "E"
CALL DATO
MOVLW " "
CALL DATO
MOVLW ""
CALL DATO
MOVLW ""
CALL DATO
;************ SEGUNDA LINEA **************************
MOVLW " "
CALL DATO
MOVLW " "
CALL DATO
MOVLW " "
CALL DATO
MOVLW " "
CALL DATO
MOVLW "T"
CALL DATO
MOVLW "E"
CALL DATO
MOVLW "M"
CALL DATO
MOVLW "P"
CALL DATO
MOVLW "E"
CALL DATO
MOVLW "R"
CALL DATO
MOVLW "A"
CALL DATO
MOVLW "T"
CALL DATO
MOVLW "U"
CALL DATO
MOVLW "R"
CALL DATO
MOVLW "A"
CALL DATO
MOVLW " "
CALL DATO
MOVLW " "
CALL DATO
MOVLW " "
CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
MOVLW 01H
CALL CONTROL ; Limpia todo el display y retorna el cursor a la posicion de inicio de LCD ...
CALL RETARDO ; Tiempo prudencial para que la lcd ermnie la instruccion anterior der borrado ...
MOVLW "T"
CALL DATO
MOVLW "E"
CALL DATO
MOVLW "M"
CALL DATO
MOVLW "P"
CALL DATO
MOVLW " "
CALL DATO
MOVLW "="
CALL DATO
MOVLW " "
CALL DATO
MOVLW B'10001100'
CALL CONTROL ; POSICIONA EL CURSOR EN UNA CIERTA POSICION
MOVLW 0xDF ;envia el simbolo de grados celsius
CALL DATO
MOVLW 'C'
CALL DATO
RETURN
;**********************************************************************
;**********************************************************************
; MOSTRAR TEMPERATURA
;**********************************************************************
MOSTRAR_TEMPERATURA
NOP
MOVLW B'10001000'
CALL CONTROL
movf ASCII_H,0 ;envia las centenas de temperatura
CALL DATO
movf ASCII_M,0 ;envia las decenas de temperatura
CALL DATO
movf ASCII_L,0 ;envia las unidades de temperatura
CALL DATO
MOVLW " "
CALL DATO
CALL RETARDO
RETURN
;**********************************************************************
;**********************************************************************
; CONTROL LCD
;**********************************************************************
CONTROL BCF PORTA,1 ; RS = 0 Control
BSF PORTA,2 ; E = 1 Habilito LCD ...
NOP
NOP
NOP
MOVWF PORTD ; Saca dato puerto B
CALL RETARDO1
CALL RETARDO1
BCF PORTA,2 ; E = 0 Desabilito LCD ...
RETURN
;**********************************************************************
; DATO LCD
;**********************************************************************
DATO BSF PORTA,1 ; RS = 1 Dato
BSF PORTA,2 ; E = 1 Habilito LCD ...
MOVWF PORTD ; Saca dato puerto B
CALL RETARDO1
BCF PORTA,2 ; E = 0 Desabilito LCD ...
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;**********************************************************************
; RETARDO1 TIEMPO DE WRITE Y READ DE DATO PARA LCD MODIFAMOS 019-025-30
;**********************************************************************
RETARDO1 MOVLW 0C8H
MOVWF CONTA2 ;cargo el registro CONTA1 con AAh
CICLO22 MOVLW 01H
MOVWF CONTA3 ;cargo el registro CONTA1 con 01h
CICLO11 DECFSZ CONTA3,1 ;decrementa el contenido CONTA3
GOTO CICLO11
DECFSZ CONTA2,1 ;decrementa el contenido CONTA2
GOTO CICLO22
RETURN
;**********************************************************************
; RETARDO
;**********************************************************************
RETARDO MOVLW 0FFH ;CARGAMOS EN EL REGISTRO DE TRABAJO EN FF UN DECREMENTO
MOVWF CONTA1 ;LO MEVEMOS AL REGISTRO DE PROPOCITO GENERAL CONTA 1
CICLO3 MOVLW 0FFH ;CARGA EN EL REGISTRO DE TRABAJO FF PARA UN DECREMENTO
MOVWF CONTA2 ;LO MEVEMOS A LA ETIQUETA
CICLO2 MOVLW 01H ;CARGA EN EL REGISTRO DE TRABAJO PARA UN DECREMENTO
MOVWF CONTA3 ;LO MUEVE AL REGISTRO
CICLO1 DECFSZ CONTA3,1 ;DECREMENTA EL REGISTRO Y DEJA EL RESULTADO EN ESE REGISTRO
GOTO CICLO1 ;SI EL DECREMENTO ES CERO SALTA A LA ETIQUETA
DECFSZ CONTA2,1 ;DECREMENTA
GOTO CICLO2 ;SIEL DECREMENTO ES CERO SALTA
DECFSZ CONTA1,1 ;DECREMENTA
GOTO CICLO3 ;SI ES CERO SALTA
RETURN ;RETORNA
;**********************************************************************
;******************** CONFIGURACION PIC *******************************
;**********************************************************************
CONFIPIC
NOP
BANKSEL 0F00H
MOVLW b'00000000' ;pone el puerto b como salida
MOVWF TRISB ;MOSTRAMOS POR EL PUERTO B
CLRF PORTB
MOVLW b'00000000' ;pone el puerto b como salida
MOVWF TRISD ;MOSTRAMOS POR EL PUERTO D
CLRF PORTD
;*********************************************************************
MOVLW 0Fh
MOVWF ADCON1
MOVLW 07h
MOVWF CMCON
MOVLW 00h
MOVWF TRISA
CLRF PORTA
BSF PORTA,2
CALL RETARDO
BCF PORTA,2
CALL RETARDO
BSF PORTA,2
CALL RETARDO
GOTO INICIO
END