;------------------------------------------------------------
; Código assembler generado por Niple V6.0.3
; Proyecto: LCD
; Autor: FEDERICO DAMIAN SUMMO (1)
; Fecha: 28/10/2014
; PIC: 16F84
; Velocidad de reloj: 4 Mhz
; Descripcion: 
;------------------------------------------------------------


 LIST    P=PIC16F84


_XT_OSC               equ  0x3FFD
_WDT_OFF              equ  0x3FFB
_PWRTE_ON             equ  0x3FF7
_CP_OFF               equ  0x3FFF

 __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF


;------------------------------------------------------------
;                  Declaración de Registros
;------------------------------------------------------------
w                     equ  0x0000
status                equ  0x0003
porta                 equ  0x0005
portb                 equ  0x0006
pclath                equ  0x000a
intcon                equ  0x000b
_np_banderas2         equ  0x000c
_np_temp1             equ  0x000d
_np_nro_lcd           equ  0x000f
_np_msj_act           equ  0x0010
_np_nro_msj           equ  0x0011
_np_lcd_1             equ  0x0012
_np_tiempo            equ  0x0013
_np_tiempo1           equ  0x0015
_np_tiempo2           equ  0x0016
_np_tiempo3           equ  0x0017
_np_w                 equ  0x001b
conteo                equ  0x001c
_np_status            equ  0x001d
_np_actint_a          equ  0x0025
_np_actint_b          equ  0x0026
_np_t_bak             equ  0x0027
_np_t1_bak            equ  0x0028
_np_t2_bak            equ  0x0029
_np_t3_bak            equ  0x002a
conteo_uni            equ  0x002b
conteo_dec            equ  0x002c
conteo_cen            equ  0x002d
_np_bcd_temp1         equ  0x002e
_np_bcd_temp2         equ  0x002f
_np_bcd_temp3         equ  0x0030
tiempo_lavado         equ  0x0031
tiempo_lavado_uni     equ  0x0032
tiempo_lavado_dec     equ  0x0033
tiempo_lavado_cen     equ  0x0034
_np_tiempo_inte       equ  0x0038
_np_tiempo1_inte      equ  0x003a
_np_tiempo2_inte      equ  0x003b
_np_tiempo3_inte      equ  0x003c
opcion                equ  0x0081
trisa                 equ  0x0085
trisb                 equ  0x0086


;------------------------------------------------------------
;                  Declaración de Bits
;------------------------------------------------------------
c                     equ  0   ;carry / borrow bit
gie                   equ  7   ;habilitador general de interrupciones
inte                  equ  4   ;habilitador de interrupción por rb0
intedg                equ  6   ;interrupt edge select bit
intf                  equ  1   ;rb0 / int interrupt flag bit
ra1                   equ  1   ;bit 1 del puerto a
ra2                   equ  2   ;bit 2 delpuerto a
rp0                   equ  5   ;registrer bank select bit
rp1                   equ  6   ;registrer bank select bit
to                    equ  4   ;time out bit
z                     equ  2   ;bit cero
sub_inte              equ  0   ;bandera de subrrutina cancelada por interrupcion.


;------------------------------------------------------------
;               Declaración de Registros EEPROM
;------------------------------------------------------------


;------------------------------------------------------------
;                        Inicio
;------------------------------------------------------------

   org 0x00
   goto paso2
   org 0x04
   movwf _np_w
   swapf _np_w,1
   movf status,w
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_status
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf _np_tiempo,w
   movwf _np_t_bak
   movf _np_tiempo1,w
   movwf _np_t1_bak
   movf _np_tiempo2,w
   movwf _np_t2_bak
   movf _np_tiempo3,w
   movwf _np_t3_bak
   btfsc intcon,intf
   goto inte_rb0
salir__intes
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf _np_banderas2,sub_inte       ;activar la bandera de rutina cancelada por interrupcion
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf _np_t_bak,w
   movwf _np_tiempo
   movf _np_t1_bak,w
   movwf _np_tiempo1
   movf _np_t2_bak,w
   movwf _np_tiempo2
   movf _np_t3_bak,w
   movwf _np_tiempo3
   movf _np_status,w 
   movwf status
   swapf _np_w,w 
   retfie


   ;------------------------------------------------------------
   ;                      inicio de la interrupción por rb0
   ;------------------------------------------------------------
inte_rb0_salir
   bcf intcon,intf
   goto salir__intes
