viernes, 12 de noviembre de 2010

estacion meterologica inalambrica

hola a todos ...
la presente entrada es para "subir" uno de tantos proyectos que he desarrollado.
el siguiente proyecto consiste en una estacion meteorologica inalambrica con codificacion FSK, dentro del codigo solo viene construido para 2 sensores (temperatura-LM35 humedad-HIH4000-001) con su etapa de polarizacion previa, siendo para este caso (debido al uso del microcontrolador PIC16F877A como controlador general) un Vref de 2.5 v para el sensor de temperatura y un Vref de 5v para el de humedad. los controladores son los muy conocidos PIC16F877A operando a 4MHz con osciladores de cristal, el esquematico, archivos , simulaciones y codigos se muestran al final de este texto; cabe mencionar que el proyecto viene provisto de un control remoto con opcion de visualizacion de menu y monitoreo mediante un LCD 16X2, la comunicacion inalambrica se llevo a cabo de unas antenas transmisoras de datos por FSK (HM-TR915/TTL), para el caso del control remoto solo es necesario una bateria de 9v ya que cuenta con un regulador de voltaje que provee la alimentacion necesaria al circuito remoto; par el caso de la estacion base es necesario solo una fuente de 5v de al menos 500mA para suministrar la energia necesaria para el correcto funcionamiento del mismo.

codigo en ASM:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                                   ;
; ESTACION METEOROLOGICA INALAMBRICA CON CAPACIDAD DE 2 SENSORES MODULANDO EN FSK  ;
;                                                                                   ;
;    DESARROLLO DE PROYECTOS ITSON            TELECOMUNICACIONES II                   ;
;    BY: ING. OSCAR IVAN ALVARADO AGUIRRE                                           ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        LIST        P=16F877A
        INCLUDE        "P16F877A.INC"
        __CONFIG    0X3F19
        ERRORLEVEL    -302

;    PC:    COMPUTADORA        TX Y RX: TRANSCEPTORES FSK
;    S1: SENSOR 1                                                     __________
;    S2: SENSOR 2                ^^            ^^                        |           |
;    ______                        ||             ||                        |    PC    |
;  |  S1  |            ____________||    ))))    ||____________            |__________|
;  |______|________|             |     -->    |              |                |  |
;                  _|        TX         |            |     RX      |______/¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬\   
;                 | |_____________|            |_____________|        /_________________ \
;    _____________|
;  |  S2  |
;  |______|


;ESTE CODIGO CORRESPONDE AL CODIGO FUENTE DEL MODULO RECEPTOR EN EL QUE SOLO SE OCUPARAN LAS
;INTERRUPCIONES DEL PORTB DEL MICROCONTROLADOR UN PUERTO PARA LCD Y EL USART CONFIGURADO A
;9600 BAUDIOS PARA RECIBIR LOS DATOS DE LA ESTACION TRANSMISORA.

        CBLOCK        0X20
        DATO_S1            ;VALOR DE HUMEDAD
        DATO_S2            ;VALOR DE TEMPERATURA
        PETICION        ;NUMERO DE VECES QUE PEDIRA UNA CONECCION CON EL TRANSMISOR
        ESTATUS            ;PROTOCOLO
        DATO_RECIBIDO    ;DATO RECIBIDO POR USART
        TEMPORAL        ;DATO TEMPORAL PARA OPERACIONES LOGICAS GENERALES
        ESTADO_S
        VALOR_H
        VALOR_T
        DATO_ENVIA
        ENDC

   
        ORG            0X00
        GOTO        INICIO
        ORG            0X04
        GOTO        INTERRUPCIONES

           ORG         0X05
MENSAJES              ADDWF PCL,F
MENSAJEFIJO            DT "   BIENVENIDO   ", 0x00;
MENSAJEFIJO0        DT "  CONECTANDO.", 0x00;
MENSAJEFIJO1        DT "HUMEDAD RELATIVA", 0x00;
MENSAJEFIJO2        DT "TEMPERATURA ACT.", 0x00;
MENSAJEFIJO3        DT "ERROR DE CONEX. ", 0x00;
MENSAJEFIJO6        DT "ESPERE POR FAVOR", 0x00;
MENSAJEFIJO7        DT "RESETE EL EQUIPO", 0x00;
MENSAJEFIJO8        DT "ENLACE COMPLETO ", 0x00;
FINMENSAJES

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<PROGRAMA PRINCIPAL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INICIO
;DECLARAR PUERTOS UTILIZADOS
    CLRF     PORTE         ;RESETEAMOS LOS PUERTOS IN/OUT.
    CLRF    PORTB
    CLRF    PORTD
    CLRF    PORTC
    CLRF    PORTA

;CONFIGURAR PUERTOS I/O
    BSF        STATUS,RP0     ; Ir al Banco 1.
    MOVLW     0x06         ; Poner el PORTA como señales digitales.
       MOVWF    ADCON1       
    CLRF    TRISE        ;PORTE COMO SALIDA
    MOVLW    0XFF
    MOVWF    TRISB        ;CONFIGURACION DEL PUERTO B
    CLRF     PORTD
    CLRF     TRISD
    BCF        OPTION_REG,7;RESISTENCIAS PULL_UP
    MOVLW    0X07
    MOVWF    CMCON
    BCF     STATUS,RP0     ;Ir al Banco 0.
;LIMPIO LOS PUERTOS CONFIGURADOS
    CLRF     PORTE         ;;RESETEAMOS LOS PUERTOS IN/OUT.
    CLRF    PORTB
    CLRF    PORTD
    CLRF    PORTC
    CLRF    PORTA

;INICIALIZA EL LCD Y LO PONE EN FUNCIONAMIENTO EN MODO 8 BITS
    CLRF     PORTD
    CALL     LCD_INICIALIZA ;INICIALIZA EL LCD.
    CALL     RETARDO_10MS

;ACTIVACION DEL MODULO SERIAL (USART: 9600 BAUDIOS, 8 BITS, N, 1 BIT PARADA)
    BSF        STATUS,RP0
    MOVLW     .25            ;ANTES EN .6 DEBIDO AL OSCILADOR DE 1MHZ
    MOVWF     SPBRG         ; Cargar la Velocidad de Transmisión de Datos.
    MOVLW     B'00100100'
    MOVWF     TXSTA         ; Configuración de la Transmisión Serie.
    BSF        PIE1,RCIE
    BSF        INTCON,PEIE    ;CONFIGURO INTERRUPCIONES POR RECEPCION DE DATOS POR USART
    BSF        INTCON,GIE
    BCF        STATUS,RP0
    MOVLW     B'10010000' ;Configurar y lanzar la Recepción Serie CONTINUA
    MOVWF     RCSTA
    CALL     RETARDO_500MS

;CONFIGURACION DE INTERRUPCIONES POR CAMBIO DE NIVEL
    BSF        INTCON,GIE        ;HABILITO INTERRUPCIONES GENERALES
    BSF        INTCON,RBIE        ;HABILITO INTERRUPCIONES POR NIVEL EN PUERTO B
    BCF        INTCON,RBIF        ;LIMPIO EL FLAG DE INTERRUPCION PARA NO TENER ERRORES

;CONFIGURA EL NUMERO DE VECES QUE ENVIARA CODIGO DE CONECCION PUNTO A PUNTO
    MOVLW    .3
    MOVWF    PETICION

;DESPLIEGA MENSAJE DE " BIENVENIDO "....
    MOVLW     MENSAJEFIJO
    CALL     LCD_MENSAJE
    CALL     RETARDO_1S        ;RETARDO DE 2 SEGUNDOS
    CALL     RETARDO_1S
    CALL     LCD_BORRA

;DESPLIEGA MENSAJE "CONECTANDO." "ESPERE POR FAVOR"
BUCLE
    MOVLW     MENSAJEFIJO0     ;Apunta al mensaje fijo y lo visualiza.
       CALL     LCD_MENSAJE 
    CALL     LCD_LINEA2       ;SALTA DE LINEA DEL LCD
       MOVLW     MENSAJEFIJO6     ;Apunta al mensaje fijo y lo visualiza.
       CALL     LCD_MENSAJE        
    CALL     RETARDO_200MS
    CALL     RETARDO_100MS
    MOVLW    .13
    CALL    LCD_POSICIONLINEA1;POSICIONA LA DIRECCION PARA MENSAJE "CONECTANDO.."
    MOVLW    '.'
    CALL    LCD_CARACTER
    CALL     RETARDO_500MS
    CALL     RETARDO_100MS
    MOVLW    .14
    CALL    LCD_POSICIONLINEA1
    MOVLW    '.'
    CALL    LCD_CARACTER    ;POSICIONA LA DIRECCION PARA MENSAJE "CONECTANDO..."
    CALL     RETARDO_500MS
    CALL     RETARDO_100MS
    MOVLW    .15
    CALL    LCD_POSICIONLINEA1
    MOVLW    '.'
    CALL     RETARDO_1S

;ENVIA PRIMER PETICION....
    MOVLW    B'10001010'        ;SI POR LO QUE CONECTA AL DISPOSITIVO REMOTO
    MOVWF     TXREG             ;Comienzo de la transmisión de datos en Serie.
    BSF     STATUS,RP0
S2     BTFSS     TXSTA,TRMT         ;Preguntamos si se ha transmitido el dato SINO ESPERA AQUI.
    GOTO     S2
    BCF     STATUS,RP0        ;TERMINA DE ENVIAR PETICION....
    CALL    RETARDO_50MS

;CHECA SI SE REALIZO UNA CONECCION EXITOSA
    NOP
    BTFSS    ESTATUS,2        ;CHEKA SI SE RECIBIO PETICION DE CONECCION EXITOSA....
    GOTO    DESCONECTADO
    GOTO    CONECTADO_MODE

;ENVIA MENSAJE "CONECCION FALLIDA"
DESCONECTADO
    DECFSZ    PETICION,F
    GOTO    BUCLE
    CALL    LCD_BORRA
    MOVLW     MENSAJEFIJO3     ;Apunta al mensaje fijo y lo visualiza.
       CALL     LCD_MENSAJE 
    CALL     LCD_LINEA2 
    MOVLW     MENSAJEFIJO7     ;Apunta al mensaje fijo y lo visualiza.
       CALL     LCD_MENSAJE
    CALL    RETARDO_1S
OSCILA
    NOP
    GOTO    OSCILA   

;ENVIA MENSAJE "CONECCION COMPLETA" "ESPERE POR FAVOR"
CONECTADO_MODE
    BSF        STATUS,RP0
    BCF        TXSTA,5            ;DESHABILITA LA TRANSMISION POR EL
    BCF        STATUS,RP0        ;MODULO USART PARA QUE NO SIGUA ENVIANDO ERRORES
    CALL    LCD_BORRA
    MOVLW    MENSAJEFIJO8
    CALL    LCD_MENSAJE
    CALL    LCD_LINEA2
    MOVLW    MENSAJEFIJO6
    CALL    LCD_MENSAJE
    CALL    RETARDO_1S

;CHECA SI ENTRA EN MODO TEMPERATURA O EN MODO HUMEDAD
CONECTADO
    CALL    RETARDO_5MS
    CALL    LCD_BORRA   
    CALL    RETARDO_5MS
BLOCKED_CODE
       BTFSS    ESTATUS,1        ;CHEKA ESTATUS SI BIT MENU-->1 DESPLIEGA HUMEDAD SINO
    GOTO    MODE_TEMPERATURA
    GOTO    MODE_HUMEDAD

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ENTRA A MODO HUMEDAD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MODE_HUMEDAD
    CALL    LCD_LINEA1
    MOVLW     MENSAJEFIJO1     ;Apunta al mensaje fijo y lo visualiza.
       CALL     LCD_MENSAJE      ;"HUMEDAD RELATIVA &&& %
                            ;Y VISUALIZA EL VALOR DE HUMEDAD
    CALL     LCD_LINEA2      ;SENSADO EN LA ULTIMA TRANSFERENCIA DE DATOS

    MOVF    DATO_S1,W
    CALL    BIN_A_BCD
    MOVF    BCD_CENTENAS,W
    CALL    LCD_BYTE
    MOVF    BCD_DECENAS,W
    CALL    LCD_BYTE
    MOVF    BCD_UNIDADES,W
    CALL    LCD_BYTE
    MOVLW    ' '
    CALL    LCD_CARACTER
    CALL    RETARDO_5MICROS
    MOVLW    '%'
    CALL    LCD_CARACTER
    CALL    RETARDO_500MS
    GOTO    BLOCKED_CODE

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ENTRA A MODO TEMPERATURA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MODE_TEMPERATURA
    CALL    LCD_LINEA1
    MOVLW     MENSAJEFIJO2     ;Apunta al mensaje fijo y lo visualiza.
       CALL     LCD_MENSAJE     ;"TEMPERATURA ACT. &&& °C
    CALL     LCD_LINEA2      ;VISUALIZA EL VALOR DE TEMPERATURA

    MOVF    DATO_S2,W        ;MAS ACTUAL SENSADO EN LA ULTIMA
    CALL    BIN_A_BCD        ;TRANSFERENCIA DE DATOS
    MOVF    BCD_CENTENAS,W
    CALL    LCD_BYTE
    MOVF    BCD_DECENAS,W
    CALL    LCD_BYTE
    MOVF    BCD_UNIDADES,W
    CALL    LCD_BYTE
    MOVLW    '°'       
    CALL    LCD_CARACTER
    CALL    RETARDO_5MICROS
    MOVLW    'C'
    CALL    LCD_CARACTER
    CALL    RETARDO_500MS
    GOTO    BLOCKED_CODE

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<INTERRUPCIONES>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INTERRUPCIONES
    BTFSS    INTCON,RBIF        ;CHECO...FUE INTERRUPCION POR CAMBIO DE NIVEL?????? SI ES SI SALTA
    GOTO    OTRA_INTERRUPCION
    BTFSC    PORTB,4
    GOTO    OTRO_PUERTO
    BSF        ESTATUS,1
    GOTO    SALIR
