;------------------------------------------------------------
; Código assembler generado por Niple V6.1.5
; Proyecto: tablero gol en contra
; Autor: CRISTIAN SAN FELIPE 
; Fecha: 25/10/2015
; PIC: 16F628A
; Velocidad de reloj: Int 4 Mhz
; Descripcion: 
;------------------------------------------------------------


 LIST    P=PIC16F628A


_INCRC_OSC_NOCLKOUT   equ  0x3FFC
_WDT_OFF              equ  0x3FFB
_PWRTE_ON             equ  0x3FF7
_MCLRE_OFF            equ  0x3FDF
_BODEN_OFF            equ  0x3FBF
_LVP_OFF              equ  0x3F7F
_CPD_OFF              equ  0x3F7F
_CP_OFF               equ  0x3FFF

 __config _INCRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF


;------------------------------------------------------------
;                  Declaración de Registros
;------------------------------------------------------------
w                     equ  0x0000
tmr0                  equ  0x0001
status                equ  0x0003
porta                 equ  0x0005
portb                 equ  0x0006
pclath                equ  0x000a
intcon                equ  0x000b
pir1                  equ  0x000c
tmr1l                 equ  0x000e
tmr1h                 equ  0x000f
t1con                 equ  0x0010
cmcon                 equ  0x001f
_np_banderas2         equ  0x0020
plocal                equ  0x0021
plocal_uni            equ  0x0022
plocal_dec            equ  0x0023
plocal_cen            equ  0x0024
visitante             equ  0x0025
visitante_uni         equ  0x0026
visitante_dec         equ  0x0027
_np_t1h_ini           equ  0x0028
_np_t1l_ini           equ  0x0029
_np_t1_cint_l         equ  0x002a
_np_t1_cint_h         equ  0x002b
_np_tiempo            equ  0x002c
_np_tiempo1           equ  0x002d
_np_tiempo2           equ  0x002e
_np_tiempo3           equ  0x002f
_np_t1_cint1_l        equ  0x0030
_np_t1_cint1_h        equ  0x0031
visitante_cen         equ  0x0032
_np_bcd_temp1         equ  0x0034
_np_bcd_temp2         equ  0x0035
_np_timers            equ  0x0036
_np_t0_ini            equ  0x0037
_np_t0_cint_l         equ  0x0038
_np_t0_cint_h         equ  0x0039
_np_t0_cint1_l        equ  0x003a
_np_t0_cint1_h        equ  0x003b
_np_w                 equ  0x003c
_np_status            equ  0x003d
_np_bcd_temp3         equ  0x003e
_np_temp1             equ  0x003f
_np_temp1_int         equ  0x0040
_np_t_bak             equ  0x0041
_np_t1_bak            equ  0x0042
_np_t2_bak            equ  0x0043
_np_t3_bak            equ  0x0044
_np_disp_valor        equ  0x004b
_np_disp_nro          equ  0x004c
horas_uni             equ  0x004d
horas_dec             equ  0x004e
horas                 equ  0x004f
horas_cen             equ  0x0050
minutos_uni           equ  0x0051
minutos_dec           equ  0x0052
minutos_cen           equ  0x0053
minutos               equ  0x0054
opcion                equ  0x0081
trisa                 equ  0x0085
trisb                 equ  0x0086
pie1                  equ  0x008c


;------------------------------------------------------------
;                  Declaración de Bits
;------------------------------------------------------------
c                     equ  0   ;-
gie                   equ  7   ;-
intedg                equ  6   ;-
peie                  equ  6   ;-
ps0                   equ  0   ;-
ps1                   equ  1   ;-
ps2                   equ  2   ;-
psa                   equ  3   ;-
ra0                   equ  0   ;-
ra1                   equ  1   ;-
ra6                   equ  6   ;-
ra7                   equ  7   ;-
rb0                   equ  0   ;-
rb1                   equ  1   ;-
rb2                   equ  2   ;-
rb3                   equ  3   ;-
rb4                   equ  4   ;-
rb5                   equ  5   ;-
rb6                   equ  6   ;-
rb7                   equ  7   ;-
rp0                   equ  5   ;-
rp1                   equ  6   ;-
t0cs                  equ  5   ;-
t0ie                  equ  5   ;-
t0if                  equ  2   ;-
t0se                  equ  4   ;-
t1ckps0               equ  4   ;-
t1ckps1               equ  5   ;-
t1sync                equ  2   ;-
tmr1cs                equ  1   ;-
tmr1ie                equ  0   ;-
tmr1if                equ  0   ;-
tmr1on                equ  0   ;-
to                    equ  4   ;-
z                     equ  2   ;-
sub_inte              equ  0   ;bandera de subrrutina cancelada por interrupcion.
tiempo_t0             equ  0   ;bandera de temporizacion por tmr0
tiempo_t1             equ  1   ;bandera de temporizacion por tmr1