inte_rb0

   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf conteo,w                    ;conteo inicial esta en cero?
   xorlw d'00'
   btfss status,z
   goto inte_rb04
   goto inte_rb0_salir
inte_rb04
   movf conteo,0
   movwf tiempo_lavado
   movlw .5                         ;temporizador 5 seg
   call tmp_1_mgc_i                 ;llamada a rutina tmp_1_mgc_i
   call rutusr_008                  ;llamada a rutina usr_comenzar_lavado
   movlw .2                         ;temporizador 2 seg
   call tmp_1_mgc_i                 ;llamada a rutina tmp_1_mgc_i
   call rutusr_010                  ;llamada a rutina usr_lcd_fin_del_lavado
   movlw .10                        ;temporizador 10 seg
   call tmp_1_mgc_i                 ;llamada a rutina tmp_1_mgc_i
inte_rb011
   goto inte_rb0_salir
   goto inte_rb04                   ;cierra el ciclo

;------------------------------------------------------------
;                      programa principal
;------------------------------------------------------------
paso2
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf _np_banderas2
   clrf _np_temp1
   clrf _np_nro_lcd
   clrf _np_msj_act
   clrf _np_nro_msj
   clrf _np_lcd_1
   clrf _np_tiempo
   clrf _np_tiempo1
   clrf _np_tiempo2
   clrf _np_tiempo3
   clrf _np_w
   clrf conteo
   clrf _np_status
   clrf _np_actint_a
   clrf _np_actint_b
   clrf _np_t_bak
   clrf _np_t1_bak
   clrf _np_t2_bak
   clrf _np_t3_bak
   clrf conteo_uni
   clrf conteo_dec
   clrf conteo_cen
   clrf _np_bcd_temp1
   clrf _np_bcd_temp2
   clrf _np_bcd_temp3
   clrf tiempo_lavado
   clrf tiempo_lavado_uni
   clrf tiempo_lavado_dec
   clrf tiempo_lavado_cen
   clrf _np_tiempo_inte
   clrf _np_tiempo1_inte
   clrf _np_tiempo2_inte
   clrf _np_tiempo3_inte
inicio
   clrf porta
   movlw b'00010111'                ;configurar el puerto a como xxxeseee
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisa
   bcf status,rp0                   ;cambiar a banco 0
   clrf portb
   movlw b'00000001'                ;configurar el puerto b como ssssssse
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisb
   movlw b'00000001'
   bcf status,rp0                   ;cambiar a banco 0
   movwf _np_nro_lcd
   call lcd_inicio                  ;llamada a rutina lcd_inicio
   call rutusr_004                  ;llamada a rutina usr_lcd_inicio_en_cero
   movlw .3                         ;temporizador 3 seg
   call tmp_1_mgc                   ;llamada a rutina tmp_1_mgc
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw b'00000001'
   call lcd_comando                 ;llamada a rutina lcd_comando
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf _np_lcd_1
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie

   movlw d'00'                      ;carga variabe de inicio en w
   movwf conteo                     ;carga w=00 en conteo
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw b'00000001'
   movwf _np_nro_lcd
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie

   call rutusr_005                  ;llamada a rutina usr_lcd_muestro_inicio_cero
paso13
   call rutusr_003                  ;llamada a rutina usr_control_pulsadores
   call rutusr_007                  ;llamada a rutina usr_controlde_topes
   ;convertir un registro a bcd
paso15_inte
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf conteo,w
   movwf _np_bcd_temp1
   call conv_8_bcd                  ;llamada a rutina conv_8_bcd
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf _np_bcd_temp1,w
   movwf conteo_uni
   movf _np_bcd_temp2,w
   movwf conteo_dec
   movf _np_bcd_temp3,w
   movwf conteo_cen
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw b'00000001'
   movwf _np_nro_lcd
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie

   call rutusr_006                  ;llamada a rutina usr_lcd_conteo_actual
   bsf status,rp0                   ;cambiar a banco 1
   bcf status,rp1
   bsf opcion,intedg                ;interrupción rb0. flanco_asc.

   bcf intcon,intf                  ;limpiar la bandera antes de activarla
   bsf intcon,inte                  ;activar interrupción por int.
   bsf intcon,gie                   ;activar habilitador general de interrupciones.
   goto paso13                      ;cierra el ciclo


;------------------------------------------------------------
;                  Declaración de Subrutinas
;------------------------------------------------------------