OTRO_PUERTO
    BTFSS    PORTB,4
    GOTO    OTRO_CAMBIO   
    BCF        ESTATUS,1
    GOTO    SALIR
OTRO_CAMBIO
    BTFSC    PORTB,5
    GOTO    SALIR
    BSF        ESTATUS,3
SALIR
    BCF        INTCON,RBIF        ;LIMPIO EL FLAG DE INTERRUPCION POR CAMBIO EN RB
    RETFIE


OTRA_INTERRUPCION
    BTFSS     PIR1,RCIF         ;Detectamos si ha interrumpido la Recepción Serie.
    RETFIE
    MOVF     RCREG,W         ;Cargamos el dato del registro RCREG en el registro DATO.
    MOVWF     DATO_RECIBIDO
    MOVF    RCREG,W
    MOVWF    TEMPORAL
;CHEKA SI ES COMANDO???
    MOVLW    0X8A
    SUBWF    TEMPORAL,W
    BTFSS    STATUS,Z
    GOTO    ES_DATO?
    BSF        ESTATUS,2
    RETFIE

ES_DATO?
    MOVLW    0XF0
    ANDWF    TEMPORAL,F
;CHEKA SI ES DATO, SI ES CHEKA CUAL DE TODOS FUE???
    MOVLW    0X70
    SUBWF    TEMPORAL,W
    BTFSS    STATUS,Z
    GOTO    NEXT_0
    ;FUE DATO DE HUMEDAD NIBBLE BAJO
    GOTO    H_NIBBLE_BAJO

NEXT_0
    MOVLW    0X60
    SUBWF    TEMPORAL,W
    BTFSS    STATUS,Z
    GOTO    NEXT_1
    ;FUE DATO DE HUMEDAD NIBBLE ALTO
    GOTO    H_NIBBLE_ALTO
NEXT_1
    MOVLW    0X50
    SUBWF    TEMPORAL,W
    BTFSS    STATUS,Z
    GOTO    NEXT_2
    ;FUE DATO DE TEMPERATURA NIBBLE BAJO
    GOTO    T_NIBBLE_BAJO
NEXT_2
    MOVLW    0X40
    SUBWF    TEMPORAL,W
    BTFSS    STATUS,Z
    GOTO    SALIR_INT
    ;FUE DATO DE TEMPERATURA NIBBLE ALTO
    GOTO    T_NIBBLE_ALTO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RECIBE HUMEDAD
;SE HA RECIBIDO UN DATO DE HUMEDAD POR LO QUE LO DESEMPAQUETA Y LO GUARDA EN DATO_S1
H_NIBBLE_ALTO
    BCF        ESTADO_S,0
    MOVF    DATO_RECIBIDO,W
    MOVWF    TEMPORAL
    MOVLW    B'00001111'        ;OBTIENE SOLO EL NIBBLE DEL DATO RECIBIDO
    ANDWF    TEMPORAL,F           
    SWAPF    TEMPORAL,F
    MOVF    TEMPORAL,W
    MOVWF    VALOR_H                ;ANTES ADDWF    DATO_S1,F
    GOTO    SALIR_INT
H_NIBBLE_BAJO
    MOVF    DATO_RECIBIDO,W
    MOVWF    TEMPORAL
    MOVLW    B'00001111'        ;OBTIENE SOLO EL NIBBLE DEL DATO RECIBIDO
    ANDWF    TEMPORAL,F           
    MOVF    TEMPORAL,W
    ADDWF    VALOR_H,F
    MOVF    VALOR_H,W
    MOVWF    DATO_S1
    BSF        ESTADO_S,0
    GOTO    SALIR_INT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RECIBE TEMPERATURA
    ;SE HA RECIBIDO UN DATO DE TEMPERATURA POR LO QUE LO DESEMPAQUETA Y LO GUARDA EN DATO_S2
T_NIBBLE_ALTO
    BCF        ESTADO_S,0
    MOVF    DATO_RECIBIDO,W
    MOVWF    TEMPORAL
    MOVLW    B'00001111'        ;OBTIENE SOLO EL NIBBLE DEL DATO RECIBIDO
    ANDWF    TEMPORAL,F           
    SWAPF    TEMPORAL,F
    MOVF    TEMPORAL,W
    MOVWF    VALOR_T                ;ANTES ADDWF    DATO_S2,F
    GOTO    SALIR_INT
T_NIBBLE_BAJO
    MOVF    DATO_RECIBIDO,W
    MOVWF    TEMPORAL
    MOVLW    B'00001111'        ;OBTIENE SOLO EL NIBBLE DEL DATO RECIBIDO
    ANDWF    TEMPORAL,F           
    MOVF    TEMPORAL,W
    ADDWF    VALOR_T,F
    MOVF    VALOR_T,W
    MOVWF    DATO_S2
    GOTO    SALIR_INT

SALIR_INT   
    BCF     PIR1,RCIF         ;Borrar flag de recepción
    RETFIE                     ;Retorno de Interrupción.

ENVIA_DATO
    MOVF    DATO_ENVIA,W
    MOVWF     TXREG             ;Comienzo de la transmisión de datos en Serie.
    BSF     STATUS,RP0
S3     BTFSS     TXSTA,TRMT         ;Preguntamos si se ha transmitido el dato SINO ESPERA AQUI.
    GOTO     S3
    BCF     STATUS,RP0        ;TERMINA DE ENVIAR PETICION....
    RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    INCLUDE        "LCD_4BIT.INC"
    INCLUDE        "LCD_MENS.INC"
    INCLUDE        "RETARDOS.INC"
    INCLUDE        "BIN_BCD.INC"

    END

ahora bien el codigo del transmisor y empaquetador de datos:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                                   ;
; ESTACION METEOROLOGICA INALAMBRICA CON CAPACIDAD DE 2 SENSORES MODULANDO EN FSK  ;
;                                                                                   ;
;    DESARROLLO DE PROYECTOS ITSON            TELECOMUNICACIONES II                   ;
;    BY: ING. OSCAR IVAN ALVARADO AGUIRRE                                           ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        LIST        P=16F877A
        INCLUDE        "P16F877A.INC"
        __CONFIG    0X3F19        ;3F19
        ERRORLEVEL    -302

;    PC:    COMPUTADORA        TX Y RX: TRANSCEPTORES FSK
;    S1: SENSOR 1                                                     __________
;    S2: SENSOR 2                ^^            ^^                        |           |
;    ______                        ||             ||                        |    PC    |
;  |  S1  |            ____________||    ))))    ||____________            |__________|
;  |______|________|             |     -->    |              |                |  |
;                  _|        TX         |            |     RX      |______/¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬\  
;                 | |_____________|            |_____________|        /_________________ \
;    _____________|
;  |  S2  |
;  |______|


;ESTE CODIGO CORRESPONDE AL CODIGO FUENTE DEL MODULO TRANSMISOR EN EL QUE SOLO SE OCUPARAN LOS
;MODULOS ADC DEL MICROCONTROLADOR Y EL USART CONFIGURADO A 9600 BAUDIOS POR CONVENIENCIA DE TAL
;MANERA QUE EL ADC TENDRA 2 ENTRADAS Y EL USART SOLO SE USARA PARA TRANSMITIR, POSTERIORMENTE
;ANALIZARA EL CODIGO FUENTE PARA EL RECEPTOR .....

            CBLOCK        0X20
            DATO_H
            DATO_L
            TEMPORAL
            HUMEDAD
            TEMPERATURA
            ESTATUS
            CONVERSION
            CONTADOR
            DATO_ENVIA
            DATO_RECIBIDO
            cuenta1
            cuenta2
            cuenta3
            ENDC
      
            ORG            0X00
            GOTO        INICIO
            ORG            0X04
            GOTO         RSI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;PROGRAMA PRINCIPAL (MAIN) DONDE CONFIGURA PUERTOS, LUEGO USART Y ESPERA CONECCION CON REMOTO, UNA VEZ ESTABLECIDA LA CONECCCION
;CONFIGURA ADC_HUMEDAD, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE 1 NIBBLE, DESPUES CAMBIA LA CONFIGURACION PARA
;SENSAR TEMPERATURA, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE  NIBBLE, Y SE DEVUELVE A CONFIGURAR EL ASC_HUMEDAD
INICIO
            CALL        CONF_PTOS        ;CONFIGURAMOS LOS PUERTOS
            CLRF        PORTB            ;LIMPIA EL PUERTOB Y
            CALL        CONF_USART
          
;CHEKA SI HAY CONECCION ESTABLECIDA CON EL REMOTO....
AQUI        BTFSS        ESTATUS,7        ;ESTA EL EQUIPO CONECTADO CON EL MODULO INALAMBRICO???
            GOTO        AQUI            ;NO, POR LO QUE NUNCA COMIENZA UNA CONVERSION
;HAY CONECCION SATISFACTORIA ASI QUE COMIENZA CON EL SENSOR 1 Y ENVIA PAQUETES....
CONECTED
            BSF            PORTC,0
            CALL        RETARDO_20MS
            BCF            ESTATUS,6
            MOVF        PORTB,W
            MOVWF        TEMPERATURA
            CLRF        TEMPORAL
            CLRF        CONVERSION
            MOVF        TEMPERATURA,W
            CALL        ENVIA_PAQUETE    ;ENVIO EL DATO DE TEMPERATURA
            CALL        RETARDO_50MS

;TERMINA CON EL SENSOR 1 Y COMIENZA CON EL SENSOR 2 Y ENVIA PAQUETES.....
            BCF            PORTC,0
            BSF            ESTATUS,6
            MOVF        PORTD,W
            MOVWF        HUMEDAD
            CLRF        TEMPORAL
            CLRF        CONVERSION
            MOVF        HUMEDAD,W
            CALL        ENVIA_PAQUETE    ;ENVIO EL DATO DE TEMPERATURA  
            CALL        RETARDO_50MS
            GOTO        CONECTED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA DE SERVICIO QUE CONFIFGURA LOS PUERTOS ADECUADAMENTE PARA EL CORRECTO FUNCIONAMIENTO DE LA ESTACION METEREOLOGICA  
;      
CONF_PTOS  
            BSF            STATUS,RP0        ;BANCO1
            CLRF        PORTC            ;EL PUERTOC
            CLRF        PORTE
            MOVLW        0XFF
            MOVWF        TRISD
            MOVLW        0XFF
            MOVWF        TRISB
            CLRF        PORTC            ;Y EL PUERTOC
            BSF            PORTC,7
            MOVLW        0X07            ;SELECCIONAMOS EL PRESCALADOR DE 8 (256)
            MOVWF        CMCON
            MOVWF        OPTION_REG
            BCF            STATUS,RP0        ;BANCO0
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SERVICIO DE INTERRUPCIONES (VECTOR DE INTERRUPCION) YA SEA POR USART O POR ADC
RSI
INT_USART?
            BTFSS         PIR1,RCIF         ;Detectamos si ha interrumpido la Recepción Serie.
            RETFIE
            MOVF         RCREG,W         ;Cargamos el dato del registro RCREG en el registro DATO.
            MOVWF         DATO_RECIBIDO
            MOVLW        B'10001010'
            SUBWF        DATO_RECIBIDO,W    ;EL DATO RECIBIDO FUE COMANDO 0X8A (PETICION DE CONECCION)?????
            BTFSS        STATUS,Z
            GOTO        SALIR_INT
            MOVLW        B'10001010'        ;SI POR LO QUE CONECTA AL DISPOSITIVO REMOTO
            MOVWF        DATO_ENVIA
            BSF            ESTATUS,7
            CALL        ENVIA_DATO
            GOTO        SALIR_INT
