 

Main     clrwdt;--------------------------------------------
         CALL     Leer_DHT
         CALL     Checkear_datos
         ANDLW    0xFF
         BTFSS    3,2
         GOTO     Mal_dato        
         call     VERSUP     ;Coloca en el LCD la temp. superior (de desactivación)
         call     higsup     ;Coloca en el LCD la hume. superior (de activación)
         goto     CICLO
Mal_dato
         GOTO    Main
Leer_DHT
         CLRF     TempEntero
         CLRF     TempDecimal
         CLRF     HumEntero
         CLRF     HumDecimal
         CLRF     Checksum
         MOVLW    .40
         MOVWF    CantidadBits
         clrwdt;--------------------------------------------
         BSF       3,5
         movlw     b'000000'          ; Salida
         movwf     0x05
         BCF       3,5
         BCF       0x05,0      ; Pongo un 0 en caso que no lo hubiera tenido
         call      ms1;        aqui cambio a 1ms    ms18        ; Espero los 18ms necesarios
         BSF       0x05,0
         BSF       3,5
         movlw     b'000001'
         movwf     0x05     
         BCF       3,5
         clrwdt;--------------------------------------------
         BTFSC   0x05,0      ; Espero que llegue el 0, desde el DHT11
         GOTO    $-2
         clrwdt;--------------------------------------------
         BTFSS   0x05,0      ; Estoy en 0, Espero que se ponga en 1 el DHT11
         GOTO    $-2
 
Loop     clrwdt;--------------------------------------------
         BTFSC   0x05,0        ; Espero que llegue el 0
         GOTO    $-2
         clrwdt;--------------------------------------------
         BTFSS   0x05,0        ; Estoy en 0, Espero que se ponga en 1
         GOTO    $-2
         CALL    Delay_35us    ; Luego del delay pasan como maximo 17 ciclos hasta que vuelve a preguntar de nuevo, lo cual estaria dentro del rango de las 20 instrucciones para 4Mhz
         BTFSS   0x05,0
         GOTO    Es_cero
Es_uno
         BSF     Checksum, 0     ; Observa que no uso INCF, sino que directamente pongo a 1 o 0 el bit
         GOTO    Rotar
Es_cero  clrwdt;--------------------------------------------
         BCF     Checksum, 0
Rotar    clrwdt;--------------------------------------------
         DECF    CantidadBits,1 ; Decremento la cantidad de bits restantes, cuando llega a 0 salgo, sino roto el valor, al rotar lo trato como un numero completo de 40 bits
         BTFSC   3,2
         RETURN
         RLF     Checksum,1     ; Cuando roto por primera vez (en Checksum) el carry puede tener cualquier valor
         RLF     TempDecimal,1  ; pero no importa por que en la proxima pasada sobreescribo ese bit con BSF y BCF, los demas carrys son necesarios
         RLF     TempEntero,1
         RLF     HumDecimal,1
         RLF     HumEntero,1
         GOTO    Loop
 
Checkear_datos
         MOVF    HumEntero, W
         ADDWF   HumDecimal, W
         ADDWF   TempEntero, W
         ADDWF   TempDecimal, W
         XORWF   Checksum, W
         BTFSC   3,2
         RETURN            
Mal_Checksum
         CLRF    TempEntero
         CLRF    TempDecimal
         CLRF    HumEntero
         CLRF    HumDecimal
         CLRF    Checksum
         RETURN
;--------------------------------------------------------------------
Delay_1s
         movlw    .250
         movwf    reg6
qqq      movlw    .211
         movwf    reg2
ttt      movlw    .5
         movwf    reg3             ;segundero
ddd      decfsz   reg3,1
         goto     ddd
         clrwdt;--------------------------------------------
         decfsz   reg2,1
         goto     ttt
         decfsz   reg6,1
         goto     qqq
         return
;-------------------------------------------------------------------                  
Delay_35us
         movlw   0x0A
         movwf   d1
Delay_35us_0  clrwdt;--------------------------------------------
         decfsz  d1, f
         goto    Delay_35us_0
         return
;--------------------------------------------------------------------       
ms18     movlw    0x0f
         movwf    d1
         movlw    0x0f
         movwf    d2
l6       clrwdt;------------------     ;retardo de 18ms
         decfsz   d1,1
         goto     $+2
         decfsz   d2,1
         goto     l6
         goto     $+1
         return   
;-----------------------------------------------------------
ms1     movlw     .248      
        movwf     PDel0    
PLoop0  clrwdt              
        decfsz    PDel0, 1  
        goto      PLoop0    ;retardo 1 ms
PDelL1  goto PDelL2      
PDelL2  clrwdt           
        return             
;----------------------