; usr_comenzar_lavado
rutusr_008
rutusr_008_2
rutina_de_lavado
   ;escribir en el puerto a
   movlw b'00001000'
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf porta
   movlw .27                        ;temporizador 27 seg
   call tmp_1_mgc                   ;llamada a rutina tmp_1_mgc
   ;escribir en el puerto a
   movlw b'00000000'
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf porta
   movlw .6                         ;temporizador 6 seg
   call tmp_1_mgc                   ;llamada a rutina tmp_1_mgc
   ;escribir en el puerto b
   movlw b'10000000'
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf portb
   movlw .27                        ;temporizador 27 seg
   call tmp_1_mgc                   ;llamada a rutina tmp_1_mgc
   ;escribir en el puerto b
   movlw b'00000000'
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf portb
   movlw .6                         ;temporizador 6 seg
   call tmp_1_mgc                   ;llamada a rutina tmp_1_mgc
rutusr_008_11_inte
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   decf tiempo_lavado,1             ;se resta 1 minuto
   movlw b'00000001'
   movwf _np_nro_lcd
   call lcd_inicio                  ;llamada a rutina lcd_inicio
   ;convertir un registro a bcd
rutusr_008_13_inte
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf tiempo_lavado,w
   movwf _np_bcd_temp1
   call conv_8_bcd                  ;llamada a rutina conv_8_bcd
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf _np_bcd_temp1,w
   movwf tiempo_lavado_uni
   movf _np_bcd_temp2,w
   movwf tiempo_lavado_dec
   movf _np_bcd_temp3,w
   movwf tiempo_lavado_cen
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw b'00000001'
   movwf _np_nro_lcd
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie

   call rutusr_009                  ;llamada a rutina usr_lcd_tiempo_restante

   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf tiempo_lavado,w             ;tiempo de lavado llego a cero?
   xorlw d'0'
   btfss status,z
   goto rutusr_008_2
   goto rutusr_008_salir
rutusr_008_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


; usr_lcd_fin_del_lavado
rutusr_010
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw .6
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_nro_msj
   call lcd_mensaje_actual          ;llamada a rutina lcd_mensaje_actual
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss _np_msj_act,0
   goto rutusr_010_2_nc
   movlw b'00001100'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw b'00000001'
   call lcd_comando                 ;llamada a rutina lcd_comando
rutusr_010_2_nc
   movlw b'10000000'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .76                        ;l
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .97                        ;a
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .118                       ;v
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .97                        ;a
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .100                       ;d
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .111                       ;o
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw b'10000111'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .116                       ;t
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .101                       ;e
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .114                       ;r
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .109                       ;m
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .105                       ;i
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .110                       ;n
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .97                        ;a
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .100                       ;d
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .111                       ;o
   call lcd_caracter                ;llamada a rutina lcd_caracter
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie
rutusr_010_3
   goto rutusr_010_salir
rutusr_010_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


; usr_lcd_inicio_en_cero
rutusr_004
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw .2
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_nro_msj
   call lcd_mensaje_actual          ;llamada a rutina lcd_mensaje_actual
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss _np_msj_act,0
   goto rutusr_004_2_nc
   movlw b'00001100'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw b'00000001'
   call lcd_comando                 ;llamada a rutina lcd_comando
rutusr_004_2_nc
   movlw b'10000001'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .83                        ;s
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .101                       ;e
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .108                       ;l
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .101                       ;e
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .99                        ;c
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .99                        ;c
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .105                       ;i
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .111                       ;o
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .110                       ;n
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .101                       ;e
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw b'10001100'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .101                       ;e
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .108                       ;l
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw b'11000000'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .116                       ;t
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .105                       ;i
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .101                       ;e
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .109                       ;m
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .112                       ;p
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .111                       ;o
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw b'11000111'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .100                       ;d
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .101                       ;e
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw b'11001010'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .108                       ;l
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .97                        ;a
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .118                       ;v
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .97                        ;a
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .100                       ;d
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .111                       ;o
   call lcd_caracter                ;llamada a rutina lcd_caracter
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie
rutusr_004_3
   goto rutusr_004_salir
rutusr_004_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


; usr_lcd_muestro_inicio_cero
rutusr_005
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw .3
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_nro_msj
   call lcd_mensaje_actual          ;llamada a rutina lcd_mensaje_actual
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss _np_msj_act,0
   goto rutusr_005_2_nc
   movlw b'00001100'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw b'00000001'
   call lcd_comando                 ;llamada a rutina lcd_comando