SALIR_INT  
            BCF         PIR1,RCIF         ;Borrar flag de recepción
               RETFIE   
             
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE CONFIGURA EL MODULO USART A 9600 BAUDIOS A 4MHZ EN MODO ASINCRONO DE ALTA VELOCIDAD SIN BIT DE PARADA, 8 BITS DE
;TRANSMISION SOLAMENTE
CONF_USART      
            BSF            STATUS,RP0
            MOVLW         .25                ;CARGA UN 25 DEBIDO AL OSCILADOR DE 4MHZ PARA 9600BAUDIOS
            MOVWF         SPBRG             ; Cargar la Velocidad de Transmisión de Datos.
            MOVLW         B'00100100'
            MOVWF         TXSTA             ; Configuración de la Transmisión Serie.;
            BSF            PIE1,RCIE
            BSF            INTCON,PEIE
            BSF            INTCON,GIE
            BCF            STATUS,RP0
            MOVLW         B'10010000'     ;Configurar y lanzar la Recepción Serie
            MOVWF         RCSTA
            CALL         RETARDO_500MS
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE ENVIA UN DATO PREVIAMENTE GUARDADO EN LA VARIABLE DATO_ENVIA POR EL PUERTO USART A 9600 BAUDIOS
;ENVIA UN PAQUETE DE 8 BITS UNICAMENTE
ENVIA_DATO
            MOVF        DATO_ENVIA,W
            MOVWF         TXREG             ;Comienzo de la transmisión de datos en Serie.
            BSF         STATUS,RP0
SEG2        BTFSS         TXSTA,TRMT         ;Preguntamos si se ha transmitido el dato.
            GOTO         SEG2
            BCF         STATUS,RP0
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE ENVIA PAQUETES DE DATOS DE 1 NIBBLE CADA UNO DEPENDIENDO DEL ESTADO DEL REGISTRO ESTATUS (BIT 6)
ENVIA_PAQUETE
            MOVWF        CONVERSION
            MOVWF        TEMPORAL
;CHEKQA SI SE ENVIARA HUMEDAD O TEMPERATURA Y ENVIA LA MITAD SELECCIONADA (SELECTED NIBBLE)
            BTFSS        ESTATUS,6
            GOTO        ENVIA_TEMPERATURA
            GOTO        ENVIA_HUMEDAD
          
ENVIA_HUMEDAD
            MOVLW        0X0F
            ANDWF        TEMPORAL,F
            MOVLW        B'01110000'                ;(4)-->1 NIBBLE BAJO   
            ADDWF        TEMPORAL,F
            MOVF        TEMPORAL,W
            MOVWF        DATO_ENVIA
            CALL        ENVIA_DATO
;ENVIA LA SEGUNDA PARTE DEL DATO...
            MOVLW        0XF0
            ANDWF        CONVERSION,F
            SWAPF        CONVERSION,F
            MOVLW        B'01100000'  
            ADDWF        CONVERSION,F
            MOVF        CONVERSION,W
            MOVWF        DATO_ENVIA
            CALL        ENVIA_DATO
            RETURN
   
ENVIA_TEMPERATURA
            MOVLW        0X0F
            ANDWF        TEMPORAL,F
            MOVLW        B'01010000'
            ADDWF        TEMPORAL,F
            MOVF        TEMPORAL,W
            MOVWF        DATO_ENVIA
            CALL        ENVIA_DATO
;ENVIA LA SEGUNDA PARTE DEL DATO...
            MOVLW        0XF0
            ANDWF        CONVERSION,F
            SWAPF        CONVERSION,F
            MOVLW        B'01000000'  
            ADDWF        CONVERSION,F
            MOVF        CONVERSION,W
            MOVWF        DATO_ENVIA
            CALL        ENVIA_DATO
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;          
;RUTINA QUE GENERA UN RETARDO DE 300MS DE PROPOSITO ESPECIFICO EN EL CODIGO
Retardo_300ms
            MOVLW        .4
            MOVWF        cuenta3
ciclo3      
            MOVLW        .200
            MOVWF        cuenta2
ciclo2
            MOVLW        .100
            MOVWF        cuenta1
ciclo      
            DECFSZ        cuenta1,F
            GOTO        ciclo
            DECFSZ        cuenta2,F
            GOTO        ciclo2
            DECFSZ        cuenta3,F
            GOTO        ciclo3
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            INCLUDE        "RETARDOS.INC"
            END


ahora el codigo al sensor de humedad correspondiente:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                                   ;
; ESTACION METEOROLOGICA INALAMBRICA CON CAPACIDAD DE 2 SENSORES MODULANDO EN FSK  ;
;                                                                                   ;
;    DESARROLLO DE PROYECTOS ITSON            TELECOMUNICACIONES II                   ;
;    BY: ING. OSCAR IVAN ALVARADO AGUIRRE                                           ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        LIST        P=16F877A
        INCLUDE        "P16F877A.INC"
        __CONFIG    0X3F19        ;3F19
        ERRORLEVEL    -302

;    PC:    COMPUTADORA        TX Y RX: TRANSCEPTORES FSK
;    S1: SENSOR 1                                                     __________
;    S2: SENSOR 2                ^^            ^^                        |           |
;    ______                        ||             ||                        |    PC    |
;  |  S1  |            ____________||    ))))    ||____________            |__________|
;  |______|________|             |     -->    |              |                |  |
;                  _|        TX         |            |     RX      |______/¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬\   
;                 | |_____________|            |_____________|        /_________________ \
;    _____________|
;  |  S2  |
;  |______|


;ESTE CODIGO CORRESPONDE AL CODIGO FUENTE DEL MODULO TRANSMISOR EN EL QUE SOLO SE OCUPARAN LOS
;MODULOS ADC DEL MICROCONTROLADOR Y EL USART CONFIGURADO A 9600 BAUDIOS POR CONVENIENCIA DE TAL
;MANERA QUE EL ADC TENDRA 2 ENTRADAS Y EL USART SOLO SE USARA PARA TRANSMITIR, POSTERIORMENTE
;ANALIZARA EL CODIGO FUENTE PARA EL RECEPTOR .....

            CBLOCK        0X20
            DATO_H
            DATO_L
            TEMPORAL
            HUMEDAD
            TEMPERATURA
            ESTATUS
            CONVERSION
            CONTADOR
            DATO_ENVIA
            DATO_RECIBIDO
            cuenta1
            cuenta2
            cuenta3
            ENDC
       
            ORG            0X00
            GOTO        INICIO
            ORG            0X04
            GOTO         RSI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;PROGRAMA PRINCIPAL (MAIN) DONDE CONFIGURA PUERTOS, LUEGO USART Y ESPERA CONECCION CON REMOTO, UNA VEZ ESTABLECIDA LA CONECCCION
;CONFIGURA ADC_HUMEDAD, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE 1 NIBBLE, DESPUES CAMBIA LA CONFIGURACION PARA
;SENSAR TEMPERATURA, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE  NIBBLE, Y SE DEVUELVE A CONFIGURAR EL ASC_HUMEDAD
INICIO
            CALL        CONF_PTOS        ;CONFIGURAMOS LOS PUERTOS
            CLRF        PORTB            ;LIMPIA EL PUERTOB Y
            CLRF        PORTD
;CHEKA SI HAY CONECCION ESTABLECIDA CON EL REMOTO....
;AQUI        BTFSS        ESTATUS,7        ;ESTA EL EQUIPO CONECTADO CON EL MODULO INALAMBRICO???
;            GOTO        AQUI            ;NO, POR LO QUE NUNCA COMIENZA UNA CONVERSION
;HAY CONECCION SATISFACTORIA ASI QUE COMIENZA CON EL SENSOR 1 Y ENVIA PAQUETES....
            CALL        CONF_ADC        ;CONFIGURO EL ADC Y LAS INTERUPCIONES POR HUMEDAD
            CALL        RETARDO_20MICROS;ESPERA TERMINE LA CONVERSION PARA APAGAR EL MODULO DEL ADC
;EMPAQUETA DATOS:
            CLRF        TEMPORAL
            CLRF        CONVERSION
            MOVF        HUMEDAD,W
AKI
            CALL        RETARDO_500MS
            GOTO        AKI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA DE SERVICIO QUE CONFIFGURA LOS PUERTOS ADECUADAMENTE PARA EL CORRECTO FUNCIONAMIENTO DE LA ESTACION METEREOLOGICA   
;       
CONF_PTOS   
            BSF            STATUS,RP0        ;BANCO1
            BSF            TRISA,0            ;SELECCIÓN DE LA ENTRADA ANALÓGICA
            CLRF        TRISB            ;LIMPIAMOS EL PUERTOB ASÍ COMO
            CLRF        TRISC            ;EL PUERTOC
            CLRF        TRISE
            CLRF        TRISD
            MOVLW        0X07            ;SELECCIONAMOS EL PRESCALADOR DE 8 (256)
            MOVWF        CMCON
            MOVWF        OPTION_REG
            BCF            STATUS,RP0        ;BANCO0
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE CONFIGURA EL MODULO ADC PARA SENSAR LA HUMEDAD POR LO QUE VREF+ NO SE ENCUENTRA ACTIVO Y SOLO SE MODIFICA EL PUERTO A
;ELIGIENDO EL CANAL 0 (PORTA,0)           
CONF_ADC   
            BSF            STATUS,RP0        ;SELECCIONO EL BANCO1
            MOVLW        B'00001110'        ;CONFIGURO LA ENTRADA A/D Y EL RESULTADO JUSTIFICADO A LA IZQUIERDA
            MOVWF        ADCON1            ;AN0, AD1:AD7 SIN VREF+ (YA QUE AQUI NO SE USARA)
                                        ;HABILITA LAS INTERRUPCIONES A/D SOLO TRABAJA A 8 BITS (REGISTRO ADRESH)
            BSF            PIE1,ADIE        ;SELECCIONA EL BANCO0
            BCF            STATUS,RP0       
            MOVLW        B'10000001'        ;FOSC/32,ENCIENDE A/D,CANAL 0 (AN0) 
            MOVWF        ADCON0
            BCF            PIR1,ADIF        ;LIMPIA LAS BANDERAS A/D
            BSF            INTCON,PEIE        ;HABILITA INTERRUPCIONES PERIFERICAS
            BSF            INTCON,GIE        ;HABILITA TODAS LAS INTERRUPCIONES
            NOP
            NOP
ESPERA        BTFSS        INTCON,T0IF
            GOTO        ESPERA
            BSF            ADCON0,GO        ;COMIENZA LA CONVERSION Y EL BIT ADIF SE PONDRA EN ALTO Y SE BORRARA GO/DONE DESPUES
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SERVICIO DE INTERRUPCIONES (VECTOR DE INTERRUPCION) YA SEA POR USART O POR ADC
RSI
            BTFSS        PIR1,ADIF        ;SE PONDRA EN 1 CUANDO HAYA TERMINADO LA CONVERSIÓN
            RETFIE           
            BCF            INTCON,GIE        ;SIGUE EN PIE LA CONVERSIÓN
            MOVF        ADRESH,W        ;LE CARGA A W LA PARTE ALTA DE LA CONVERSIÓN
                                        ;Y LA MUESTRA POR EL PUERTOB
            MOVWF        DATO_H
            CALL        DECODIFICA
            BCF            PIR1,ADIF        ;LIMPIA LA BANDERA PARA ESPERAR OTRA CONVERSIÓN
            BSF            INTCON,GIE
            RETFIE
DECODIFICA
            CALL        DECODIFICA_HUMEDAD
            MOVF        HUMEDAD,W
            MOVWF        PORTD
            MOVWF        PORTB
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE CONVIERTE EL VALOR DE HUMEDAD EN PORCENTAJE (%) DE HUMEDAD RELATIVA
DECODIFICA_HUMEDAD
            CLRF        STATUS
            MOVLW        0XC8
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_0
            MOVLW        .100
            MOVWF        HUMEDAD
            RETURN
RANGO_0
            CLRF        STATUS
            MOVLW        0XC6
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_1
            MOVLW        .99
            MOVWF        HUMEDAD
            RETURN
ASK_1
            CLRF        STATUS
            MOVLW        0XC5
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_2
            MOVLW        .98
            MOVWF        HUMEDAD
            RETURN       
ASK_2
            CLRF        STATUS
            MOVLW        0XC3
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_3
            MOVLW        .97
            MOVWF        HUMEDAD
            RETURN           
ASK_3
            CLRF        STATUS
            MOVLW        0XC2
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_4
            MOVLW        .96
            MOVWF        HUMEDAD
            RETURN   
