
;=======================================================================
;       MEMORIZZAZIONE VARIABILE A 8 BIT, LETTA SU INGRESSO A 4 BIT
;       versione per PIC16F876
;
;	    di Walter Giocoso
;	    http://digilander.iol.it/wgiocoso
;
;
;       effettua due letture dagli ingressi a 4 bit RA0-RA3 e costruisce
;       un DATO a 8 bit da memorizzare in un registro.
;       La prima lettura è relativa ai 4 bit meno significativi.
;       La conferma di lettura avviene per mezzo del pulsante con rilascio
;       RA4
;
;	    compilato con MPLAB IDE 6.20
;
;========================================================================




        PROCESSOR   16F876
        __CONFIG    3FF1H
        RADIX 	    DEC
        INCLUDE     "P16F876.INC"
        ERRORLEVEL  -302
	


        ORG         20H             ;registri per uso generico nel BANCO0 (96 byte)
                                    ;(definita in accordo alla definizione di BANCOVAR)


;ASSEGNAZIONE DATO DI INGRESSO ALLE PORTE ---------------------------------------------
                                    ;permette di riutilizzare le procedure in altri 
                                    ;programmi, ridefinendo queste costanti in modo
                                    ;opportuno
DO      EQU         0
D1      EQU         1
D2      EQU         2
D3      EQU         3
        

TASTO_L EQU         4               ;tasto lettura


FLAG    RES         1               ;contiene 8 bit di stato del programma
LETTI8B EQU         3               ;bit "SET=letti tutti e 8 i bit di ingr." di FLAG
LETTI4B EQU         2               ;bit "SET=letti i primi 4 bit di ingresso"di FLAG
PREMUTO EQU         1               ;bit "SET=tasto premuto (non rilasciato)" di FLAG
PRONTO_L    EQU     0               ;bit "SET=pronto a leggere" di FLAG


DATO    RES         1
DATO_TEMP   RES     1
        
        
        ORG         00H             ;area programma	

;DEFINIZIONE DELLE PORTE --------------------------------------------------------------
                                        ;1=ingresso / 0=uscita
        CALL        BANCO1
        MOVLW       00011111B
        MOVWF       TRISA
        MOVLW       00000111B           ;definisci come porte digitali
        MOVWF       ADCON1   





;INIZIALIZZAZIONE
        CALL        BANCOVAR
        MOVLW       00H
        MOVWF       FLAG




MAIN    ;#######################################################################
        CALL        BANCOVAR
        BTFSS       FLAG,   PRONTO_L    ;non ricontrollare se "pronto a leggere"
        CALL        TEST_IN
        CALL        BANCOVAR
        BTFSC       FLAG,   PRONTO_L    ;leggi ingresso solo se "pronto a leggere"
        CALL        LEGGI8
        GOTO        MAIN
        ;#######################################################################               	





LEGGI8  ;----------------------------------------------------------------------------
                                        ;Legge due volte 4bit dalle stesse porte
;LEGGI4A                                ;Leggi i primi 4 bit
        CALL        BANCOVAR
        BTFSS       FLAG,   LETTI4B     ;non rileggere i primi 4 bit se già letti
        CALL        LEGGI_INA
;LEGGI4B
        CALL        BANCOVAR
        BTFSS       FLAG,   LETTI4B     ;non leggere i bit successivi se mancano...
        RETURN                          ;...i primi 4
        MOVF        DATO,   0           ;W:=DATO
        MOVWF       DATO_TEMP
        CALL        TEST_IN
        CALL        BANCOVAR
        BTFSC       FLAG,   PRONTO_L    ;leggi ingresso solo se "pronto a leggere"
        CALL        LEGGI_INB
        CALL        BANCOVAR
        BTFSC       FLAG,   PRONTO_L    ;se PRONTO_L=SET la lettura non è ultimata...
        RETURN                          ;...quindi salta le istruzioni successive
        BTFSS       FLAG,   LETTI8B
        RETURN
        SWAPF       DATO,   0           ;DATO=0000abcd -> W=abcd0000
        IORWF       DATO_TEMP,   0
        MOVWF       DATO
        BCF         FLAG,   LETTI4B     ;lettura 8bit ultimata    
        BCF         FLAG,   LETTI8B     
        RETURN




LEGGI_INA ;--------------------------------------------------------------------------
        CALL        BANCOPORTE
        MOVF        PORTA,  0           ;W:=PORTA
        ANDLW       00001111B           ;W:=W&00001111B (considera solo da RA0 a RA3)
        CALL        BANCOVAR
        MOVWF       DATO
        BCF         FLAG,   PRONTO_L    ;ricontrolla TASTO_L prima di leggere porta
        BSF         FLAG,   LETTI4B     ;4 bit sono stati letti
        RETURN



LEGGI_INB ;--------------------------------------------------------------------------
        CALL        BANCOPORTE
        MOVF        PORTA,  0           ;W:=PORTA
        ANDLW       00001111B           ;W:=W&00001111B (considera solo da RA0 a RA3)
        CALL        BANCOVAR
        MOVWF       DATO
        BCF         FLAG,   PRONTO_L    ;ricontrolla TASTO_L prima di leggere porta
        BSF         FLAG,   LETTI8B     ;4 bit sono stati letti
        RETURN






TEST_IN ;----------------------------------------------------------------------------
        CALL        BANCOVAR
        BTFSC       FLAG,   PREMUTO     ;se il tasto è ancora premuto...
        GOTO        RILASCIO_IN         ;...rifiuta una nuova lettura
        CALL        BANCOPORTE
        BTFSS       PORTA,  TASTO_L     ;verifica pressione TASTO_L
        RETURN                          ;torna indietro se non è premuto
        CALL        BANCOVAR
        BSF         FLAG,   PREMUTO
RILASCIO_IN                             ;procedura antirimbalzo tasto
        CALL        BANCOPORTE
        BTFSC       PORTA,  TASTO_L
        RETURN                          ;se è ancora premuto, ricontrolla dopo...
        CALL        BANCOVAR
        BCF         FLAG,   PREMUTO     ;tasto rilasciato
        BSF         FLAG,   PRONTO_L    ;pronto a leggere il dato
        RETURN





;DEFINIZIONE BANCHI -------------------------------------------------------------------
                                    ;-- nota --
                                    ;per ottimizzare il programma si consiglia di
                                    ;sostituire le "CALL ai banchi" con le relative 
                                    ;coppie di istruzioni e di eliminare le ridondanze
                                    ;Nota anche che PORTB è definita sia sul BANCO0
                                    ;che sul BANCO2
BANCO0        
BANCOVAR                            ;banco delle variabili (direttiva ORG 20H)
BANCOPORTE                          ;banco di lettura/scrittura sulle porte
        BCF         STATUS, RP1
        BCF         STATUS, RP0
        RETURN
BANCO1
        BCF         STATUS, RP1
        BSF         STATUS, RP0
        RETURN
BANCO2
        BSF         STATUS, RP1
        BCF         STATUS, RP0
        RETURN
BANCO3
        BSF         STATUS, RP1
        BSF         STATUS, RP0
        RETURN

	    
        END
