;*******************************************************************
;    SISTEMA PER L'ACCENSIONE A ROTAZIONE DI 8 LED
;   CON RESET AUTOMATICO DELLA CPU IN CASO DI BLOCCO
;    di Walter Giocoso
;    http://digilander.iol.it/wgiocoso
;
;    compilato con MPASM
;    
;    L'accensione di un led avviene tutte le volte che viene premuto 
;    e rilasciato il tasto
;    Ogni pressione del tasto spegne il led precedente e accende 
;    il successivo
;   Il Watch Dog Timer interno al PIC verifica ad ogni ciclo l'eventuale 
;   blocco della CPU ed eventualmente resetta
;   L'azzeramento del WDT è stato inserito nella procedura di attesa della 
;   pressione di un tasto, che è una procedura ricorsiva; 
;   in tal modo viene eseguita anche se nessun tasto è premuto, evitando
;   reset indesidearati
;
;   (Per abilitare il Watch Dog Timer occorre abilitare in fase di programmazione 
;   il flag WDTE della word di configurazione. 
;   La modalità di attivazione di questo flag dipende dal programmatore in uso.)
;*******************************************************************


        PROCESSOR   16F84
        __CONFIG    3FF1H
        RADIX         DEC
        INCLUDE     "P16F84.INC"
        ERRORLEVEL  -302

        ORG            0CH              ;prima locazione registri per uso generico
            
                                        ;definizione delle porte in cui sono connessi i led
                                        ;e definizione porta tasto    
LED_B1    EQU         0                 ;RB0            
LED_B2    EQU         1                 ;RB1
LED_B3    EQU         2                 ;RB2
LED_B4    EQU         3                 ;RB3
LED_B5    EQU         4                 ;RB4
LED_B6    EQU         5                 ;RB5
LED_B7    EQU         6                 ;RB6
LED_B8    EQU         7                 ;RB7

TASTO_A   EQU         0                 ;RA0



;                   OPTION_REG      -RBPU   INTEDG  T0CS    T0SE    PSA PS2 PS1 PS0
;                                       0       0       0       0     1   1   1   1
;
;                   PSA=1           Assegna Prescaler al WDT   
;                   PS2/1/0=111     Ritardo 2,304 s        


        ORG         00H                 ;area programma del PIC
                
        BSF         STATUS, RP0         ;seleziona il banco 1 per definire I/O
        MOVLW       00000000B           ;definisci porte B in uscita
        MOVWF       TRISB        
        MOVLW       00000001B           ;definisci porta RA0 in ingresso
        MOVWF       TRISA
        MOVLW       00001111B           ;asseggna Prescaler al WDT e configura
        MOVWF       OPTION_REG



        BCF         STATUS, RP0         ;seleziona il banco 0 per definire H/L
    



; *******************************************************

MAIN
        CALL        LEGGI               ;leggi tasto
        CLRF        PORTB               ;spegni tutti i led
        BSF         PORTB,    LED_B1
        CALL        LEGGI               ;leggi tasto
        CLRF        PORTB               ;spegni tutti i led
        BSF         PORTB,    LED_B2
        CALL        LEGGI               ;leggi tasto
        CLRF        PORTB               ;spegni tutti i led
        BSF         PORTB,    LED_B3
        CALL        LEGGI               ;leggi tasto
        CLRF        PORTB               ;spegni tutti i led
        BSF         PORTB,    LED_B4
        CALL        LEGGI               ;leggi tasto
        CLRF        PORTB               ;spegni tutti i led
        BSF         PORTB,    LED_B5
        CALL        LEGGI               ;leggi tasto
        CLRF        PORTB               ;spegni tutti i led
        BSF         PORTB,    LED_B6
        CALL        LEGGI               ;leggi tasto
        CLRF        PORTB               ;spegni tutti i led
        BSF         PORTB,    LED_B7
        CALL        LEGGI               ;leggi tasto
        CLRF        PORTB               ;spegni tutti i led
        BSF         PORTB,    LED_B8
        GOTO        MAIN                ;ripeti indefinitivamente

; *******************************************************






LEGGI                                   ;leggi tasto
        CLRWDT                          ;azzera contatore del controllo antiblocco CPU
        BTFSS       PORTA,    TASTO_A   ;attendi pressione del tasto
        GOTO        LEGGI
ANTIRIMBALZO                            ;prosegui solo se rilasciato
        BTFSC       PORTA,    TASTO_A
        GOTO        ANTIRIMBALZO
        RETURN                          ;end leggi
;_______________________________________________________________


    
    END    