ASK_4
            CLRF        STATUS
            MOVLW        0XC0
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_5
            MOVLW        .95
            MOVWF        HUMEDAD
            RETURN           
           
ASK_5
            CLRF        STATUS
            MOVLW        0XBF
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_6
            MOVLW        .94
            MOVWF        HUMEDAD
            RETURN       

ASK_6
            CLRF        STATUS
            MOVLW        0XBD
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_7
            MOVLW        .93
            MOVWF        HUMEDAD
            RETURN
ASK_7
            CLRF        STATUS
            MOVLW        0XBB
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_8
            MOVLW        .92
            MOVWF        HUMEDAD
            RETURN   
ASK_8
            CLRF        STATUS
            MOVLW        0XBA
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_9
            MOVLW        .91
            MOVWF        HUMEDAD
            RETURN               
ASK_9
            CLRF        STATUS
            MOVLW        0XB8
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_1
            MOVLW        .90
            MOVWF        HUMEDAD
            RETURN   
;SIGUINETE RANGO DE MEDICIONES-.........
RANGO_1
            CLRF        STATUS
            MOVLW        0XB7
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_10
            MOVLW        .89
            MOVWF        HUMEDAD
            RETURN
ASK_10
            CLRF        STATUS
            MOVLW        0XB5
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_11
            MOVLW        .88
            MOVWF        HUMEDAD
            RETURN   
ASK_11
            CLRF        STATUS
            MOVLW        0XB4
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_12
            MOVLW        .87
            MOVWF        HUMEDAD
            RETURN   
ASK_12
            CLRF        STATUS
            MOVLW        0XB2
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_13
            MOVLW        .86
            MOVWF        HUMEDAD
            RETURN   
ASK_13
            CLRF        STATUS
            MOVLW        0XB0
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_14
            MOVLW        .85
            MOVWF        HUMEDAD
            RETURN   
ASK_14
            CLRF        STATUS
            MOVLW        0XAF
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_15
            MOVLW        .84
            MOVWF        HUMEDAD
            RETURN   
ASK_15
            CLRF        STATUS
            MOVLW        0XAD
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_16
            MOVLW        .83
            MOVWF        HUMEDAD
            RETURN   
ASK_16
            CLRF        STATUS
            MOVLW        0XAC
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_17
            MOVLW        .82
            MOVWF        HUMEDAD
            RETURN   
ASK_17
            CLRF        STATUS
            MOVLW        0XAA
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_18
            MOVLW        .81
            MOVWF        HUMEDAD
            RETURN
ASK_18
            CLRF        STATUS
            MOVLW        0XA9
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_2
            MOVLW        .80
            MOVWF        HUMEDAD
            RETURN   
;SIGUINETE RANGO DE MEDICIONES-.........
RANGO_2
            CLRF        STATUS
            MOVLW        0XA7
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_19
            MOVLW        .79
            MOVWF        HUMEDAD
            RETURN   
ASK_19
            CLRF        STATUS
            MOVLW        0XA5
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_20
            MOVLW        .78
            MOVWF        HUMEDAD
            RETURN               
ASK_20
            CLRF        STATUS
            MOVLW        0XA4
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_21
            MOVLW        .77
            MOVWF        HUMEDAD
            RETURN   
ASK_21
            CLRF        STATUS
            MOVLW        0XA2
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_22
            MOVLW        .76
            MOVWF        HUMEDAD
            RETURN   
ASK_22
            CLRF        STATUS
            MOVLW        0XA1
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_23
            MOVLW        .75
            MOVWF        HUMEDAD
            RETURN   
ASK_23
            CLRF        STATUS
            MOVLW        0X9F
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_24
            MOVLW        .74
            MOVWF        HUMEDAD
            RETURN   
ASK_24
            CLRF        STATUS
            MOVLW        0X9E
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_25
            MOVLW        .73
            MOVWF        HUMEDAD
            RETURN   
ASK_25
            CLRF        STATUS
            MOVLW        0X9C
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_26
            MOVLW        .72
            MOVWF        HUMEDAD
            RETURN   
ASK_26
            CLRF        STATUS
            MOVLW        0X9A
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_27
            MOVLW        .71
            MOVWF        HUMEDAD
            RETURN   
ASK_27
            CLRF        STATUS
            MOVLW        0X99
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_3
            MOVLW        .70
            MOVWF        HUMEDAD
            RETURN   

;INICIA EL SIGUIENTE RANGO...
RANGO_3
            CLRF        STATUS
            MOVLW        0X97
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_28
            MOVLW        .69
            MOVWF        HUMEDAD
            RETURN
ASK_28
            CLRF        STATUS
            MOVLW        0X96
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_29
            MOVLW        .68
            MOVWF        HUMEDAD
            RETURN
ASK_29
            CLRF        STATUS
            MOVLW        0X94
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_30
            MOVLW        .67
            MOVWF        HUMEDAD
            RETURN   
ASK_30
            CLRF        STATUS
            MOVLW        0X93
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_31
            MOVLW        .66
            MOVWF        HUMEDAD
            RETURN               
ASK_31
            CLRF        STATUS
            MOVLW        0X91
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_32
            MOVLW        .65
            MOVWF        HUMEDAD
            RETURN   
ASK_32
            CLRF        STATUS
            MOVLW        0X8F
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_33
            MOVLW        .64
            MOVWF        HUMEDAD
            RETURN   
ASK_33
            CLRF        STATUS
            MOVLW        0X8E
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_34
            MOVLW        .63
            MOVWF        HUMEDAD
            RETURN   
ASK_34
            CLRF        STATUS
            MOVLW        0X8C
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_35
            MOVLW        .62
            MOVWF        HUMEDAD
            RETURN   
ASK_35
            CLRF        STATUS
            MOVLW        0X8B
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_36
            MOVLW        .61
            MOVWF        HUMEDAD
            RETURN   
ASK_36
            CLRF        STATUS
            MOVLW        0X89
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_4
            MOVLW        .60
            MOVWF        HUMEDAD
            RETURN
;SIGUINETE RANGO DE MEDICIONES-.........
RANGO_4
            CLRF        STATUS
            MOVLW        0X88
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_37
            MOVLW        .59
            MOVWF        HUMEDAD
            RETURN
ASK_37
            CLRF        STATUS
            MOVLW        0X86
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_38
            MOVLW        .58
            MOVWF        HUMEDAD
            RETURN   
ASK_38
            CLRF        STATUS
            MOVLW        0X84
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_39
            MOVLW        .57
            MOVWF        HUMEDAD   
ASK_39
            CLRF        STATUS
            MOVLW        0X83
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_40
            MOVLW        .56
            MOVWF        HUMEDAD
            RETURN   
ASK_40
            CLRF        STATUS
            MOVLW        0X81
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_41
            MOVLW        .55
            MOVWF        HUMEDAD   
ASK_41
            CLRF        STATUS
            MOVLW        0X80
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_42
            MOVLW        .54
            MOVWF        HUMEDAD
            RETURN   
ASK_42
            CLRF        STATUS
            MOVLW        0X7E
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_43
            MOVLW        .53
            MOVWF        HUMEDAD   
ASK_43
            CLRF        STATUS
            MOVLW        0X7D
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_44
            MOVLW        .52
            MOVWF        HUMEDAD
            RETURN   
ASK_44
            CLRF        STATUS
            MOVLW        0X7B
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_45
            MOVLW        .51
            MOVWF        HUMEDAD
ASK_45
            CLRF        STATUS
            MOVLW        0X79
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_5
            MOVLW        .50
            MOVWF        HUMEDAD
            RETURN
;SIGUINETE RANGO DE MEDICIONES-........   
RANGO_5
            CLRF        STATUS
            MOVLW        0X78
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_46
            MOVLW        .49
            MOVWF        HUMEDAD
ASK_46
            CLRF        STATUS
            MOVLW        0X76
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_47
            MOVLW        .48
            MOVWF        HUMEDAD   
ASK_47
            CLRF        STATUS
            MOVLW        0X75
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_48
            MOVLW        .47
            MOVWF        HUMEDAD   
ASK_48
            CLRF        STATUS
            MOVLW        0X73
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_49
            MOVLW        .46
            MOVWF        HUMEDAD       
ASK_49
            CLRF        STATUS
            MOVLW        0X72
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_50
            MOVLW        .45
            MOVWF        HUMEDAD   
ASK_50
            CLRF        STATUS
            MOVLW        0X70
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_51
            MOVLW        .44
            MOVWF        HUMEDAD
            RETURN   
ASK_51
            CLRF        STATUS
            MOVLW        0X6E
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_52
            MOVLW        .43
            MOVWF        HUMEDAD   
ASK_52
            CLRF        STATUS
            MOVLW        0X6D
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_53
            MOVLW        .42
            MOVWF        HUMEDAD
            RETURN   
ASK_53
            CLRF        STATUS
            MOVLW        0X6B
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_54
            MOVLW        .41
            MOVWF        HUMEDAD
ASK_54
            CLRF        STATUS
            MOVLW        0X6A
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_6                ;,,;,;,;;,ANTES GOTO  RANGO_6 PERO COMO SE TRABO CALANDO AVER SI JALA
            MOVLW        .40
            MOVWF        HUMEDAD
            RETURN

;COMIENZA SIGUIENTE RANGO ......
RANGO_6
            CLRF        STATUS
            MOVLW        0X69
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_55
            MOVLW        .39
            MOVWF        HUMEDAD
            RETURN
ASK_55
            CLRF        STATUS
            MOVLW        0X68
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_56
            MOVLW        .38
            MOVWF        HUMEDAD
            RETURN
ASK_56
            CLRF        STATUS
            MOVLW        0X67
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_57
            MOVLW        .37
            MOVWF        HUMEDAD
            RETURN
ASK_57
            CLRF        STATUS
            MOVLW        0X63
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_58
            MOVLW        .36
            MOVWF        HUMEDAD
            RETURN
ASK_58
            CLRF        STATUS
            MOVLW        0X62
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_59
            MOVLW        .35
            MOVWF        HUMEDAD
            RETURN
ASK_59
            CLRF        STATUS
            MOVLW        0X60
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_60
            MOVLW        .34
            MOVWF        HUMEDAD
            RETURN
ASK_60
            CLRF        STATUS
            MOVLW        0X5F
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_61
            MOVLW        .33
            MOVWF        HUMEDAD
            RETURN
ASK_61
            CLRF        STATUS
            MOVLW        0X5D
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_62
            MOVLW        .32
            MOVWF        HUMEDAD
            RETURN
ASK_62
            CLRF        STATUS
            MOVLW        0X5C
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_63
            MOVLW        .31
            MOVWF        HUMEDAD
            RETURN
ASK_63
            CLRF        STATUS
            MOVLW        0X5A
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_7
            MOVLW        .30
            MOVWF        HUMEDAD
            RETURN

;COMIENZA SIGUIENTE RANGO....
RANGO_7
            CLRF        STATUS
            MOVLW        0X58
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_64
            MOVLW        .29
            MOVWF        HUMEDAD
            RETURN
ASK_64
            CLRF        STATUS
            MOVLW        0X57
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_65
            MOVLW        .28
            MOVWF        HUMEDAD
            RETURN
ASK_65
            CLRF        STATUS
            MOVLW        0X55
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_66
            MOVLW        .27
            MOVWF        HUMEDAD
            RETURN
ASK_66
            CLRF        STATUS
            MOVLW        0X54
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_67
            MOVLW        .26
            MOVWF        HUMEDAD
            RETURN
ASK_67
            CLRF        STATUS
            MOVLW        0X52
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_68
            MOVLW        .25
            MOVWF        HUMEDAD
            RETURN
ASK_68
            CLRF        STATUS
            MOVLW        0X51
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_69
            MOVLW        .24
            MOVWF        HUMEDAD
            RETURN
ASK_69
            CLRF        STATUS
            MOVLW        0X4F
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_70
            MOVLW        .23
            MOVWF        HUMEDAD
            RETURN
ASK_70
            CLRF        STATUS
            MOVLW        0X4D
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_71
            MOVLW        .22
            MOVWF        HUMEDAD
            RETURN
ASK_71
            CLRF        STATUS
            MOVLW        0X4C
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_72
            MOVLW        .21
            MOVWF        HUMEDAD
            RETURN
ASK_72
            CLRF        STATUS
            MOVLW        0X4A
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_8
            MOVLW        .20
            MOVWF        HUMEDAD
            RETURN

;COMIENZA EL SIGUIENTE RANGO.....
RANGO_8
            CLRF        STATUS
            MOVLW        0X49
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_73
            MOVLW        .19
            MOVWF        HUMEDAD
            RETURN
ASK_73
            CLRF        STATUS
            MOVLW        0X47
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_74
            MOVLW        .18
            MOVWF        HUMEDAD
            RETURN
