Prueba este .asm (al final esta el .hex). Hablamos.
Código:
;Tenemos un dipswitch de 3 lineas de 2 posiciones cada una conectados a RA0, RA1 y RA2 y un pulsador
;en el RA4.Solo uno de los 3 puede estar a masa en el momento de alimentar, puede ser cualquiera de
;los 3 pero solo uno y el micro actua diferente sea cual sea el dip.3 modos de funcionamiento.
;
;- Si es el dip de RA0 el que esta a masa al pulsar el pulsador de RA4 se activara la salida de RB0
; durante 1 segundo y despues volvera a nivel bajo a la espera de otra pulsacion.
;
;- Si es el dip de RA1 el que esta a masa al pulsar el pulsador de RA4 se activara la salida de Rb0
; durante 30 segundos y despues volvera a nivel bajo a la espera de otra pulsacion.
;
;-si es el dip de RA2 el que esta a masa cuando se pulse el pulsador de RA4 la salida de RB0 pasara
; a nivel alto hasta que se vuelva a pulsar RA4 que volveria a llevarla a nivel bajo y asi sucesivamente todas las veces.
;
;Digamos q son 3 modos de funcionamiento y estos modos lo marcan las posiciones de los dip.
List p=16F84A ;Tipo de procesador
include "P16F84A.INC" ;Definiciones de registros internos
__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC
Contador equ 0x0c ;Variable para la temporizacion
Estado equ 0x0d ;Estado de la cuenta
Contador1 equ 0x0e
org 0x00 ;Vector de Reset
goto Inicio
org 0x04 ;Vector de interrupcion
Interrupcion bcf INTCON,T0IF ;Repone flag del TMR0
decfsz Contador1 ;contador para permitir mas tiempo
goto Repite ;
btfss PORTA,2 ;si esta en modo conmutacion no decrementa el contador
decfsz Contador,F ;Decrementa el contador
goto Int1
goto Reset ;desactiva RB0 y flag de contando
Int1 movf PORTA,W ;valor de puerto A
xorlw b'00010001' ;mascara para ra0 y ra4 =1
btfsc STATUS,Z ;coincide con la mascara?
goto modoRA0_RA4 ;si, gestiona este caso
;no, comprobar caso 2
movf PORTA,W ;valor de puerto A
xorlw b'00010010' ;mascara para ra1 y ra4 =1
btfsc STATUS,Z ;coincide con la mascara?
goto modoRA1_RA4 ;si, gestiona este caso
;no, comprobar caso 3
movf PORTA,W ;valor de puerto A
xorlw b'00010100' ;mascara para ra2 y ra4 =1
btfsc STATUS,Z ;coincide con la mascara?
goto modoRA2_RA4 ;si, gestiona este caso
goto Repite1
;espera a que se suelte la tecla pulsada y carga la variable contador
modoRA0_RA4 movf PORTA,W ;valor de puerto A
xorlw b'00000001' ;mascara para ra0 y ra4 =1
btfss STATUS,Z ;se ha soltado la tecla?
goto modoRA0_RA4 ;espera a que se suelte
btfsc Estado,0 ;esta temporizando?
goto Reset ;si, retetea salida
movlw d'5' ;no, carga valor para 1 segundo
movwf Contador ;en contador
bsf PORTB,0 ;activa RB0
bsf Estado,0 ;activa flag de temporizando
goto Repite1
modoRA1_RA4 movf PORTA,W ;valor de puerto A
xorlw b'00000010' ;mascara para ra1 y ra4 =1
btfss STATUS,Z ;se ha soltado la tecla?
goto modoRA1_RA4 ;espera a que se suelte
btfsc Estado,0 ;esta temporizando?
goto Reset ;si, retetea salida
movlw d'150' ;30 segundos
movwf Contador ;en contador
bsf PORTB,0 ;activa RB0
bsf Estado,0 ;activa flag de temporizando
goto Repite1
;espera a que se suelte la tecla pulsada y conmuta rb0
modoRA2_RA4 movf PORTA,W ;valor de puerto A
xorlw b'00000100' ;mascara para ra2 y ra4 =1
btfss STATUS,Z ;se ha soltado la tecla?
goto modoRA2_RA4 ;espera a que se suelte
btfss PORTB,0 ;RB0=1?
goto activa_RB0 ;no, activa RB0
goto desactiva_RB0 ;si, desactiva RB0
activa_RB0 bsf PORTB,0
goto Repite1
Reset bcf Estado,0
desactiva_RB0 bcf PORTB,0
goto Repite1
Repite1 movlw d'4'
movwf Contador1 ;Carga contador 1
Repite movlw d'60'
movwf TMR0 ;Repone el TMR0
retfie ;Retorno de interrupcion
Inicio clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
movlw b'11111110' ;RB0 salida
movwf TRISB ;
movlw b'00011111'
movwf TRISA ;Puerta A se configura como entrada
movlw b'00000111'
movwf OPTION_REG ;Preescaler de 256 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0
;carga los valores para el TMR0
movlw d'60'
movwf TMR0 ;Carga el TMR0
movlw d'4'
movwf Contador1 ;Carga contador 1
movlw b'10100000'
movwf INTCON ;Activa la interrupcion del TMR0
Loop goto Loop
end ;Fin del programa fuente
Código:
:020000040000FA
:020000003F2897
:080008000B118E0B3C28051DB5
:100010008C0B0B2837280508113A031918280508F6
:10002000123A031923280508143A03192E283A28EE
:100030000508013A031D18280D18372805308C00D3
:1000400006140D143A280508023A031D23280D183A
:10005000372896308C0006140D143A280508043A07
:10006000031D2E28061C3528382806143A280D10A2
:1000700006103A2804308E003C30810009008601C9
:100080008316FE3086001F30850007308100831202
:0E0090003C30810004308E00A0308B004E28E2
:02400E00FA3F77
:00000001FF