;************************************************** ; prove con gli interrupt ; INTRB.ASM ; ;************************************************** PROCESSOR 16F84 RADIX DEC INCLUDE "P16F84.INC" ;Setup of PIC configuration flags ;XT oscillator ;Disable watch dog timer ;Enable power up timer ;Disable code protect __CONFIG 3FF1H LED1 EQU 0 LED2 EQU 1 LED3 EQU 2 LED4 EQU 3 ORG 0CH Count RES 2 nTick RES 1 ;Registro utilizzato per contare il numero di ;lampeggi del LED 1 ;Reset Vector ;Punto di inizio del programma al reset della CPU ORG 00H ;Salta al corpo principale del programma. Questo jump è necessario ;per evitare tutta la parte di codice per la gestione degli ;interrupt. goto Start ;Interrupt vector ;Punto di inizio per tutte le subroutine di gestione degli interrupt ORG 04H ;********************************************************************** ; Interrupt handler ;********************************************************************** ;Accende il led 2 per segnalare che c'e' stato un interrupt bsf PORTB,LED2 ;Inizializza il contatore di lampeggi del LED1 movlw 3 movwf nTick ;Azzera nuovamente il flag RBIF per consentire all'interrupt di ;ripetersi bcf INTCON,RBIF ;Ritorna al programma principale retfie ;********************************************************************** ; Programma principale ;********************************************************************** Start: ;Commuta sul secondo banco dei registri per accedere ai registri TRISA e TRISB bsf STATUS,RP0 ;Definizione delle linee di I/O (0=Uscita, 1=Ingresso) ;Definizione della porta A movlw 00011111B movwf TRISA & 7FH ;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 & 7FH ;Commuta sul primo banco dei registri bcf STATUS,RP0 ;Spegne tutti i led collegati sulla porta B bcf PORTB,LED1 bcf PORTB,LED2 bcf PORTB,LED3 bcf PORTB,LED4 ;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 ;Accensione led e decremento del contatore di lampeggi TurnOnLed1 bsf PORTB,LED1 ;Controlla se LED 2 di segnalazione dell'interrupt e' gia acceso. ;Se e' acceso decrementa il contatore nTick ad ogni lampeggio di ;LED1. Quando nTick vale 0 spegne LED 2 btfss PORTB,LED2 ;LED2 acceso ? goto MainLoop ;No, continua a lampeggiare decf nTick,1 ;Si, decrementa nTick btfss STATUS,Z ;nTick = 0 ? goto MainLoop ;No, continua a lampeggiare bcf PORTB,LED2 ;Si, spegne LED2 goto MainLoop ;Continua a lampeggiare ;Spegnimento led TurnOffLed1 bcf PORTB,LED1 ;Spegne LED 1 goto MainLoop ;Continua a lampeggiare ;********************************************************************** ; 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