ASK_74
            CLRF        STATUS
            MOVLW        0X46
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_75
            MOVLW        .17
            MOVWF        HUMEDAD
            RETURN
ASK_75
            CLRF        STATUS
            MOVLW        0X44
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_76
            MOVLW        .16
            MOVWF        HUMEDAD
            RETURN
ASK_76
            CLRF        STATUS
            MOVLW        0X42
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_77
            MOVLW        .15
            MOVWF        HUMEDAD
            RETURN
ASK_77
            CLRF        STATUS
            MOVLW        0X41
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_78
            MOVLW        .14
            MOVWF        HUMEDAD
            RETURN
ASK_78
            CLRF        STATUS
            MOVLW        0X3F
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_79
            MOVLW        .13
            MOVWF        HUMEDAD
            RETURN
ASK_79
            CLRF        STATUS
            MOVLW        0X3E
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_80
            MOVLW        .12
            MOVWF        HUMEDAD
            RETURN
ASK_80
            CLRF        STATUS
            MOVLW        0X3C
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_81
            MOVLW        .11
            MOVWF        HUMEDAD
            RETURN
ASK_81
            CLRF        STATUS
            MOVLW        0X3B
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        RANGO_9
            MOVLW        .10
            MOVWF        HUMEDAD
            RETURN

;COMIENZA EL SIHUIENTE RANGO.....
RANGO_9
            CLRF        STATUS
            MOVLW        0X39
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_82
            MOVLW        .9
            MOVWF        HUMEDAD
            RETURN
ASK_82
            CLRF        STATUS
            MOVLW        0X37
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_83
            MOVLW        .8
            MOVWF        HUMEDAD
            RETURN
ASK_83
            CLRF        STATUS
            MOVLW        0X36
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_84
            MOVLW        .7
            MOVWF        HUMEDAD
            RETURN
ASK_84
            CLRF        STATUS
            MOVLW        0X34
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_85
            MOVLW        .6
            MOVWF        HUMEDAD
            RETURN
ASK_85
            CLRF        STATUS
            MOVLW        0X33
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_86
            MOVLW        .5
            MOVWF        HUMEDAD
            RETURN
ASK_86
            CLRF        STATUS
            MOVLW        0X31
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_87
            MOVLW        .4
            MOVWF        HUMEDAD
            RETURN
ASK_87
            CLRF        STATUS
            MOVLW        0X30
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_88
            MOVLW        .3
            MOVWF        HUMEDAD
            RETURN
ASK_88
            CLRF        STATUS
            MOVLW        0X2E
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        ASK_89
            MOVLW        .2
            MOVWF        HUMEDAD
            RETURN
ASK_89
            CLRF        STATUS
            MOVLW        0X2C
            SUBWF        DATO_H,W
            BTFSS        STATUS,Z
            GOTO        H_CERO
            MOVLW        .1
            MOVWF        HUMEDAD
            RETURN
H_CERO
            MOVLW        .0
            MOVWF        HUMEDAD
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            INCLUDE        "RETARDOS.INC"
            END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ahora el codigo correspondiente para el sensor de temperatura:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                                   ;
; ESTACION METEOROLOGICA INALAMBRICA CON CAPACIDAD DE 2 SENSORES MODULANDO EN FSK  ;
;                                                                                   ;
;    DESARROLLO DE PROYECTOS ITSON            TELECOMUNICACIONES II                   ;
;    BY: ING. OSCAR IVAN ALVARADO AGUIRRE                                           ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        LIST        P=16F877A
        INCLUDE        "P16F877A.INC"
        __CONFIG    0X3F19        ;3F19
        ERRORLEVEL    -302

;    PC:    COMPUTADORA        TX Y RX: TRANSCEPTORES FSK
;    S1: SENSOR 1                                                     __________
;    S2: SENSOR 2                ^^            ^^                        |           |
;    ______                        ||             ||                        |    PC    |
;  |  S1  |            ____________||    ))))    ||____________            |__________|
;  |______|________|             |     -->    |              |                |  |
;                  _|        TX         |            |     RX      |______/¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬\   
;                 | |_____________|            |_____________|        /_________________ \
;    _____________|
;  |  S2  |
;  |______|


;ESTE CODIGO CORRESPONDE AL CODIGO FUENTE DEL MODULO TRANSMISOR EN EL QUE SOLO SE OCUPARAN LOS
;MODULOS ADC DEL MICROCONTROLADOR Y EL USART CONFIGURADO A 9600 BAUDIOS POR CONVENIENCIA DE TAL
;MANERA QUE EL ADC TENDRA 2 ENTRADAS Y EL USART SOLO SE USARA PARA TRANSMITIR, POSTERIORMENTE
;ANALIZARA EL CODIGO FUENTE PARA EL RECEPTOR .....

            CBLOCK        0X20
            DATO_H
            DATO_L
            TEMPORAL
            HUMEDAD
            TEMPERATURA
            ESTATUS
            CONVERSION
            CONTADOR
            DATO_ENVIA
            DATO_RECIBIDO
            cuenta1
            cuenta2
            cuenta3
            ENDC
       
            ORG            0X00
            GOTO        INICIO
            ORG            0X04
            GOTO         RSI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;PROGRAMA PRINCIPAL (MAIN) DONDE CONFIGURA PUERTOS, LUEGO USART Y ESPERA CONECCION CON REMOTO, UNA VEZ ESTABLECIDA LA CONECCCION
;CONFIGURA ADC_HUMEDAD, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE 1 NIBBLE, DESPUES CAMBIA LA CONFIGURACION PARA
;SENSAR TEMPERATURA, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE  NIBBLE, Y SE DEVUELVE A CONFIGURAR EL ASC_HUMEDAD
INICIO
            CALL        CONF_PTOS        ;CONFIGURAMOS LOS PUERTOS
            CLRF        PORTB            ;LIMPIA EL PUERTOB Y
            CLRF        PORTD
;CHEKA SI HAY CONECCION ESTABLECIDA CON EL REMOTO....
;AQUI        BTFSS        ESTATUS,7        ;ESTA EL EQUIPO CONECTADO CON EL MODULO INALAMBRICO???
;            GOTO        AQUI            ;NO, POR LO QUE NUNCA COMIENZA UNA CONVERSION
AKI
;HAY CONECCION SATISFACTORIA ASI QUE COMIENZA CON EL SENSOR 1 Y ENVIA PAQUETES....
            CALL        CONF_ADC1        ;CONFIGURO EL ADC Y LAS INTERUPCIONES POR HUMEDAD
            CALL        RETARDO_20MICROS;ESPERA TERMINE LA CONVERSION PARA APAGAR EL MODULO DEL ADC
;EMPAQUETA DATOS:
            CLRF        TEMPORAL
            CLRF        CONVERSION
            MOVF        TEMPERATURA,W
            CALL        RETARDO_500MS
            GOTO        AKI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA DE SERVICIO QUE CONFIFGURA LOS PUERTOS ADECUADAMENTE PARA EL CORRECTO FUNCIONAMIENTO DE LA ESTACION METEREOLOGICA   
;       
CONF_PTOS   
            BSF            STATUS,RP0        ;BANCO1
            BSF            TRISA,0            ;SELECCIÓN DE LA ENTRADA ANALÓGICA
            CLRF        TRISB            ;LIMPIAMOS EL PUERTOB ASÍ COMO
            CLRF        TRISC            ;EL PUERTOC
            CLRF        TRISE
            CLRF        TRISD
            MOVLW        0X07            ;SELECCIONAMOS EL PRESCALADOR DE 8 (256)
            MOVWF        CMCON
            MOVWF        OPTION_REG
            BCF            STATUS,RP0        ;BANCO0
            RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE CONFIGURA AL MODULO ADC PARA SENSAR LA TEMPERATURA POR LO QUE VREF+ SE VE ACTIVADO PARA TENER UN MENOR RANGO
;DE CONVERSION Y PODER ASI NO PERDER DATOS EN LA CONVERSION .... ADC POR EL PUERTO A(1)
;con 2,56V +Vref externo
CONF_ADC1   
            BCF            ESTATUS,1        ;PONE AL EQUIPO A CONVERTIR DATOS DE ADC PARA TEMPERATURA SOLAMENTE
            BSF            STATUS,RP0        ;SELECCIONO EL BANCO1
            MOVLW        B'00000101'        ;CONFIGURO LA ENTRADA A/D Y EL RESULTADO JUSTIFICADO A LA IZQUIERDA
            MOVWF        ADCON1            ;AN0, AN1, AD2, VREF+, AD4:AD7
                                        ;HABILITA LAS INTERRUPCIONES A/D SOLO TRABAJA A 8 BITS (REGISTRO ADRESH)
            BSF            PIE1,ADIE        ;SELECCIONA EL BANCO0
            BCF            STATUS,RP0       
            MOVLW        B'10001001'        ;FOSC/32,ENCIENDE A/D,CANAL 1 (AN1) 
            MOVWF        ADCON0
            BCF            PIR1,ADIF        ;LIMPIA LAS BANDERAS A/D
            BSF            INTCON,PEIE        ;HABILITA INTERRUPCIONES PERIFERICAS
            BSF            INTCON,GIE        ;HABILITA TODAS LAS INTERRUPCIONES
            NOP
            NOP
ESPERA1        BTFSS        INTCON,T0IF
            GOTO        ESPERA1
            BSF            ADCON0,GO        ;COMIENZA LA CONVERSION Y EL BIT ADIF SE PONDRA EN ALTO Y SE BORRARA GO/DONE DESPUES
            RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SERVICIO DE INTERRUPCIONES (VECTOR DE INTERRUPCION) YA SEA POR USART O POR ADC
RSI
            BTFSS        PIR1,ADIF        ;SE PONDRA EN 1 CUANDO HAYA TERMINADO LA CONVERSIÓN
            RETFIE           
            BCF            INTCON,GIE        ;SIGUE EN PIE LA CONVERSIÓN
            MOVF        ADRESH,W        ;LE CARGA A W LA PARTE ALTA DE LA CONVERSIÓN
                                        ;Y LA MUESTRA POR EL PUERTOB
            MOVWF        DATO_H
            MOVF        DATO_H,W        ;RUTINA QUE CONVIERTE EL VALOR DE TEMPERATURA EN GRADOS CENTIGRADOS(°C)
            MOVWF        TEMPERATURA
            MOVF        TEMPERATURA,W
            MOVWF        PORTD
            MOVWF        PORTB
            BCF            PIR1,ADIF        ;LIMPIA LA BANDERA PARA ESPERAR OTRA CONVERSIÓN
            BSF            INTCON,GIE
            RETFIE


            RETURN
           
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            INCLUDE        "RETARDOS.INC"
            END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

y ahora le toca el turno a las librerias utilizadas en todos los codigos de arriba:
;******************************************** LIBRERÍA "BIN_BCD.INC" **************************************************
; ===================================================================
;;UN NÚMERO BINARIO NATURAL DE 8 BITS ES CONVERTIDO A BCD. EL RESULTADO SE GUARDA EN TRES
; POSICIONES DE MEMORIAS LLAMADAS: BCD_CENTENAS, BCD_DECENAS Y BCD_UNIDADES.
;;EL PROCEDIMIENTO UTILIZADO ES MEDIANTE RESTAS DE 10, TAL COMO SE EXPLICÓ EN EL CAPÍTULO 9.
;;ENTRADA: EN EL REGISTRO W EL NÚMERO BINARIO NATURAL A CONVERTIR.
; SALIDAS: EN (BCD_CENTENAS), (BCD_DECENAS) Y (BCD_UNIDADES).
; EN EL REGISTRO W TAMBIÉN LAS DECENAS (NIBBLE ALTO) Y UNIDADES (NIBBLE BAJO).

;******************************************** SUBRUTINA "BIN_A_BCD" **************************************************
 CBLOCK ; EN LAS SUBRUTINAS NO SE DEBE FIJAR LA DIRECCIÓN
BCD_CENTENAS ; DE LA RAM DE USUARIO. SE TOMA A CONTINUACIÓN DE
BCD_DECENAS ; LA ÚLTIMA ASIGNADA.
BCD_UNIDADES
 ENDC
BIN_A_BCD   CLRF BCD_CENTENAS ; CARGA LOS REGISTROS CON EL RESULTADO INICIAL.
            CLRF BCD_DECENAS ; EN PRINCIPIO LAS CENTENAS Y DECENAS A CERO.
            MOVWF BCD_UNIDADES ; SE CARGA EL NÚMERO BINARIO A CONVERTIR.
