;*******************************************************************
;    CONTO A RITROSO 9 -> 0     CON LCD 7 SEGMENTI
;   E FUNZIONE DI AUTOSPEGNIMENTO
;
;    di Walter Giocoso
;    http://digilander.iol.it/wgiocoso
;
;    compilato con MPLAB IDE 6.20
;    
;    
;    Il tasto su RA0 fa proseguire il conteggio a ritroso ad ogni 
;    pressione.
;    Il tasto su RB0 gestisce un interrupt di reset
;   Versione modificata del CONTATORE 9 -> 0
;   con l'aggiunta della funzionalita' di risparmio energetico.
;   Il puntino segnala l'accensione o lo spegnimento del dispositivo
;   Lo spegnimento avviene solo a fine conteggio.
;*******************************************************************


;                            PIN_LCD    | SEGM.    | PORTA_ASSOCIATA
;            a                  pin1    | comm     |    
;         -------               pin2    | f        | RB5
;        |       |              pin3    | g        | RB6
;        |f      |b             pin4    | e        | RB4
;        |   g   |              pin5    | d        | RB3
;         -------               pin6    | comm     |
;        |       |              pin7    | DP       | RB7
;        |e      |c             pin8    | c        | RB2
;        |       |              pin9    | b        | RB1
;         ------- []DP          pin10   | a        | RA4
;            d






;               PORTB    BIT7    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0
;                        DP       g       f       e       d       c       b       INT





        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_a    EQU         4                  ;RA4            

;        LED_b    EQU     1            ;RB1
;        LED_c    EQU     2            ;RB2
;        LED_d    EQU     3            ;RB3
;        LED_e    EQU     4            ;RB4
;        LED_f    EQU     5            ;RB5
;        LED_g    EQU     6            ;RB6
;        LED_DP   EQU     7            ;RB7

TASTO   EQU         0                   ;RA0

RST     EQU         0                   ;RB0/INT
i       RES         1




        ORG         00H                 ;area programma del PIC
        GOTO        INIZIO              ;salta l'interrupt vector


;#######################################################################
        ORG         04H                 ;interrupt vector

        CALL        CLEAR_DISP          ;pulisci schermo
        GOTO        MAIN                ;ricomincia il main
        RETFIE                          ;fine interrupt vector
;#######################################################################





INIZIO            
        BSF         STATUS, RP0         ;seleziona il banco 1 per definire I/O
        MOVLW       00000001B           ;definisci porte B in uscita, B0 in ingresso
        MOVWF       TRISB        
        MOVLW       00000001B           ;definisci porta RA0 in ingresso, RA4 in uscita
        MOVWF       TRISA
        BCF         STATUS, RP0         ;seleziona il banco 0 per definire H/L    
        BSF         INTCON, GIE         ;abilitazione generale interrupt
        BSF         INTCON, INTE        ;abilitazione interrupt da linea RB0/INT
        GOTO        MAIN




LEGGI                                   ;leggi tasto
        BTFSS       PORTA,  TASTO       ;attendi pressione del tasto
        GOTO        LEGGI
ANTIRIMBALZO                            ;prosegui solo se rilasciato
        BTFSC       PORTA,  TASTO
        GOTO        ANTIRIMBALZO
        RETURN                          ;end leggi
;    _______________________________________________________________





CLEAR_DISP
        BCF         PORTA,  LED_a
        CLRF        PORTB
        RETURN
;    _______________________________________________________________





DISP_9                                    ;segmenti: a*bcdfg
    
        ;        PORTB    BIT7    BIT6    BIT5    BIT4    BIT3    BIT2    BIT1    BIT0
        ;                 DP         g       f       e       d       c       b     INT
        ;                 0          1       1       0       1       1       1      0
    
        CALL        CLEAR_DISP    
        BSF         PORTA,  LED_a
        MOVLW       01101110B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________






DISP_8                                    ;segmenti: a*bcdefg
    
    
        CALL        CLEAR_DISP    
        BSF         PORTA,  LED_a
        MOVLW       01111110B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________




DISP_7                                    ;segmenti: a*bc
    
    
        CALL        CLEAR_DISP    
        BSF         PORTA,  LED_a
        MOVLW       00000110B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________







DISP_6                                    ;segmenti: a*cdefg
    
    
        CALL        CLEAR_DISP    
        BSF         PORTA,  LED_a
        MOVLW       01111100B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________




DISP_5                                    ;segmenti: a*cdfg
    
    
        CALL        CLEAR_DISP    
        BSF         PORTA,  LED_a
        MOVLW       01101100B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________






DISP_4                                    ;segmenti:  *bcfg
    
    
        CALL        CLEAR_DISP    

        MOVLW       01100110B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________


DISP_3                                    ;segmenti: a*bcdg
    
        CALL        CLEAR_DISP    
        BSF         PORTA, LED_a
        MOVLW       01001110B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________





DISP_2                                    ;segmenti: a*bdeg
    
        CALL        CLEAR_DISP    
        BSF         PORTA, LED_a
        MOVLW       01011010B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________




DISP_1                                    ;segmenti:  *bc
    
        CALL        CLEAR_DISP    

        MOVLW       00000110B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________







DISP_0                                    ;segmenti: a*bcdef
    
        CALL        CLEAR_DISP    
        BSF         PORTA, LED_a
        MOVLW       00111110B
        MOVWF       PORTB
        RETURN
;    _______________________________________________________________





DISP_DP                                 ;segmenti: h (lampeggiante)
    
        CALL        CLEAR_DISP    
        MOVLW       4
        MOVWF       i                   ;i:=4
CICLO          
        MOVLW       10000000B
        MOVWF       PORTB
        NOP
        NOP
        CALL        CLEAR_DISP
        NOP
        NOP
        DECFSZ      i,      1           ;ripeti ciclo per 4 volte
        GOTO        CICLO
        MOVLW       10000000B           ;lascia puntino acceso
        MOVWF       PORTB

        RETURN
;    _______________________________________________________________






; *******************************************************

MAIN

        BCF         STATUS, RP0         ;seleziona il banco 0 per definire H/L        

        BCF         INTCON,    RBIF     ;riabilita l'accettazione di nuovi interrupt    
        BCF         INTCON,    INTF
        BSF         INTCON,    GIE
        CALL        DISP_DP             ;lampeggia puntino                
        CALL        LEGGI
        CALL        DISP_9              ;visualizza cifra
        CALL        LEGGI
        CALL        DISP_8
        CALL        LEGGI
        CALL        DISP_7
        CALL        LEGGI
        CALL        DISP_6
        CALL        LEGGI
        CALL        DISP_5
        CALL        LEGGI
        CALL        DISP_4
        CALL        LEGGI
        CALL        DISP_3
        CALL        LEGGI
        CALL        DISP_2
        CALL        LEGGI
        CALL        DISP_1
        CALL        LEGGI
        CALL        DISP_0
        NOP
        NOP
        NOP
        NOP
        NOP
        CALL        DISP_DP
        SLEEP                           ;MODALITA' RISPARMIO ENERGETICO
        GOTO        MAIN

; *******************************************************


    
        END    