rutusr_005_2_nc
   movlw b'10001001'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .109                       ;m
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .105                       ;i
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .110                       ;n
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .117                       ;u
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .116                       ;t
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .111                       ;o
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .115                       ;s
   call lcd_caracter                ;llamada a rutina lcd_caracter
rutusr_005_2_var
   movlw b'10000111'
   call lcd_comando                 ;llamada a rutina lcd_comando
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf conteo,w                    ;enviar la variable conteo al lcd.
   addlw .48
   call lcd_caracter                ;llamada a rutina lcd_caracter
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie
rutusr_005_3
   goto rutusr_005_salir
rutusr_005_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


; usr_control_pulsadores
rutusr_003
rutusr_003_2
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss porta,ra1                  ;si el -bit, ra1 = 10
   goto rutusr_003_7
   btfsc porta,ra1                  ;si el -bit, ra1 = 01
   goto rutusr_003_2
   movlw .5                         ;temporizador 50 ms
   call tmp_100_mc                  ;llamada a rutina tmp_100_mc
rutusr_003_5_inte
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf _np_banderas2,sub_inte
   movlw d'5'                       ;suma_8, sumando_1=conteo, sumando_2=d'5', res_l=conteo, acarreo=no, 
   addwf conteo,1
   btfsc _np_banderas2,sub_inte     ;si la subrutina fue cancelada por una interrupcion
   goto rutusr_003_5_inte           ;ejecutar el calculo nuevamente
rutusr_003_6
   goto rutusr_003_salir
rutusr_003_7

   movf conteo,w                    ;si reg(08), conteo  = d'00', 
   xorlw d'00'
   btfsc status,z
   goto rutusr_003_2
   goto rutusr_003_8
rutusr_003_8
   btfsc porta,ra2                  ;si el -bit, ra2 = 01
   goto rutusr_003_2
   btfss porta,ra2                  ;si el -bit, ra2 = 10
   goto rutusr_003_8
   movlw .5                         ;temporizador 50 ms
   call tmp_100_mc                  ;llamada a rutina tmp_100_mc
rutusr_003_11_inte
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf _np_banderas2,sub_inte
   movlw d'5'                       ;resta_8, minuendo=conteo, sustraendo=d'5', resultado=conteo, 
   subwf conteo,1
   btfsc _np_banderas2,sub_inte     ;si la subrutina fue cancelada por una interrupcion
   goto rutusr_003_11_inte          ;ejecutar el calculo
rutusr_003_12
   goto rutusr_003_salir
rutusr_003_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


; usr_controlde_topes
rutusr_007

   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf conteo,w                    ;se pasaron los 60 minutos?
   xorlw d'65'
   btfss status,z
   goto rutusr_007_6
   movlw d'00'                      ;se carga 00 en w
   movwf conteo                     ;conteo vuelve a 00
rutusr_007_5
   goto rutusr_007_salir
rutusr_007_6

   movf conteo,w                    ;se disminuye por debajo de cero?
   sublw d'0'
   btfss status,c
   goto rutusr_007_salir
   movlw d'60'
   movwf conteo                     ;se pasa de 0 a 60
   goto rutusr_007_salir
rutusr_007_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


; usr_lcd_conteo_actual
rutusr_006
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw .4
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_nro_msj
   call lcd_mensaje_actual          ;llamada a rutina lcd_mensaje_actual
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss _np_msj_act,0
   goto rutusr_006_2_nc
   movlw b'00001100'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw b'00000001'
   call lcd_comando                 ;llamada a rutina lcd_comando
rutusr_006_2_nc
   movlw b'10001010'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .109                       ;m
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .105                       ;i
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .110                       ;n
   call lcd_caracter                ;llamada a rutina lcd_caracter
rutusr_006_2_var
   movlw b'10000111'
   call lcd_comando                 ;llamada a rutina lcd_comando
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf conteo_dec,w                ;enviar la variable conteo_dec al lcd.
   addlw .48
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw b'10001000'
   call lcd_comando                 ;llamada a rutina lcd_comando
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf conteo_uni,w                ;enviar la variable conteo_uni al lcd.
   addlw .48
   call lcd_caracter                ;llamada a rutina lcd_caracter
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie
rutusr_006_3
   goto rutusr_006_salir
rutusr_006_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