;------------------------------------------------------------
;               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
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfsc pir1,tmr1if
   goto inte_t1
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss intcon,t0ie
   goto salir__intes
   btfsc intcon,t0if
   goto inte_t0
salir__intes
   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 tmr0
   ;------------------------------------------------------------
inte_t0_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf intcon,t0if
   goto salir__intes
inte_t0
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf _np_t0_ini,w
   movwf tmr0
   bcf _np_timers,tiempo_t0
   decfsz _np_t0_cint_l,1
   goto inte_t02_no
   movf _np_t0_cint_h,w
   btfsc status,z
   goto inte_t02_si
   decf _np_t0_cint_h,1
   goto inte_t02_no
inte_t02_si
   bsf _np_timers,tiempo_t0
   movf _np_t0_cint1_l,w
   movwf _np_t0_cint_l
   movf _np_t0_cint1_h,w
   movwf _np_t0_cint_h
inte_t02_no
   btfss _np_timers,tiempo_t0       ;si el tiempo_t0 = 0
   goto inte_t0_salir  
   movf plocal,w                    ;convertir un registro a bcd
   movwf _np_bcd_temp1
   call conv_8_bcd                  ;llamada a rutina conv_8_bcd
   movf _np_bcd_temp1,w
   movwf plocal_uni
   movf _np_bcd_temp2,w
   movwf plocal_dec
   movf _np_bcd_temp3,w
   movwf plocal_cen  
   movf visitante,w                 ;convertir un registro a bcd
   movwf _np_bcd_temp1
   call conv_8_bcd                  ;llamada a rutina conv_8_bcd
   movf _np_bcd_temp1,w
   movwf visitante_uni
   movf _np_bcd_temp2,w
   movwf visitante_dec
   movf _np_bcd_temp3,w
   movwf visitante_cen   
   movf horas,w                     ;convertir un registro a bcd
   movwf _np_bcd_temp1
   call conv_8_bcd                  ;llamada a rutina conv_8_bcd
   movf _np_bcd_temp1,w
   movwf horas_uni
   movf _np_bcd_temp2,w
   movwf horas_dec
   movf _np_bcd_temp3,w
   movwf horas_cen   
   movf minutos,w                   ;convertir un registro a bcd
   movwf _np_bcd_temp1
   call conv_8_bcd                  ;llamada a rutina conv_8_bcd
   movf _np_bcd_temp1,w
   movwf minutos_uni  
   movf _np_bcd_temp2,w
   movwf minutos_dec
   movf _np_bcd_temp3,w
   movwf minutos_cen 
   incf _np_disp_nro,1              ;visualizar datos en displays cátodo común
   movf _np_disp_nro,w
   xorlw .9
   btfsc status,z
   clrf _np_disp_nro
   movf _np_disp_nro,w
   xorlw .1
   btfsc status,z
   goto inte_t08_d1
   movf _np_disp_nro,w
   xorlw .2
   btfsc status,z
   goto inte_t08_d2
   movf _np_disp_nro,w
   xorlw .3
   btfsc status,z
   goto inte_t08_d3
   movf _np_disp_nro,w
   xorlw .4
   btfsc status,z
   goto inte_t08_d4
   movf _np_disp_nro,w
   xorlw .5
   btfsc status,z
   goto inte_t08_d5
   movf _np_disp_nro,w
   xorlw .6
   btfsc status,z
   goto inte_t08_d6
   movf _np_disp_nro,w
   xorlw .7
   btfsc status,z
   goto inte_t08_d7
   movf _np_disp_nro,w
   xorlw .8
   btfsc status,z
   goto inte_t08_d8
inte_t08_ini
   call dy2_disp_7_seg_01           ;llamada a rutina dy2_disp_7_seg_01
inte_t08_d1
   bcf portb,3                      ;apagar el display 8
   call dy2_disp_7_seg_01           ;llamada a rutina dy2_disp_7_seg_01
   movf plocal_uni,w                ;mostrar el valor del registro plocal_uni
   movwf _np_disp_valor
   call dy3_disp_7_seg_01           ;llamada a rutina dy3_disp_7_seg_01
   bsf porta,1                      ;encender el display 1
   goto inte_t08_salir
inte_t08_d2
   bcf porta,1                      ;apagar el display 1
   call dy2_disp_7_seg_01           ;llamada a rutina dy2_disp_7_seg_01
   movf plocal_dec,w                ;mostrar el valor del registro plocal_dec
   movwf _np_disp_valor
   call dy3_disp_7_seg_01           ;llamada a rutina dy3_disp_7_seg_01
   bsf porta,0                      ;encender el display 2
   goto inte_t08_salir
