;===================================================================
;       CONVERTITORE 8421 -> DECIMALE CON DISPLAY A 2 CIFRE
;       E TABELLA DI CONVERSIONE MEMORIZZATA SU EEPROM
;
;	    di Walter Giocoso
;	    http://digilander.iol.it/wgiocoso
;
;	    compilato con MPLAB IDE 6.20
;
;       L'ingresso viene immesso tramite i tasti:
;       RA3 (peso8) - RA2 (peso4) - RA1 (peso2) - RA0 (peso1)
;
;       Esempio: La sequenza binaria 0101 equivale in decimale a:
;           (0*8) + (1*4) + (0*2) + (1*1) = 5
;       Nota: In questo progetto devono essere impiegati tasti senza
;           molla di rilascio
;           Poichè il PIC esegue le operazioni in un tempo più breve
;           di quello da noi impiegato per premere i pulsanti,
;           potrebbero apparire delle cifre non significative durante 
;           l'immissione della sequenza di ingresso.
;           Poichè rimane l'ingresso RA4 non sfruttato, si potrebbe 
;           inserire un ulteriore tasto di abilitazione alla lettura
;===================================================================


;                               PORTB ->76543210                        76543210
;
;                               0 ->    abcdef..    OxFC        10->    abcdef.h    0xFD
;     _____       _____         1 ->    .bc.....    0x60        11->    .bc....h    0x61
;    |     |h   f|  a  |b       2 ->    ab.de.g.    0xDA        12->    ab.de.gh    0xDB
;    |     |     |     |        3 ->    abcd..g.    0xF2        13->    abcd..gh    0xF3
;     -----       -----         4 ->    .bc..fg.    0x66        14->    .bc..fgh    0x67
;    |     |h   e|  g  |c       5 ->    a.cd.fg.    0xB6        15->    a.cd.fgh    0xB7
;    |     |     |     |        6 ->    a.cdefg.    0xBE
;     -----       -----         7 ->    abc.....    0xE0
;                   d           8 ->    abcdefg.    0xFE
;                               9 ->    abcd.fg.    0xF6
;



        PROCESSOR   16F84
	    __CONFIG    3FF1H
	    RADIX 	    DEC
	    INCLUDE     "P16F84.INC"
	    ERRORLEVEL  -302
	
	
	
        ORG	        0CH		            ;prima locazione registri per uso generico
        
BIT0    EQU         0                   ;RA0    bit di peso 1
BIT1    EQU         1                   ;RA1    bit di peso 2
BIT2    EQU         2                   ;RA2    bit di peso 4
BIT3    EQU         3                   ;RA3    bit di peso 8
        
INGRESSO RES        1    
CONT    RES         1                   ;variabile di conteggio
DATO    RES         1


        ORG         00H                 ;prima locazione area programma

        BSF         STATUS, RP0         ;banco 1 per definire I/O
        MOVLW       00001111B           ;porte A in ingresso
        MOVWF       TRISA
        MOVLW       00000000B           ;porte B in uscita
        MOVWF       TRISB



;######################################################################################
MAIN
        CALL        TABELLA             ;creazione tabella di conversione nella EEPROM
NUOVO        
        CALL        LEGGI               ;leggi ingresso
        CALL        AZZERA              ;azzera contatore        
        CALL        CERCA               ;cerca corrispondenza in tabella
        CALL        STAMPA              ;stampa cifra sul display
        GOTO        NUOVO

;######################################################################################




;-------------------------------------------------------------------------------------
STAMPA
                                        ;in questo istante la variabile CONT contiene
                                        ;il numero della posizione della tabella
                                        ;in cui è stato trovato il dato.
                                        ;CONT+16 conterrà la corrispondente codifica
                                        ;del display
        MOVLW       16
        ADDWF       CONT,   1           ;CONT := CONT+16                                        
        CALL        LEGGI_EE            ;leggi contenuto della EEPROM all'indirizzo CONT
                                        ;   il risultato si troverà nel registro W
        BCF         STATUS, RP0         ;seleziona banco 0 per accedere alle porte
        MOVWF       PORTB

        RETURN




;-------------------------------------------------------------------------------------
CERCA
        CALL        LEGGI_EE            ;restituisce il contenuto della cella in "DATO"
        MOVF        DATO,   0           ;copia DATO in W
        SUBWF       INGRESSO,0          ;confronta combinazione di ingresso con DATO tabella
        BTFSS       STATUS, Z
        GOTO        PROSEGUI
        GOTO        FINE_RICERCA
PROSEGUI
        INCF        CONT,   1
        GOTO        CERCA

FINE_RICERCA        
        RETURN
                
        
        
;----------------------------------------------------------------------------------
AZZERA                                   
        MOVLW       0
        MOVWF       CONT                ;cont:=0

        RETURN




;----------------------------------------------------------------------------------        
LEGGI_EE        
        BCF         STATUS, RP0         ;banco 0 per accedere ai registri EEADR - EEDATA
        MOVF        CONT,   0           ;W:=CONT
        MOVWF       EEADR
        BSF         STATUS, RP0         ;banco 1 per accedere ai registri EECON1 - EECON2
        BSF         EECON1, RD          ;abilita lettura