; usr_lcd_tiempo_restante
rutusr_009
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw .5
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_nro_msj
   call lcd_mensaje_actual          ;llamada a rutina lcd_mensaje_actual
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss _np_msj_act,0
   goto rutusr_009_2_nc
   movlw b'00001100'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw b'00000001'
   call lcd_comando                 ;llamada a rutina lcd_comando
rutusr_009_2_nc
   movlw b'10001001'
   call lcd_comando                 ;llamada a rutina lcd_comando
   movlw .109                       ;m
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .105                       ;i
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .110                       ;n
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .117                       ;u
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .116                       ;t
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .111                       ;o
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw .115                       ;s
   call lcd_caracter                ;llamada a rutina lcd_caracter
rutusr_009_2_var
   movlw b'10000110'
   call lcd_comando                 ;llamada a rutina lcd_comando
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf tiempo_lavado_dec,w         ;enviar la variable tiempo_lavado_dec al lcd.
   addlw .48
   call lcd_caracter                ;llamada a rutina lcd_caracter
   movlw b'10000111'
   call lcd_comando                 ;llamada a rutina lcd_comando
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf tiempo_lavado_uni,w         ;enviar la variable tiempo_lavado_uni al lcd.
   addlw .48
   call lcd_caracter                ;llamada a rutina lcd_caracter
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie
rutusr_009_3
   goto rutusr_009_salir
rutusr_009_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


tmp_1_mgc_i
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_tiempo_inte
   goto tmp_1_mgc_i_1
tmp_1_mgc_i_bucle2
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tmp_1_mgc_i_1
   movlw .10
   movwf _np_tiempo1_inte
tmp_1_mgc_i_bucle1
   nop
   nop
   movlw .99
   movwf _np_tiempo2_inte
tmp_1_mgc_i_bucle0
   nop
   nop
   nop
   movlw .200
   movwf _np_tiempo3_inte
tmp_1_mgc_i_bucle
   nop
   nop
   decfsz _np_tiempo3_inte,1
   goto tmp_1_mgc_i_bucle
   nop
   nop
   nop
   decfsz _np_tiempo2_inte,1
   goto tmp_1_mgc_i_bucle0
   nop
   nop
   nop
   decfsz _np_tiempo1_inte,1
   goto tmp_1_mgc_i_bucle1
   decfsz _np_tiempo_inte,1
   goto tmp_1_mgc_i_bucle2
   return


lcd_inicio
   movlw b'00000001'
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_nro_lcd
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf _np_nro_msj
   movlw .2                         ;temporizador 20 ms
   call tmp_100_mc                  ;llamada a rutina tmp_100_mc
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie
   movlw b'00110000'
   call lcd_comando_ini             ;llamada a rutina lcd_comando_ini
   movlw .2                         ;temporizador 20 ms
   call tmp_100_mc                  ;llamada a rutina tmp_100_mc
   movlw b'00110000'
   call lcd_comando_ini             ;llamada a rutina lcd_comando_ini
   movlw .1                         ;temporizador 1 ms
   call tmp_1_mc                    ;llamada a rutina tmp_1_mc
   movlw b'00110000'
   call lcd_comando_ini             ;llamada a rutina lcd_comando_ini
   movlw b'00100000'
   call lcd_comando_ini             ;llamada a rutina lcd_comando_ini
   movlw b'00100000'
   call lcd_comando_ini             ;llamada a rutina lcd_comando_ini
   movlw b'10000000'
   call lcd_comando_ini             ;llamada a rutina lcd_comando_ini
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie
   return
lcd_busy
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   rrf _np_actint_a,1
   rrf _np_actint_b,1
   btfsc status,c
   bsf intcon,gie
   movlw .2                         ;temporizador 2 ms
   call tmp_1_mc                    ;llamada a rutina tmp_1_mc
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf status,c
   btfsc intcon,gie
   bsf status,c
   rlf _np_actint_b,1
   rlf _np_actint_a,1
   bcf intcon,gie

   return
lcd_comando_ini
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_temp1
   bcf portb,6
   goto lcd_enviar_ini
lcd_comando
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_temp1
   bcf portb,6
   goto lcd_enviar
lcd_caracter
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_temp1
   bsf portb,6