inte_t08_d3
   bcf porta,0                      ;apagar el display 2
   call dy2_disp_7_seg_01           ;llamada a rutina dy2_disp_7_seg_01
   movf visitante_uni,w             ;mostrar el valor del registro visitante_uni
   movwf _np_disp_valor
   call dy3_disp_7_seg_01           ;llamada a rutina dy3_disp_7_seg_01
   bsf porta,7                      ;encender el display 3
   goto inte_t08_salir
inte_t08_d4
   bcf porta,7                      ;apagar el display 3
   call dy2_disp_7_seg_01           ;llamada a rutina dy2_disp_7_seg_01
   movf visitante_dec,w             ;mostrar el valor del registro visitante_dec
   movwf _np_disp_valor
   call dy3_disp_7_seg_01           ;llamada a rutina dy3_disp_7_seg_01
   bsf porta,6                      ;encender el display 4
   goto inte_t08_salir
inte_t08_d5
   bcf porta,6                      ;apagar el display 4
   call dy2_disp_7_seg_01           ;llamada a rutina dy2_disp_7_seg_01
   movf minutos_uni,w               ;mostrar el valor del registro minutos_uni
   movwf _np_disp_valor
   call dy3_disp_7_seg_01           ;llamada a rutina dy3_disp_7_seg_01
   bsf portb,0                      ;encender el display 5
   goto inte_t08_salir
inte_t08_d6
   bcf portb,0                      ;apagar el display 5
   call dy2_disp_7_seg_01           ;llamada a rutina dy2_disp_7_seg_01
   movf minutos_dec,w               ;mostrar el valor del registro minutos_dec
   movwf _np_disp_valor
   call dy3_disp_7_seg_01           ;llamada a rutina dy3_disp_7_seg_01
   bsf portb,1                      ;encender el display 6
   goto inte_t08_salir
inte_t08_d7
   bcf portb,1                      ;apagar el display 6
   call dy2_disp_7_seg_01           ;llamada a rutina dy2_disp_7_seg_01
   movf horas_uni,w                 ;mostrar el valor del registro horas_uni
   movwf _np_disp_valor
   call dy3_disp_7_seg_01           ;llamada a rutina dy3_disp_7_seg_01
   bsf portb,2                      ;encender el display 7
   goto inte_t08_salir
inte_t08_d8
   bcf portb,2                      ;apagar el display 7
   call dy2_disp_7_seg_01           ;llamada a rutina dy2_disp_7_seg_01
   movf horas_dec,w                 ;mostrar el valor del registro horas_dec
   movwf _np_disp_valor
   call dy3_disp_7_seg_01           ;llamada a rutina dy3_disp_7_seg_01
   bsf portb,3                      ;encender el display 8
   goto inte_t08_salir
inte_t08_salir
inte_t09
   goto inte_t0_salir

   ;------------------------------------------------------------
   ;                      inicio de la interrupción por tmr1
   ;------------------------------------------------------------
inte_t1_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf pir1,tmr1if
   goto salir__intes
inte_t1
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movf _np_t1h_ini,w
   movwf tmr1h
   movf _np_t1l_ini,w
   movwf tmr1l
   bcf _np_timers,tiempo_t1
   decfsz _np_t1_cint_l,1
   goto inte_t12_no
   movf _np_t1_cint_h,w
   btfsc status,z
   goto inte_t12_si
   decf _np_t1_cint_h,1
   goto inte_t12_no
inte_t12_si
   bsf _np_timers,tiempo_t1
   movf _np_t1_cint1_l,w
   movwf _np_t1_cint_l
   movf _np_t1_cint1_h,w
   movwf _np_t1_cint_h
inte_t12_no
   btfss _np_timers,tiempo_t1       ;si el tiempo_t1 = 0
   goto inte_t1_salir


   movf minutos,w
   xorlw d'59'
   btfss status,z
   goto inte_t14_b
   movlw d'0'
   movwf minutos
   goto inte_t14_c
inte_t14_b
   incf minutos,1
inte_t14_c

   movf minutos,w                   ;si minutos = d'0'
   xorlw d'0'
   btfss status,z
   goto inte_t1_salir


   movf horas,w
   xorlw d'99'
   btfss status,z
   goto inte_t16_b
   movlw d'0'
   movwf horas
   goto inte_t16_c
inte_t16_b
   incf horas,1
inte_t16_c
inte_t17
   goto inte_t1_salir