BCD_RESTA10 MOVLW .10 ; A LAS UNIDADES SE LES VA RESTANDO 10 EN CADA
            SUBWF BCD_UNIDADES,W ; PASADA. (W)=(BCD_UNIDADES) -10.
            BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?, ¿(BCD_UNIDADES)>=10?
            GOTO BIN_BCD_FIN ; NO, ES MENOR DE 10. SE ACABÓ.
BCD_INCREMENTADECENAS
            MOVWF BCD_UNIDADES ; RECUPERA LO QUE QUEDA POR RESTAR.
            INCF BCD_DECENAS,F ; INCREMENTA LAS DECENAS Y COMPRUEBA SI HA
            MOVLW .10 ; LLEGADO A 10. LO HACE MEDIANTE UNA RESTA.
            SUBWF BCD_DECENAS,W ; (W)=(BCD_DECENAS)-10).
            BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?,¿(BCD_DECENAS)>=10?
            GOTO BCD_RESTA10 ; NO. VUELVE A DAR OTRA PASADA, RESTÁNDOLE
                             ; 10 A LAS UNIDADES.
BCD_INCREMENTACENTENAS
            CLRF BCD_DECENAS ; PONE A CERO LAS DECENAS
            INCF BCD_CENTENAS,F ; E INCREMENTA LAS CENTENAS.
            GOTO BCD_RESTA10 ; OTRA PASADA: RESTA 10 AL NÚMERO A CONVERTIR.
BIN_BCD_FIN SWAPF BCD_DECENAS,W ; EN EL NIBBLE ALTO DE (W) TAMBIÉN LAS DECENAS.
            ADDWF BCD_UNIDADES,W ; EN EL NIBBLE BAJO DE (W) LAS UNIDADES.
            RETURN ; VUELVE AL PROGRAMA PRINCIPAL.

otra libreria:......
;**************************** LIBRERÍA "RETARDOS.INC" *********************************
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                                   ;
;         LIBRERIA DE RETARDOS DE PROPOSITO GENERAL PARA MICROCONTROLADOR PIC        ;
;                                                                                   ;
;    DESARROLLO DE PROYECTOS ITSON            TELECOMUNICACIONES II                   ;
;    BY: ING. OSCAR IVAN ALVARADO AGUIRRE                                           ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; LIBRERÍA CON MÚLTIPLES SUBRUTINAS DE RETARDOS, DESDE 4 MICROSEGUNDOS HASTA 20 SEGUNDOS.
; ADEMÁS SE PUEDEN IMPLEMENTAR OTRAS SUBRUTINAS MUY FÁCILMENTE.
;
; SE HAN CALCULADO PARA UN SISTEMA MICROCONTROLADOR CON UN PIC TRABAJANDO CON UN CRISTAL
; DE CUARZO A 4 MHZ. COMO CADA CICLO MÁQUINA SON 4 CICLOS DE RELOJ, RESULTA QUE CADA
; CICLO MÁQUINA TARDA 4 X 1/4MHZ = 1 µS.
;
; EN LOS COMENTARIOS, "CM" SIGNIFICA "CICLOS MÁQUINA".
;
; ZONA DE DATOS *********************************************************************

    CBLOCK
    R_CONTA                        ; CONTADORES PARA LOS RETARDOS.
    R_CONTB
    R_CONTC
    ENDC
;
; RETARDOS DE 4 HASTA 10 MICROSEGUNDOS ---------------------------------------------------
;
; A CONTINUACIÓN RETARDOS PEQUEÑOS TENIENDO EN CUENTA QUE PARA UNA FRECUENCIA DE 4 MHZ,
; LA LLAMADA A SUBRUTINA "CALL" TARDA 2 CICLOS MÁQUINA, EL RETORNO DE SUBRUTINA
; "RETURN" TOMA OTROS 2 CICLOS MÁQUINA Y CADA INSTRUCCIÓN "NOP" TARDA 1 CICLO MÁQUINA.
;
RETARDO_10MICROS                ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    NOP                            ; APORTA 1 CICLO MÁQUINA.
    NOP                            ; APORTA 1 CICLO MÁQUINA.
    NOP                            ; APORTA 1 CICLO MÁQUINA.
    NOP                            ; APORTA 1 CICLO MÁQUINA.
    NOP                            ; APORTA 1 CICLO MÁQUINA.
RETARDO_5MICROS                    ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    NOP                            ; APORTA 1 CICLO MÁQUINA.
RETARDO_4MICROS                    ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    RETURN                        ; EL SALTO DEL RETORNO APORTA 2 CICLOS MÁQUINA.
;
; RETARDOS DE 20 HASTA 500 MICROSEGUNDOS ------------------------------------------------
;
RETARDO_500MICROS                ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    NOP                            ; APORTA 1 CICLO MÁQUINA.
    MOVLW    D'164'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
    GOTO    RETARDOMICROS        ; APORTA 2 CICLOS MÁQUINA.
RETARDO_200MICROS                ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    NOP                            ; APORTA 1 CICLO MÁQUINA.
    MOVLW    D'64'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
    GOTO    RETARDOMICROS        ; APORTA 2 CICLOS MÁQUINA.
RETARDO_100MICROS                ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'31'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
    GOTO    RETARDOMICROS        ; APORTA 2 CICLOS MÁQUINA.
RETARDO_50MICROS                ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    NOP                            ; APORTA 1 CICLO MÁQUINA.
    MOVLW    D'14'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
    GOTO    RETARDOMICROS        ; APORTA 2 CICLOS MÁQUINA.
RETARDO_20MICROS                ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'5'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
;
; EL PRÓXIMO BLOQUE "RETARDOMICROS" TARDA:
; 1 + (K-1) + 2 + (K-1)X2 + 2 = (2 + 3K) CICLOS MÁQUINA.
;
RETARDOMICROS
    MOVWF    R_CONTA                ; APORTA 1 CICLO MÁQUINA.
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 MÁQUINA.
    RETURN                        ; EL SALTO DEL RETORNO APORTA 2 CICLOS MÁQUINA.
;
;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 CICLOS MÁQUINA.
    MOVLW    D'200'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
    GOTO    RETARDOS_MS            ; APORTA 2 CICLOS MÁQUINA.
RETARDO_100MS                    ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'100'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
    GOTO    RETARDOS_MS            ; APORTA 2 CICLOS MÁQUINA.
RETARDO_50MS                    ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'50'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
    GOTO    RETARDOS_MS            ; APORTA 2 CICLOS MÁQUINA.
RETARDO_20MS                    ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'20'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
    GOTO    RETARDOS_MS            ; APORTA 2 CICLOS MÁQUINA.
RETARDO_10MS                    ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'10'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
    GOTO    RETARDOS_MS            ; APORTA 2 CICLOS MÁQUINA.
RETARDO_5MS                        ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'5'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
    GOTO    RETARDOS_MS            ; APORTA 2 CICLOS MÁQUINA.
RETARDO_2MS                        ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'2'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
    GOTO    RETARDOS_MS            ; APORTA 2 CICLOS MÁQUINA.
RETARDO_1MS                        ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'1'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
;
; EL PRÓXIMO 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 MÁQUINA. PARA K=249 Y M=1 SUPONE 1002 CICLOS MÁQUINA
; QUE A 4 MHZ SON 1002 µS = 1 MS.
;
RETARDOS_MS
    MOVWF    R_CONTB                ; APORTA 1 CICLO MÁQUINA.
R1MS_BUCLEEXTERNO
    MOVLW    D'249'                ; APORTA MX1 CICLOS MÁQUINA. ESTE ES EL VALOR DE "K".
    MOVWF    R_CONTA                ; APORTA MX1 CICLOS MÁQUINA.
R1MS_BUCLEINTERNO
    NOP                            ; APORTA KXMX1 CICLOS MÁQUINA.
    DECFSZ    R_CONTA,F            ; (K-1)XMX1 CM (CUANDO NO SALTA) + MX2 CM (AL SALTAR).
    GOTO    R1MS_BUCLEINTERNO    ; APORTA (K-1)XMX2 CICLOS MÁQUINA.
    DECFSZ    R_CONTB,F            ; (M-1)X1 CM (CUANDO NO SALTA) + 2 CM (AL SALTAR).
    GOTO    R1MS_BUCLEEXTERNO     ; APORTA (M-1)X2 CICLOS MÁQUINA.
    RETURN                        ; EL SALTO DEL RETORNO APORTA 2 CICLOS MÁQUINA.
;
;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" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'200'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
    GOTO    RETARDO_1DECIMA        ; APORTA 2 CICLOS MÁQUINA.
RETARDO_10S                        ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'100'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
    GOTO    RETARDO_1DECIMA        ; APORTA 2 CICLOS MÁQUINA.
RETARDO_5S                        ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'50'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
    GOTO    RETARDO_1DECIMA        ; APORTA 2 CICLOS MÁQUINA.
RETARDO_2S                        ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'20'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
    GOTO    RETARDO_1DECIMA        ; APORTA 2 CICLOS MÁQUINA.
RETARDO_1S                        ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'10'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
    GOTO    RETARDO_1DECIMA        ; APORTA 2 CICLOS MÁQUINA.
RETARDO_500MS                    ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
    MOVLW    D'5'                ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
;
; EL PRÓXIMO 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 MÁQUINA. PARA K=249, M=100 Y N=1 SUPONE 100011
; CICLOS MÁQUINA QUE A 4 MHZ SON 100011 µS = 100 MS = 0,1 S = 1 DÉCIMA DE SEGUNDO.
;
RETARDO_1DECIMA
    MOVWF    R_CONTC                ; APORTA 1 CICLO MÁQUINA.
R1DECIMA_BUCLEEXTERNO2
    MOVLW    D'100'                ; APORTA NX1 CICLOS MÁQUINA. ESTE ES EL VALOR DE "M".
    MOVWF    R_CONTB                ; APORTA NX1 CICLOS MÁQUINA.
R1DECIMA_BUCLEEXTERNO
    MOVLW    D'249'                ; APORTA MXNX1 CICLOS MÁQUINA. ESTE ES EL VALOR DE "K".
    MOVWF    R_CONTA                ; APORTA MXNX1 CICLOS MÁQUINA.
R1DECIMA_BUCLEINTERNO         
    NOP                            ; APORTA KXMXNX1 CICLOS MÁQUINA.
    DECFSZ    R_CONTA,F            ; (K-1)XMXNX1 CM (SI NO SALTA) + MXNX2 CM (AL SALTAR).
    GOTO    R1DECIMA_BUCLEINTERNO    ; APORTA (K-1)XMXNX2 CICLOS MÁQUINA.
    DECFSZ    R_CONTB,F            ; (M-1)XNX1 CM (CUANDO NO SALTA) + NX2 CM (AL SALTAR).
    GOTO    R1DECIMA_BUCLEEXTERNO    ; APORTA (M-1)XNX2 CICLOS MÁQUINA.
    DECFSZ    R_CONTC,F            ; (N-1)X1 CM (CUANDO NO SALTA) + 2 CM (AL SALTAR).
    GOTO    R1DECIMA_BUCLEEXTERNO2    ; APORTA (N-1)X2 CICLOS MÁQUINA.
    RETURN                        ; EL SALTO DEL RETORNO APORTA 2 CICLOS MÁQUINA.
;
;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).

la libreria de mensajes del LCD:
;******************************************** LIBRERÍA "LCD_MENS.INC" ***********************************************
;;LIBRERÍA DE SUBRUTINAS PARA EL MANEJO DE MENSAJES A VISUALIZAR EN UN VISUALIZADOR LCD.
 CBLOCK
LCD_APUNTACARACTER ; INDICA LA POSICIÓN DEL CARÁCTER A VISUALIZAR
; RESPECTO DEL COMIENZO DE TODOS LOS MENSAJES,
; (POSICIÓN DE LA ETIQUETA "MENSAJES").
LCD_VALORCARACTER ; CÓDIGO ASCII DEL CARÁCTER A
 ENDC ; VISUALIZAR.
; LOS MENSAJES TIENEN QUE ESTAR SITUADOS DENTRO DE LAS 256 PRIMERAS POSICIONES DE LA
; MEMORIA DE PROGRAMA, ES DECIR, NO PUEDEN SUPERAR LA DIRECCIÓN 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 ADDWF PCL,F ; ¡ETIQUETA OBLIGATORIA!
; MENSAJE0 DT ".. ..", 0X00 ; POSICIÓN INICIAL DEL MENSAJE.
; ; MENSAJE TERMINADO EN 0X00.
; MENSAJE1
; ...
; ...
; FINMENSAJES
;;LA LLAMADA A ESTA SUBRUTINA SE REALIZARÁ SIGUIENDO ESTE EJEMPLO:
;
; MOVLW MENSAJE0 ; CARGA LA POSICIÓN DEL MENSAJE.
; CALL LCD_MENSAJE ; VISUALIZA EL MENSAJE.
;
LCD_MENSAJE
         MOVWF LCD_APUNTACARACTER ; POSICIÓN DEL PRIMER CARÁCTER DEL MENSAJE.
         MOVLW MENSAJES ; HALLA LA POSICIÓN RELATIVA DEL PRIMER CARÁCTER
         SUBWF LCD_APUNTACARACTER,F ; DEL MENSAJE RESPECTO DE ETIQUETA "MENSAJES".
         DECF LCD_APUNTACARACTER,F ; COMPENSA LA POSICIÓN QUE OCUPA "ADDWF PCL,F".
