;------------------------------------------------------------
; Código assembler generado por Niple V5.2.0
; Proyecto: Proyecto 1
; Autor: 
; Fecha: 01/07/2014
; PIC: 16F84A
; Velocidad de reloj: 4 Mhz
; Descripcion: 
;------------------------------------------------------------


 LIST    P=PIC16F84A


_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
conteo_actual         equ  0x000d
unidades              equ  0x000e
decenas               equ  0x000f
_np_temp1             equ  0x0010
_np_temp2             equ  0x0011
_np_temp3             equ  0x0012
_np_tiempo            equ  0x0013
_np_disp_ciclos_1     equ  0x0015
_np_disp_ciclos_2     equ  0x0016
_np_disp_valor        equ  0x0017
ciclos                equ  0x0018
ciclos1               equ  0x0019
trisa                 equ  0x0085
trisb                 equ  0x0086


;------------------------------------------------------------
;                  Declaración de Bits
;------------------------------------------------------------
c                     equ  0   ;carry / borrow bit
rp0                   equ  5   ;registrer bank select bit
rp1                   equ  6   ;registrer bank select bit
z                     equ  2   ;bit cero
pdor_asc              equ  1   ;bit 1 del puerto a


;------------------------------------------------------------
;                        Inicio
;------------------------------------------------------------

reset   org 0
   goto paso2


;------------------------------------------------------------
;                      programa principal
;------------------------------------------------------------
paso2
   movlw b'00000111'                ;configurar el puerto a como xxxsseee
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisa
   movlw b'00000000'                ;configurar el puerto b como ssssssss
   movwf trisb
   movlw d'00'                      ;iniciamos siempre en cero
   bcf status,rp0                   ;cambiar a banco 0
   movwf conteo_actual
paso5
   ;convertir un registro a bcd
   movf conteo_actual,w
   movwf _np_temp1
   call conv_8_bcd
   movf _np_temp1,w
   movwf unidades
   movf _np_temp2,w
   movwf decenas
   movlw d'00'                      ;arranca en cero
   movwf ciclos
paso7

   incf ciclos,1                    ;ciclos = ciclos + 1
   movf ciclos,w                    ;si el reg ciclos = d'250'
   xorlw d'250'
   btfss status,z
   goto paso12
paso9
   btfss porta,pdor_asc             ;si el bit pdor_asc = 0
   goto paso11

   movlw d'05'                      ;sumar a 8 bits (conteo_actual, = conteo_actual + d'05')
   addwf conteo_actual,1
   goto paso5                       ;cierra el ciclo
paso11
   ;visualizar datos en displays cátodo común (4511)
   clrf _np_disp_ciclos_1           ;limpiar el contador de repeticiones
   clrf _np_disp_ciclos_2
   bcf portb,1                      ;apagar display para evitar error de visualizacion
   bcf portb,2                      ;apagar display para evitar error de visualizacion
paso11_mostrar
   call disp2_c_b3b4b5b6
   movf unidades,w                  ;mostrar el valor del registro unidades
   movwf _np_disp_valor
   call disp3_c_b3b4b5b6
   bsf portb,1                      ;encender el display 1
   movlw .2                         ;temporizador 20 use
   call tiempo_10_1000_uc
   bcf portb,1                      ;apagar el display 1
   call disp2_c_b3b4b5b6
   movf decenas,w                   ;mostrar el valor del registro decenas
   movwf _np_disp_valor
   call disp3_c_b3b4b5b6
   bsf portb,2                      ;encender el display 2
   movlw .2                         ;temporizador 20 use
   call tiempo_10_1000_uc
   bcf portb,2                      ;apagar el display 2
   incf _np_disp_ciclos_2,1
   btfsc status,z
   incf _np_disp_ciclos_1,1
   movlw b'00000011'
   subwf _np_disp_ciclos_1,w
   btfss status,c
   goto paso11_mostrar
   movlw b'11101000'
   subwf _np_disp_ciclos_2,w
   btfss status,c
   goto paso11_mostrar
   goto paso9                       ;cierra el ciclo
paso12
   movlw d'0'
   movwf ciclos1
paso13

   incf ciclos1,1                   ;ciclos1 = ciclos1 + 1
   movf ciclos1,w                   ;si el reg ciclos1 = d'3'
   xorlw d'3'
   btfsc status,z
   goto paso7                       ;cierra el ciclo
   goto paso15
paso15
   ;visualizar datos en displays cátodo común (4511)
   clrf _np_disp_ciclos_1           ;limpiar el contador de repeticiones
   clrf _np_disp_ciclos_2
   bcf portb,1                      ;apagar display para evitar error de visualizacion
   bcf portb,2                      ;apagar display para evitar error de visualizacion
paso15_mostrar
   call disp2_c_b3b4b5b6
   movf unidades,w                  ;mostrar el valor del registro unidades
   movwf _np_disp_valor
   call disp3_c_b3b4b5b6
   bsf portb,1                      ;encender el display 1
   movlw .2                         ;temporizador 20 use
   call tiempo_10_1000_uc
   bcf portb,1                      ;apagar el display 1
   call disp2_c_b3b4b5b6
   movf decenas,w                   ;mostrar el valor del registro decenas
   movwf _np_disp_valor
   call disp3_c_b3b4b5b6
   bsf portb,2                      ;encender el display 2
   movlw .2                         ;temporizador 20 use
   call tiempo_10_1000_uc
   bcf portb,2                      ;apagar el display 2
   incf _np_disp_ciclos_2,1
   btfsc status,z
   incf _np_disp_ciclos_1,1
   movlw b'00000011'
   subwf _np_disp_ciclos_1,w
   btfss status,c
   goto paso15_mostrar
   movlw b'11101000'
   subwf _np_disp_ciclos_2,w
   btfss status,c
   goto paso15_mostrar
   goto paso13                      ;cierra el ciclo


;------------------------------------------------------------
;                  Declaración de Subrutinas
;------------------------------------------------------------

conv_8_bcd
   ;convertir un registro a formato bcd (u, d y c)
   bcf status,rp0                   ;cambiar a banco 0
   clrf _np_temp3
   clrf _np_temp2
   movlw .100
conv_8_bcd_otro
   subwf _np_temp1,1
   btfss status,c
   goto conv_8_bcd_suma
   incf _np_temp3,1
   goto conv_8_bcd_otro
conv_8_bcd_suma
   addwf _np_temp1,1
   movlw .10
conv_8_bcd_bucle
   subwf _np_temp1,1
   btfss status,c
   goto conv_8_bcd_salir
   incf _np_temp2,1
   goto conv_8_bcd_bucle
conv_8_bcd_salir
   addwf _np_temp1,1
   return

disp2_c_b3b4b5b6
   ;visualizar datos en displays cátodo común
   bcf portb,3                      ;limpiar el bus de datos
   bcf portb,4
   bcf portb,5
   bcf portb,6
   return

disp3_c_b3b4b5b6
   ;visualizar datos en displays cátodo común
   btfsc _np_disp_valor,0           ;asignar el nuevo valor al bus de datos
   bsf portb,3
   btfsc _np_disp_valor,1
   bsf portb,4
   btfsc _np_disp_valor,2
   bsf portb,5
   btfsc _np_disp_valor,3
   bsf portb,6
   return

tiempo_10_1000_uc
   movwf _np_tiempo
   goto tiempo_10_1000_uc_10
tiempo_10_1000_uc_bucle
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tiempo_10_1000_uc_10
   decfsz _np_tiempo,1
   goto tiempo_10_1000_uc_bucle
   return


 End