;------------------------------------------------------------
;                      programa principal
;------------------------------------------------------------
paso2
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf _np_banderas2
   clrf plocal
   clrf plocal_uni
   clrf plocal_dec
   clrf plocal_cen
   clrf visitante
   clrf visitante_uni
   clrf visitante_dec
   clrf _np_t1h_ini
   clrf _np_t1l_ini
   clrf _np_t1_cint_l
   clrf _np_t1_cint_h
   clrf _np_tiempo
   clrf _np_tiempo1
   clrf _np_tiempo2
   clrf _np_tiempo3
   clrf _np_t1_cint1_l
   clrf _np_t1_cint1_h
   clrf visitante_cen
   clrf _np_bcd_temp1
   clrf _np_bcd_temp2
   clrf _np_timers
   clrf _np_t0_ini
   clrf _np_t0_cint_l
   clrf _np_t0_cint_h
   clrf _np_t0_cint1_l
   clrf _np_t0_cint1_h
   clrf _np_w
   clrf _np_status
   clrf _np_bcd_temp3
   clrf _np_temp1
   clrf _np_temp1_int
   clrf _np_t_bak
   clrf _np_t1_bak
   clrf _np_t2_bak
   clrf _np_t3_bak
   clrf _np_disp_valor
   clrf _np_disp_nro
   clrf horas_uni
   clrf horas_dec
   clrf horas
   clrf horas_cen
   clrf minutos_uni
   clrf minutos_dec
   clrf minutos_cen
   clrf minutos
   clrf porta
   movlw b'00111100'                ;configurar el puerto a como sseeeess
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisa
   movlw b'00000111'                ;puerto a = e/s digital
   bcf status,rp0                   ;cambiar a banco 0
   movwf cmcon
   clrf portb
   movlw b'00000000'                ;configurar el puerto b como ssssssss
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisb

   bcf status,rp0                   ;cambiar a banco 0
   clrf tmr0
   bsf status,rp0                   ;cambiar a banco 1
   bcf opcion,psa                   ;asignacion del preescalado al tmr0
   bcf opcion,t0cs                  ;origen de la señal de reloj de tmr0 = reloj interno
   bcf opcion,ps0                   ;configurar preescalado a 32
   bcf opcion,ps1
   bsf opcion,ps2
   movlw .216
   bcf status,rp0                   ;cambiar a banco 0
   movwf tmr0
   movwf _np_t0_ini
   movlw .1
   movwf _np_t0_cint_l
   movwf _np_t0_cint1_l
   clrf _np_t0_cint_h
   clrf _np_t0_cint1_h

   bsf intcon,gie                   ;activar habilitador general de interrupciones.
   bcf intcon,t0if                  ;limpiar la bandera antes de activarla
   bsf intcon,t0ie                  ;activar interrupción por tmr0.
   bcf t1con,tmr1cs                 ;origen de la señal de reloj de tmr1
   bsf t1con,t1ckps0                ;tmr1 - configurar preescalado a 8
   bsf t1con,t1ckps1
   movlw b'00001011'
   movwf tmr1h
   movwf _np_t1h_ini
   movlw b'11011100'
   movwf tmr1l
   movwf _np_t1l_ini
   clrf _np_t1_cint_h
   clrf _np_t1_cint1_h
   movlw b'00000010'
   movwf _np_t1_cint_l
   movwf _np_t1_cint1_l

   bsf t1con,tmr1on                 ;activar el tmr1

   bsf intcon,gie                   ;activar habilitador general de interrupciones.
   bsf intcon,peie                  ;activar habilitador general de interrupciones por perifericos.
   bcf pir1,tmr1if                  ;limpiar la bandera antes de activarla
   bsf status,rp0                   ;cambiar a banco 1
   bsf pie1,tmr1ie                  ;activar interrupción por tmr1.
ini
   movlw d'12'
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf visitante
   movlw d'23'
   movwf plocal
   goto ini
   goto ini


;------------------------------------------------------------
;                  Declaración de Subrutinas
;------------------------------------------------------------

conv_8_bcd                          ;convertir un registro a formato bcd (u, d y c)
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   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
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return

dy2_disp_7_seg_01
   ;visualizar datos en displays cátodo común
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf portb,4                      ;limpiar el bus de datos
   bcf portb,5
   bcf portb,6
   bcf portb,7
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return

dy3_disp_7_seg_01
   ;visualizar datos en displays cátodo común
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfsc _np_disp_valor,0           ;asignar el nuevo valor al bus de datos
   bsf portb,4
   btfsc _np_disp_valor,1
   bsf portb,5
   btfsc _np_disp_valor,2
   bsf portb,6
   btfsc _np_disp_valor,3
   bsf portb,7
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


;------------------------------------------------------------
;                  DATOS EN MEMORIA EEPROM
;------------------------------------------------------------
   org  0x2100

 End