LCD_VISUALIZAOTROCARACTER
         MOVF LCD_APUNTACARACTER,W
         CALL MENSAJES ; OBTIENE EL CÓDIGO ASCII DEL CARÁCTER APUNTADO.
         MOVWF LCD_VALORCARACTER ; GUARDA EL VALOR DE CARÁCTER.
         MOVF LCD_VALORCARACTER,F ; LO ÚNICO QUE HACE ES POSICIONAR FLAG Z. EN CASO
         BTFSC STATUS,Z ; QUE SEA "0X00", QUE ES CÓDIGO INDICADOR FINAL
         GOTO LCD_FINMENSAJE ; DE MENSAJE, SALE FUERA.
LCD_NOULTIMOCARACTER
         CALL LCD_CARACTER ; VISUALIZA EL CARÁCTER ASCII LEÍDO.
         INCF LCD_APUNTACARACTER,F ; APUNTA A LA POSICIÓN DEL SIGUIENTE CARÁCTER
         GOTO LCD_VISUALIZAOTROCARACTER ; DENTRO DEL MENSAJE.
LCD_FINMENSAJE
         RETURN ; VUELVE AL PROGRAMA PRINCIPAL.
; ******************************* SUBRUTINA "LCD_MENSAJEMOVIMIENTO" ***********************************************
;;VISUALIZA UN MENSAJE DE MAYOR LONGITUD QUE LOS 16 CARACTERES QUE PUEDEN REPRESENTARSE
; EN UNA LÍNEA, POR TANTO SE DESPLAZA A TRAVÉS 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 MÁS LEGIBLE POSIBLE.
;
 CBLOCK
LCD_CURSORPOSICION ; CONTABILIZA LA POSICIÓN DEL CURSOR DENTRO DE LA
 ENDC ; PANTALLA LCD

LCD_MENSAJEMOVIMIENTO
       MOVWF LCD_APUNTACARACTER ; POSICIÓN DEL PRIMER CARÁCTER DEL MENSAJE.
       MOVLW MENSAJES ; HALLA LA POSICIÓN RELATIVA DEL PRIMER CARÁCTER
       SUBWF LCD_APUNTACARACTER,F ; DEL MENSAJE RESPECTO DE LA ETIQUETA "MENSAJES".
       DECF LCD_APUNTACARACTER,F ; COMPENSA LA POSICIÓN QUE OCUPA "ADDWF PCL,F".
LCD_PRIMERAPOSICION
       CLRF LCD_CURSORPOSICION ; EL CURSOR EN LA POSICIÓN 0 DE LA LÍNEA.
       CALL LCD_BORRA ; SE SITÚA EN LA PRIMERA POSICIÓN DE LA LÍNEA 1 Y
                      ; BORRA LA PANTALLA.
LCD_VISUALIZACARACTER
       MOVLW LCD_CARACTERESPORLINEA ; ¿HA LLEGADO A FINAL DE LÍNEA?
       SUBWF LCD_CURSORPOSICION,W
       BTFSS STATUS,Z
       GOTO LCD_NOESFINALLINEA
LCD_ESFINALLINEA
       CALL RETARDO_200MS ; LO MANTIENE VISUALIZADO DURANTE ESTE TIEMPO.
                          ; CALL RETARDO_200MS
       MOVLW LCD_CARACTERESPORLINEA-1 ; APUNTA A LA POSICIÓN DEL SEGUNDO CARÁCTER
       SUBWF LCD_APUNTACARACTER,F ; VISUALIZADO EN PANTALLA, QUE SERÁ EL PRIMERO EN LA
       GOTO LCD_PRIMERAPOSICION ; SIGUIENTE VISUALIZACIÓN DE LÍNEA, PARA PRODUCIR EL
                                ; EFECTO DE DESPLAZAMIENTO HACIA LA IZQUIERDA.
LCD_NOESFINALLINEA
       MOVF LCD_APUNTACARACTER,W
       CALL MENSAJES ; OBTIENE EL ASCII DEL CARÁCTER APUNTADO.
       MOVWF LCD_VALORCARACTER ; GUARDA EL VALOR DE CARÁCTER.
       MOVF LCD_VALORCARACTER,F ; LO ÚNICO QUE HACE ES POSICIONAR FLAG Z. EN CASO
       BTFSC STATUS,Z ; QUE SEA "0X00", QUE ES CÓDIGO INDICADOR FINAL
       GOTO LCD_FINMOVIMIENTO ; DE MENSAJE, SALE FUERA.
LCD_NOULTIMOCARACTER2
       CALL LCD_CARACTER ; VISUALIZA EL CARÁCTER ASCII LEÍDO.
       INCF LCD_CURSORPOSICION,F ; CONTABILIZA EL INCREMENTO DE POSICIÓN DEL
                                 ; CURSOR EN LA PANTALLA.
       INCF LCD_APUNTACARACTER,F ; APUNTA A LA SIGUIENTE POSICIÓN POR VISUALIZAR.
       GOTO LCD_VISUALIZACARACTER ; VUELVE A VISUALIZAR EL SIGUIENTE CARÁCTER
                                  ; DE LA LÍNEA.
LCD_FINMOVIMIENTO
       RETURN ; VUELVE AL PROGRAMA PRINCIPAL.


libreria del LCD para inicializacion y envio de datos al mismo por un puerto de 4 bits :
;*********************************************** 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 D DEL PIC MEDIANTE UN BUS DE 4 BITS. LAS
; CONEXIONES SON:
; - LAS 4 LÍNEAS SUPERIORES DEL MÓDULO LCD, PINES <PD7:PD4> SE CONECTAN A LAS 4
; LÍNEAS SUPERIORES DEL PUERTO D DEL PIC, PINES <RD7:RD4>.
; - PIN RS DEL LCD A LA LÍNEA RE0 DEL PIC.
; - PIN R/W DEL LCD A LA LÍNEA RE1 DEL PIC, O A MASA.
; - PIN ENABLE DEL LCD A LA LÍNEA RE2 DEL PIC.
;;SE UTILIZAN LLAMADAS A SUBRUTINAS DE RETARDO DE TIEMPO LOCALIZADAS EN LA LIBRERÍA RETARDOS.INC.
;;***************************************************** REGISTROS *********************************************************
 CBLOCK
LCD_DATO
LCD_GUARDADATO
LCD_GUARDATRISB
LCD_AUXILIAR1
LCD_AUXILIAR2
 ENDC
;***************************************************** IGUALDADES ********************************************************
LCD_CARACTERESPORLINEA EQU D'16' ; NÚMERO DE CARACTERES POR LÍNEA DE LA PANTALLA.
#DEFINE LCD_PINRS PORTE,0
#DEFINE LCD_PINRW PORTE,1
#DEFINE LCD_PINENABLE PORTE,2
#DEFINE LCD_BUSDATOS PORTD
; ********************************************* SUBRUTINA "LCD_INICIALIZA" **********************************************
; INICIALIZACIÓN DEL MÓDULO LCD: CONFIGURA FUNCIONES DEL LCD, PRODUCE RESET POR SOFTWARE,
; BORRA MEMORIA Y ENCIENDE PANTALLA. EL FABRICANTE ESPECIFICA QUE PARA GARANTIZAR 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 ; ACTIVA EL MODO COMANDO PONIENDO RS=0.
          CALL RETARDO_200MS     ;CALL RETARDO_20MS  100
          MOVLW B'00110000'
          CALL LCD_ESCRIBELCD ; ESCRIBE EL DATO EN EL LCD.
          CALL RETARDO_50MS        ;5MS   20
          MOVLW B'00110000'
          CALL LCD_ESCRIBELCD
          CALL RETARDO_20MS        ;200MICROS       1MS
          MOVLW B'00110000'
          CALL LCD_ESCRIBELCD
          MOVLW B'00100000' ; INTERFACE DE 4 BITS.
          CALL LCD_ESCRIBELCD; AHORA CONFIGURA EL RESTO DE LOS PARÁMETROS:
          CALL LCD_2LINEAS4BITS5X7 ; LCD DE 2 LÍNEAS Y CARACTERES DE 5X7 PUNTOS.
          CALL LCD_BORRA ; PANTALLA ENCENDIDA Y LIMPIA. CURSOR AL PRINCIPIO
          CALL LCD_CURSOROFF ; DE LA LÍNEA 1. CURSOR APAGADO.
          CALL LCD_CURSORINCR ; CURSOR EN MODO INCREMENTAR.
          RETURN
;***************************************** 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 DESPUÉS SE
; VUELVE A ENVIAR ESTE DATO SIN CAMBIARLO.
LCD_ESCRIBELCD
          ANDLW B'11110000' ; SE QUEDA CON EL NIBBLE ALTO DEL DATO QUE ES EL
          MOVWF LCD_DATO ; QUE HAY QUE ENVIAR Y LO GUARDA.
          CALL    RETARDO_20MICROS
          MOVF LCD_BUSDATOS,W ; LEE LA INFORMACIÓN ACTUAL DE LA PARTE BAJA
          ANDLW B'00001111' ; DEL PUERTO B, QUE NO SE DEBE ALTERAR.
          IORWF LCD_DATO,F ; ENVIARÁ LA PARTE ALTA DEL DATO DE ENTRADA
                           ; Y EN LA PARTE BAJA LO QUE HABÍA ANTES.
          CALL    RETARDO_20MICROS
          BSF STATUS,RP0 ; ACCESO AL BANCO 1.
          MOVF TRISD,W ; GUARDA LA CONFIGURACIÓN QUE TENÍA ANTES TRISB.
          MOVWF LCD_GUARDATRISB
          ;MOVLW B'00001111' ; LAS 4 LÍNEAS INFERIORES DEL PUERTO B SE DEJAN
          ;ANDWF PORTD,F ; COMO ESTABAN Y LAS 4 SUPERIORES COMO SALIDA.
          BCF STATUS,RP0 ; ACCESO AL BANCO 0.
          MOVF LCD_DATO,W ; RECUPERA EL DATO A ENVIAR.
          MOVWF LCD_BUSDATOS ; ENVÍA EL DATO AL MÓDULO LCD.
          CALL    RETARDO_20MICROS
          BSF LCD_PINENABLE ; PERMITE FUNCIONAMIENTO DEL LCD MEDIANTE UN PEQUEÑO
          CALL    RETARDO_5MICROS
          BCF LCD_PINENABLE ; PULSO Y TERMINA IMPIDIENDO EL FUNCIONAMIENTO DEL LCD.
          BSF STATUS,RP0 ; ACCESO AL BANCO 1. RESTAURA EL ANTIGUO VALOR EN
          MOVF LCD_GUARDATRISB,W ; LA CONFIGURACIÓN DEL PUERTO B.
          MOVWF PORTD ; REALMENTE ES TRISB.
          BCF STATUS,RP0 ; ACCESO AL BANCO 0.
          RETURN
; *******************************SUBRUTINAS VARIADAS PARA EL CONTROL DEL MÓDULO LCD *******************************
;LOS COMANDOS QUE PUEDEN SER EJECUTADOS SON:
LCD_CURSORINCR
          MOVLW B'00000110' ; CURSOR EN MODO INCREMENTAR.
          GOTO LCD_ENVIACOMANDO
LCD_LINEA1
          MOVLW B'10000000' ; CURSOR AL PRINCIPIO DE LA LÍNEA 1.
          GOTO LCD_ENVIACOMANDO ; DIRECCIÓN 00H DE LA DDRAM
LCD_LINEA2
          MOVLW B'11000000' ; CURSOR AL PRINCIPIO DE LA LÍNEA 2.
          GOTO LCD_ENVIACOMANDO ; DIRECCIÓN 40H DE LA DDRAM
LCD_POSICIONLINEA1
          IORLW B'10000000' ; CURSOR A POSICIÓN DE LA LÍNEA 1, A PARTIR DE LA
          GOTO LCD_ENVIACOMANDO ; DIRECCIÓN 00H DE LA DDRAM MÁS EL VALOR DEL REGISTRO W.
LCD_POSICIONLINEA2
          IORLW B'11000000' ; CURSOR A POSICIÓN DE LA LÍNEA 2, A PARTIR DE LA
          GOTO LCD_ENVIACOMANDO ; DIRECCIÓN 40H DE LA DDRAM MÁS EL VALOR DEL REGISTRO W.