lcd_enviar
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,5
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_temp1
   bcf portb,4
   bcf portb,3
   bcf portb,2
   bcf portb,1
   btfsc _np_temp1,4
   bsf portb,4
   btfsc _np_temp1,5
   bsf portb,3
   btfsc _np_temp1,6
   bsf portb,2
   btfsc _np_temp1,7
   bsf portb,1
   bcf portb,5
   nop
   nop
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,5
   bcf portb,4
   bcf portb,3
   bcf portb,2
   bcf portb,1
   btfsc _np_temp1,0
   bsf portb,4
   btfsc _np_temp1,1
   bsf portb,3
   btfsc _np_temp1,2
   bsf portb,2
   btfsc _np_temp1,3
   bsf portb,1
   bcf portb,5
   nop
   nop
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,5
   call lcd_busy                    ;llamada a rutina lcd_busy
   return
lcd_enviar_ini
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,5
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_temp1
   bcf portb,4
   bcf portb,3
   bcf portb,2
   bcf portb,1
   btfsc _np_temp1,4
   bsf portb,4
   btfsc _np_temp1,5
   bsf portb,3
   btfsc _np_temp1,6
   bsf portb,2
   btfsc _np_temp1,7
   bsf portb,1
   bcf portb,5
   nop
   nop
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,5
   call lcd_busy                    ;llamada a rutina lcd_busy
   return
lcd_mensaje_actual
lcd_1
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf _np_msj_act
   movf _np_nro_msj,w
   xorwf _np_lcd_1,w
   btfss status,z
   bsf _np_msj_act,0
   movf _np_nro_msj,w
   movwf _np_lcd_1
   return

tmp_1_mgc
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_tiempo
   goto tmp_1_mgc_1
tmp_1_mgc_bucle2
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tmp_1_mgc_1
   movlw .10
   movwf _np_tiempo1
tmp_1_mgc_bucle1
   nop
   nop
   movlw .99
   movwf _np_tiempo2
tmp_1_mgc_bucle0
   nop
   nop
   nop
   movlw .200
   movwf _np_tiempo3
tmp_1_mgc_bucle
   nop
   nop
   decfsz _np_tiempo3,1
   goto tmp_1_mgc_bucle
   nop
   nop
   nop
   decfsz _np_tiempo2,1
   goto tmp_1_mgc_bucle0
   nop
   nop
   nop
   decfsz _np_tiempo1,1
   goto tmp_1_mgc_bucle1
   decfsz _np_tiempo,1
   goto tmp_1_mgc_bucle2
   return


conv_8_bcd
   ;convertir un registro a formato bcd (u, d y c)
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf _np_banderas2,sub_inte       ;limpiar la bandera de rutina cancelada por interrupcion
   clrf _np_bcd_temp3
   clrf _np_bcd_temp2
   movlw .100
conv_8_bcd_otro
   subwf _np_bcd_temp1,1
   btfss status,c
   goto conv_8_bcd_suma
   incf _np_bcd_temp3,1
   goto conv_8_bcd_otro
conv_8_bcd_suma
   addwf _np_bcd_temp1,1
   movlw .10
conv_8_bcd_bucle
   subwf _np_bcd_temp1,1
   btfss status,c
   goto conv_8_bcd_salir
   incf _np_bcd_temp2,1
   goto conv_8_bcd_bucle
conv_8_bcd_salir
   addwf _np_bcd_temp1,1
   return

tmp_100_mc
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_tiempo
   goto tmp_100_mc_1
tmp_100_mc_bucle2
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tmp_100_mc_1
   movlw .22
   movwf _np_tiempo1
tmp_100_mc_bucle1
   movlw .150
   movwf _np_tiempo2
tmp_100_mc_bucle
   decfsz _np_tiempo2,1
   goto tmp_100_mc_bucle
   decfsz _np_tiempo1,1
   goto tmp_100_mc_bucle1
   nop
   decfsz _np_tiempo,1
   goto tmp_100_mc_bucle2
   return


tmp_1_mc
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_tiempo
   goto tmp_1_mc_1
tmp_1_mc_bucle1
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tmp_1_mc_1
   movlw .246
   movwf _np_tiempo1
tmp_1_mc_bucle2
   nop
   decfsz _np_tiempo1,1
   goto tmp_1_mc_bucle2
   nop
   nop
   nop
   nop
   nop
   decfsz _np_tiempo,1
   goto tmp_1_mc_bucle1
   return



;------------------------------------------------------------
;                  DATOS EN MEMORIA EEPROM
;------------------------------------------------------------
   org  0x2100
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff

 End