TEST_RD                                 ;attendi completamento lettura
        BTFSC       EECON1, RD
        GOTO        TEST_RD        

        BCF         STATUS, RP0         ;banco 0 per accedere ai registri EEADR - EEDATA
        MOVF        EEDATA, 0           ;il dato è adesso in W
        MOVWF       DATO                ;dato:=W
        
        RETURN       






;----------------------------------------------------------------------------------------
LEGGI
        BCF         STATUS, RP0         ;banco 0 per lettura /scrittura porte A / B
        MOVF        PORTA,  0           ;copia PORTA su W
        MOVWF       INGRESSO
        
        RETURN








;----------------------------------------------------------------------------------------
TABELLA                                 ;scrittura della tabella di conversione su EEPROM
                                        ;negli indirizzi da 0 a 15 sono contenuti 
                                        ;i valori in BCD 8421 delle cifre decimali
                                        ;corrispondenti agli indirizzi stessi
                                        ;all'indirizzo n+16 troviamo i segmenti del display
                                        ;che si devono illuminare in corrispondenza del 
                                        ;decimale n
                                        
                                        
        
        BCF         STATUS, RP0         ;seleziona banco0 per accedere ai registri
                                        ;EEADR - EEDATA
                                        ;le chiamate successive vengono effettuate dentro
                                        ;"SCRIVI_EE"
                                        
        MOVLW       0                   ;codifica BCD 8421 del decimale 0
        MOVWF       EEADR
        MOVLW       0000B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       1                   ;codifica BCD 8421 del decimale 1
        MOVWF       EEADR
        MOVLW       0001B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       2                   ;codifica BCD 8421 del decimale 2
        MOVWF       EEADR
        MOVLW       0010B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       3                   ; . . .
        MOVWF       EEADR
        MOVLW       0011B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       4
        MOVWF       EEADR
        MOVLW       0100B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       5
        MOVWF       EEADR
        MOVLW       0101B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       6
        MOVWF       EEADR
        MOVLW       0110B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       7
        MOVWF       EEADR
        MOVLW       0111B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       8
        MOVWF       EEADR
        MOVLW       1000B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       9
        MOVWF       EEADR
        MOVLW       1001B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       10
        MOVWF       EEADR
        MOVLW       1010B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       11
        MOVWF       EEADR
        MOVLW       1011B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       12
        MOVWF       EEADR
        MOVLW       1100B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       13
        MOVWF       EEADR
        MOVLW       1101B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       14
        MOVWF       EEADR
        MOVLW       1110B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       15
        MOVWF       EEADR
        MOVLW       1111B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        

        MOVLW       16                      ;codifica cifra 0 (=16-16)
        MOVWF       EEADR
        MOVLW       11111100B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       17                      ;codifica cifra 1 (=17-16)
        MOVWF       EEADR
        MOVLW       01100000B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       18                      ;codifica cifra 2 (=18-16)
        MOVWF       EEADR
        MOVLW       11011010B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       19                      ; . . .
        MOVWF       EEADR
        MOVLW       11110010B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       20
        MOVWF       EEADR
        MOVLW       01100110B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       21
        MOVWF       EEADR
        MOVLW       10110110B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       22
        MOVWF       EEADR
        MOVLW       10111110B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       23
        MOVWF       EEADR
        MOVLW       11100000B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       24
        MOVWF       EEADR
        MOVLW       11111110B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       25
        MOVWF       EEADR
        MOVLW       11110110B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       26
        MOVWF       EEADR
        MOVLW       11111101B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       27
        MOVWF       EEADR
        MOVLW       01100001B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       28
        MOVWF       EEADR
        MOVLW       11011011B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       29
        MOVWF       EEADR
        MOVLW       11110011B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       30
        MOVWF       EEADR
        MOVLW       01100111B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        MOVLW       31
        MOVWF       EEADR
        MOVLW       10110111B
        MOVWF       EEDATA 
        CALL        SCRIVI_EE
        BSF         STATUS, RP0
        BCF         EECON1, WREN        ;disabilita accesso in scrittura sulla EEPROM

        RETURN






;------------------------------------------------------------------------
SCRIVI_EE
        BSF         STATUS, RP0         ;seleziona banco 1 per accedere 
                                        ;ai registri EECON1 - EECON2
        BSF         EECON1, WREN        ;abilita scrittura su EEPROM
        MOVLW       55H                 ;elimina  protezione in scrittura
        MOVWF       EECON2
        MOVLW       0xAA
        MOVWF       EECON2
        BSF         EECON1, WR          ;scrivi    
TEST_WR                                 ;attendi avvenuta scrittura
        BTFSC       EECON1, WR
        GOTO        TEST_WR      
        BCF         EECON1, EEIF        ;azzera FLAG di conferma scrittura
        BCF         STATUS, RP0         ;torna al banco 0 per accedere 
                                        ;ai registri EEADR - EEDATA
        
        RETURN
;------------------------------------------------------------------------               




        
        END
        
        
