Sei sulla pagina 1di 3

;**************************************************

; PIC Microcontroller By Example


; INTRB.ASM: Esempio di gestione degli interrupt
; (c) 2003, Sergio Tanzilli
; http://www.picbyexample.com
;**************************************************

PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"

LED1 EQU 0
LED2 EQU 1

ORG 0CH

Count RES 2 ;Registro utilizzato come contatore nella


;subrountine di ritardo Delay

;Reset Vector
;Punto di inizio del programma al reset della CPU
;Salta al corpo principale del programma. Questo jump � necessario
;per evitare tutta la parte di codice per la gestione degli
;interrupt.
ORG 00H
goto Start

;**********************************************************************
; Interrupt handler
;**********************************************************************
;Punto di inizio per tutte le subroutine di gestione degli interrupt
ORG 04H

;Accende LED2 se spento, altrimenti lo spegne


btfss PORTB,LED2 ;Led acceso ?
goto TurnOnLED2 ;No, lo accende
goto TurnOffLED2 ;Si, lo spegne

;Accende il LED2
;Azzera nuovamente il flag RBIF
;Ritorna al programma principale
TurnOnLED2
bsf PORTB,LED2 ;Spegne LED2
bcf INTCON,RBIF
retfie

;Spegne il LED2
;Azzera nuovamente il flag RBIF
;Ritorna al programma principale
TurnOffLED2
bcf PORTB,LED2 ;Spegne LED2
bcf INTCON,RBIF
retfie

;**********************************************************************
; Programma principale
;**********************************************************************
Start:
;Commuta sul secondo banco dei registri per accedere a TRISA e TRISB
bsf STATUS,RP0

;Definizione delle linee di I/O (0=Uscita, 1=Ingresso)


;Definizione della porta A
movlw 00011111B
movwf TRISA

;Definizione della porta B


;Le linee da RB0 a RB3 vengono programmate in uscita
;per essere collegate ai quattro led
;Le linee da RB4 a RB7 vengono programmate in ingresso
;per essere collegate ai quattro pulsanti
movlw 11110000B
movwf TRISB

;Commuta sul primo banco dei registri


bcf STATUS,RP0

;Spegne tutti i led collegati sulla porta B


bcf PORTB,LED1
bcf PORTB,LED2

;Abilita l'interrupt sul cambiamento di stato delle linee RB4,5,6,7


movlw 10001000B
movwf INTCON

;**********************************************************************
; Loop principale
;**********************************************************************
MainLoop
call Delay ;Ritardo software

btfss PORTB,LED1 ;Led acceso ?


goto TurnOnLED1 ;No, lo accende
goto TurnOffLED1 ;Si, lo spegne

;Accende LED1 e torna al Loop principale


TurnOnLED1
bsf PORTB,LED1
goto MainLoop

;Spegne LED1 e torna al Loop principale


TurnOffLED1
bcf PORTB,LED1
goto MainLoop

;**********************************************************************
; Subroutine
;**********************************************************************
;Subroutine di ritardo software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END

Potrebbero piacerti anche