LCD_OFF   MOVLW B'00001000' ; PANTALLA APAGADA.
          GOTO LCD_ENVIACOMANDO
LCD_CURSORON
          MOVLW B'00001110' ; PANTALLA ENCENDIDA Y CURSOR ENCENDIDO.
          GOTO LCD_ENVIACOMANDO
LCD_CURSOROFF
          MOVLW B'00001100' ; PANTALLA ENCENDIDA Y CURSOR APAGADO.
          GOTO LCD_ENVIACOMANDO
LCD_BORRA MOVLW B'00000001' ; BORRA TODA LA PANTALLA, MEMORIA DDRAM Y PONE EL
          GOTO LCD_ENVIACOMANDO ; CURSOR A PRINCIPIO DE LA LÍNEA 1.
LCD_2LINEAS4BITS5X7
          MOVLW B'00101000' ; DEFINE LA PANTALLA DE 2 LÍNEAS, CON CARACTERES
         GOTO LCD_ENVIACOMANDO ; DE 5X7 PUNTOS Y CONEXIÓN AL PIC MEDIANTE BUS DE 4 BITS.
; *************************** SUBRUTINAS "LCD_ENVIACOMANDO" Y "LCD_CARACTER" **********************************
; "LCD_ENVIACOMANDO". ESCRIBE UN COMANDO EN EL REGISTRO DEL MÓDULO LCD. LA PALABRA DE
; COMANDO HA SIDO ENTREGADA A TRAVÉS DEL REGISTRO W. TRABAJA EN MODO COMANDO.
; "LCD_CARACTER". ESCRIBE EN LA MEMORIA DDRAM DEL LCD EL CARÁCTER ASCII INTRODUCIDO A
; A TRAVÉS 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 "MODO DATO", PONIENDO RS=1.
           CALL LCD_CODIGOCGROM ; OBTIENE EL CÓDIGO PARA CORRECTA VISUALIZACIÓN.
LCD_ENVIA  MOVWF LCD_GUARDADATO ; GUARDA EL DATO A ENVIAR.
           CALL LCD_ESCRIBELCD ; PRIMERO ENVÍA EL NIBBLE ALTO.
           SWAPF LCD_GUARDADATO,W ; AHORA ENVÍA EL NIBBLE BAJO. PARA ELLO PASA EL
                                  ; NIBBLE BAJO DEL DATO A ENVIAR A PARTE ALTA DEL BYTE.
           CALL LCD_ESCRIBELCD ; SE ENVÍA AL VISUALIZADOR LCD.
           BTFSS LCD_PINRS ; DEBE GARANTIZAR UNA CORRECTA ESCRITURA
           CALL RETARDO_10MS;2MS ; MANTENIENDO 2 MS EN MODO COMANDO   >>>ANTES ESTAVA EN 10MS<<<<
           CALL RETARDO_10MS ; Y 50 µS EN MODO CARÁCTER.   >>>>ANTES EN 200MICROS<<<<<
           RETURN
;************************************** SUBRUTINA "LCD_CODIGOCGROM **********************************************
; A PARTIR DEL CARÁCTER ASCII NÚMERO 127 LOS CÓDIGOS DE LOS CARACTERES DEFINIDOS EN LA
; TABLA CGROM DEL LM016L NO COINCIDEN CON LOS CÓDIGOS ASCII. ASÍ POR EJEMPLO, EL CÓDIGO
; ASCII DE LA "Ñ" EN LA TABLA CGRAM DEL LM016L ES EEH.
;;
;ESTA SUBRUTINA CONVIERTE LOS CÓDIGOS ASCII DE LA "Ñ", "º" Y OTROS, A CÓDIGOS CGROM PARA QUE
; QUE PUEDAN SER VISUALIZADO EN EL MÓDULO LM016L.
;
; ENTRADA: EN (W) EL CÓDIGO ASCII DEL CARÁCTER QUE SE DESEA VISUALIZAR.
; SALIDA: EN (W) EL CÓDIGO DEFINIDO EN LA TABLA CGROM.
LCD_CODIGOCGROM
           MOVWF LCD_DATO ; GUARDA EL VALOR DEL CARÁCTER Y COMPRUEBA SI ES UN CARÁCTER ESPECIAL.
LCD_ENHEMINUSCULA
           SUBLW 'Ñ' ; ¿ES LA "Ñ"?
           BTFSS STATUS,Z
           GOTO LCD_ENHEMAYUSCULA ; NO ES "Ñ".
           MOVLW B'11101110' ; CÓDIGO CGROM DE LA "Ñ".
           MOVWF LCD_DATO
           GOTO LCD_FINCGROM
LCD_ENHEMAYUSCULA
           MOVF LCD_DATO,W ; RECUPERA EL CÓDIGO ASCII DE ENTRADA.
           SUBLW 'Ñ' ; ¿ES LA "Ñ"?
           BTFSS STATUS,Z
           GOTO LCD_GRADO ; NO ES "Ñ".
           MOVLW B'11101110' ; CÓDIGO CGROM DE LA "Ñ". (NO HAY SÍMBOLO PARA
           MOVWF LCD_DATO ; LA "Ñ" MAYÚSCULA EN LA CGROM).
           GOTO LCD_FINCGROM
LCD_GRADO  MOVF LCD_DATO,W ; RECUPERA EL CÓDIGO ASCII DE ENTRADA.
           SUBLW '°' ; ¿ES EL SÍMBOLO "º"?
           BTFSS STATUS,Z
           GOTO LCD_FINCGROM ; NO ES "º".
           MOVLW B'11011111' ; CÓDIGO CGROM DEL SÍMBOLO "º".
           MOVWF LCD_DATO
LCD_FINCGROM
           MOVF LCD_DATO,W ; EN (W) EL CÓDIGO BUSCADO.
           RETURN
; ************************* 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 ; (LCD_AUXILIAR1) SE UTILIZA COMO CONTADOR.
LCD_ENVIAOTROBLANCO
           MOVLW ' ' ; ESTO ES UN ESPACIO EN BLANCO.
           CALL LCD_CARACTER ; VISUALIZA TANTO ESPACIOS EN BLANCO COMO
           DECFSZ LCD_AUXILIAR1,F ; SE HAYA CARGADO EN (LCD_AUXILIAR1).
           GOTO LCD_ENVIAOTROBLANCO
           RETURN
; **************************** 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' VISUALIZA "AE"
; Y SI (W)=B'00001110', VISUALIZA " E" (UN ESPACIO BLANCO DELANTE).
;;UTILIZAN LA SUBRUTINA "LCD_NIBBLE" QUE SE ANALIZA MÁS ADELANTE.
LCD_BYTE   MOVWF LCD_AUXILIAR2 ; GUARDA EL VALOR DE ENTRADA.
           ANDLW B'11110000' ; ANALIZA SI EL NIBBLE ALTO ES CERO.
           BTFSS STATUS,Z ; SI ES CERO LO APAGA.
           GOTO LCD_VISUALIZAALTO ; NO ES CERO Y LO VISUALIZA.
           MOVLW ' ' ; VISUALIZA UN ESPACIO EN BLANCO.
           CALL LCD_CARACTER
           GOTO LCD_VISUALIZABAJO
LCD_BYTECOMPLETO
           MOVWF LCD_AUXILIAR2 ; GUARDA EL VALOR DE ENTRADA.
LCD_VISUALIZAALTO
           SWAPF LCD_AUXILIAR2,W ; PONE EL NIBBLE ALTO EN LA PARTE BAJA.
           CALL LCD_NIBBLE ; LO VISUALIZA.
LCD_VISUALIZABAJO
           MOVF LCD_AUXILIAR2,W ; REPITE EL PROCESO CON EL NIBBLE BAJO.
           CALL LCD_NIBBLE ; LO VISUALIZA.
           RETURN
; **************************************** 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 REPRESENTARLO CON
           BTFSS STATUS,C ; LETRA.
           GOTO LCD_ENVIABYTELETRA
           MOVF LCD_AUXILIAR1,W
           ADDLW '0' ; EL NÚMERO SE PASA A CARÁCTER ASCII
           GOTO LCD_FINVISUALIZADIGITO; SUMÁNDOLE EL ASCII DEL CERO Y LO VISUALIZA.
LCD_ENVIABYTELETRA
           MOVF LCD_AUXILIAR1,W
           ADDLW 'A'-0X0A ; SÍ, POR TANTO, SE LE SUMA EL ASCII DE LA 'A'.
LCD_FINVISUALIZADIGITO
           GOTO LCD_CARACTER ; Y VISUALIZA EL CARÁCTER. SE HACE CON UN "GOTO"
                             ; PARA NO SOBRECARGAR LA PILA.

libreria que convierte un dato binario a BCD
;******************************************** LIBRERÍA "BIN_BCD.INC" **************************************************
; ===================================================================
;;UN NÚMERO BINARIO NATURAL DE 8 BITS ES CONVERTIDO A BCD. EL RESULTADO SE GUARDA EN TRES
; POSICIONES DE MEMORIAS LLAMADAS: BCD_CENTENAS, BCD_DECENAS Y BCD_UNIDADES.
;;EL PROCEDIMIENTO UTILIZADO ES MEDIANTE RESTAS DE 10, TAL COMO SE EXPLICÓ EN EL CAPÍTULO 9.
;;ENTRADA: EN EL REGISTRO W EL NÚMERO BINARIO NATURAL A CONVERTIR.
; SALIDAS: EN (BCD_CENTENAS), (BCD_DECENAS) Y (BCD_UNIDADES).
; EN EL REGISTRO W TAMBIÉN LAS DECENAS (NIBBLE ALTO) Y UNIDADES (NIBBLE BAJO).

;******************************************** SUBRUTINA "BIN_A_BCD" **************************************************
 CBLOCK ; EN LAS SUBRUTINAS NO SE DEBE FIJAR LA DIRECCIÓN
BCD_CENTENAS ; DE LA RAM DE USUARIO. SE TOMA A CONTINUACIÓN DE
BCD_DECENAS ; LA ÚLTIMA ASIGNADA.
BCD_UNIDADES
 ENDC
BIN_A_BCD   CLRF BCD_CENTENAS ; CARGA LOS REGISTROS CON EL RESULTADO INICIAL.
            CLRF BCD_DECENAS ; EN PRINCIPIO LAS CENTENAS Y DECENAS A CERO.
            MOVWF BCD_UNIDADES ; SE CARGA EL NÚMERO BINARIO A CONVERTIR.
BCD_RESTA10 MOVLW .10 ; A LAS UNIDADES SE LES VA RESTANDO 10 EN CADA
            SUBWF BCD_UNIDADES,W ; PASADA. (W)=(BCD_UNIDADES) -10.
            BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?, ¿(BCD_UNIDADES)>=10?
            GOTO BIN_BCD_FIN ; NO, ES MENOR DE 10. SE ACABÓ.
BCD_INCREMENTADECENAS
            MOVWF BCD_UNIDADES ; RECUPERA LO QUE QUEDA POR RESTAR.
            INCF BCD_DECENAS,F ; INCREMENTA LAS DECENAS Y COMPRUEBA SI HA
            MOVLW .10 ; LLEGADO A 10. LO HACE MEDIANTE UNA RESTA.
            SUBWF BCD_DECENAS,W ; (W)=(BCD_DECENAS)-10).
            BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?,¿(BCD_DECENAS)>=10?
            GOTO BCD_RESTA10 ; NO. VUELVE A DAR OTRA PASADA, RESTÁNDOLE
                             ; 10 A LAS UNIDADES.
BCD_INCREMENTACENTENAS
            CLRF BCD_DECENAS ; PONE A CERO LAS DECENAS
            INCF BCD_CENTENAS,F ; E INCREMENTA LAS CENTENAS.
            GOTO BCD_RESTA10 ; OTRA PASADA: RESTA 10 AL NÚMERO A CONVERTIR.
BIN_BCD_FIN SWAPF BCD_DECENAS,W ; EN EL NIBBLE ALTO DE (W) TAMBIÉN LAS DECENAS.
            ADDWF BCD_UNIDADES,W ; EN EL NIBBLE BAJO DE (W) LAS UNIDADES.
            RETURN ; VUELVE AL PROGRAMA PRINCIPAL.


ahora bien es el turno de las imagenes, esquematico y diagrama de coneccion:
la verdad no se subir archivos aun, asi que tendran que compilar todos y cada uno de los archivos en su compilador (yo use el MPLAB de la Microchip) sin mas por el momento les dejo si veo que me hace falta algo le estare agregando lo faltante poco a poco ya que es mucho lo que incluye este proyecto.

asta pronto...

atte.
Ing. Oscar Ivan Alvarado Aguirre

No hay comentarios:

Publicar un comentario