; Macros: Si registro=constante, salta a la etiqueta asignada en "SALTO" Saltarsiesigual MACRO Registro, Constante, Salto movlw Constante ; Va a realizar la comparación mediante resta. subwf Registro,W ; (W)=(Registro)-Constante btfsc STATUS,Z goto Salto ENDM ; XT = 4MHZ __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC LIST P=16F877A INCLUDE CBLOCK 0x20 contador ENDC Vinicial EQU .61 #define LED PORTB,1 #define banco0 bcf STATUS,RP0 #define banco1 bsf STATUS,RP0 ORG 0 goto Inicio ORG 4 ; Cuando se produce una interrupcion, viene a esta direccion y lo enviamos a: goto Interrupcion_por_desbordamiento_TMR0 Inicio clrf contador ; limpiador inicia en 0 banco1 ; accedemos al Banco 1 - OBS: Iniciamos en banco 0 bcf TRISB,1 ; RA0 config como salida movlw b'00000111' ; prescaler de 256 movwf OPTION_REG banco0 ; accedemos al banco 0 bcf LED ; Led inicia apagado movlw Vinicial movwf TMR0 ; TMR0=Vinicial movlw b'10100000' ; habilitamos interrupcion por desbordamiento del TMR0 movwf INTCON Principal goto Principal Interrupcion_por_desbordamiento_TMR0 movlw Vinicial movwf TMR0 ; Nuevamente TMR0=Vinicial, hasta que contador sea igual a 125 incf contador ; incrementamos valor de contador Saltarsiesigual contador,.10,ACA ; si contador=10, salta a la etiqueta "salta". Macro definida al inicio del programa goto Fin ACA:clrf contador btfsc LED ; ¿Led estaba encendido o apagado? goto xa bsf LED ; Si estaba apagado, entonces lo encendemos goto Fin xa bcf LED ; Si estaba encendido, entonces lo apagamos Fin bcf INTCON,T0IF ; ponemos la bandera a 0. Se hace por software. retfie END