;------------------------------------------------------------
; Código assembler generado por Niple V5.2.0
; Proyecto: interruptor
; Autor: 
; Fecha: 24/11/2007
; PIC: 16F84A
; Velocidad de reloj: 4 Mhz
; Descripcion: realiza las funciones de interruptor a traves de las interrupciones intropducidas a traves de RB0
;------------------------------------------------------------


 LIST    P=PIC16F84A


_RC_OSC               equ  0x3FFD
_WDT_OFF              equ  0x3FFB
_PWRTE_ON             equ  0x3FF7
_CP_OFF               equ  0x3FFF

 __config _RC_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF


;------------------------------------------------------------
;                  Declaración de Registros
;------------------------------------------------------------
w                     equ  0x0000
status                equ  0x0003
porta                 equ  0x0005
pclath                equ  0x000a
intcon                equ  0x000b
_np_w                 equ  0x000c
contador              equ  0x000d
_np_status            equ  0x000e
_np_banderas2         equ  0x0014
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
rp0                   equ  5   ;registrer bank select bit
rp1                   equ  6   ;registrer bank select bit
z                     equ  2   ;bit cero
sub_inte              equ  0   ;bandera de subrrutina cancelada por interrupcion.


;------------------------------------------------------------
;                        Inicio
;------------------------------------------------------------

reset   org 0
   goto paso2
   org 4
   movwf _np_w
   swapf _np_w,1
   movf status,w
   bcf status,rp0                   ;cambiar a banco 0
   movwf _np_status
   btfsc intcon,intf
   goto interrupción_rb0
salir_interrupcion
   bcf status,rp0                   ;cambiar a banco 0
   bsf _np_banderas2,sub_inte       ;activar la bandera de rutina cancelada por interrupcion
   movf _np_status,w 
   movwf status
   swapf _np_w,w 
   retfie


;------------------------------------------------------------
;                      inicio de la interrupción por rb0
;------------------------------------------------------------
interrupción_rb0_salir
   bcf intcon,intf
   goto salir_interrupcion
interrupción_rb0
   bsf status,rp0                   ;cambiar a banco 1
   bcf opcion,intedg                ;interrupción rb0. flanco_desc.
   bsf intcon,gie                   ;activar habilitador general de interrupciones.
   bsf intcon,inte                  ;activar interrupción por int.

   bcf status,rp0                   ;cambiar a banco 0
   clrf contador
   incf contador,1                  ;incrementar el registrocontador
   btfsc status,z                   ;recuperar acarreo por desborde
   incf contador,1
   movf contador,w                  ;si el reg contador > d'1'
   sublw d'1'
   btfsc status,c
   goto inte_b0_7
   movlw d'0'                       ;si supera el valor decimal 1, vuelve a 0
   movwf contador
inte_b0_7
   ;escribir en el puerto a
   movf contador,w
   movwf porta
inte_b0_8
   goto interrupción_rb0_salir

;------------------------------------------------------------
;                      programa principal
;------------------------------------------------------------
paso2
   movlw b'00000001'                ;configurar el puerto b como ssssssse
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisb
   movlw b'00000000'                ;configurar el puerto a como xxxsssss
   movwf trisa
   movlw d'0'                       ;el registro contador vale en el comienzo el decimal0
   bcf status,rp0                   ;cambiar a banco 0
   movwf contador
   bsf status,rp0                   ;cambiar a banco 1
   bcf opcion,intedg                ;interrupción rb0. flanco_desc.
   bsf intcon,gie                   ;activar habilitador general de interrupciones.
   bsf intcon,inte                  ;activar interrupción por int.
paso7
   ;escribir en el puerto a
   bcf status,rp0                   ;cambiar a banco 0
   movf contador,w
   movwf porta
   nop                              ;se cierra el cilco¿¿?¿?
   goto paso7                       ;cierra el ciclo
 End
