;
;					ESEMPIO 2.14
;
;				Autore: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Esempio per simulazione e/o MicroPIC Trainer
;
;Contatore UP/DOWN decimale di una cifra
;
;Sul display a 7 segmenti connessi alla porta B verrà visualizzato il numero di impulsi 
;applicati dall'entrata RA0. RA1 determina se il conto è ascendente (a "1")
;o discendente
	
		List	p=16F84		;Tipo di processore
		include	"P16F84.INC"	;Definizioni di registri interni
                    
Contatore	equ	0x0c		;Variabile del contatore
		
		org	0x00		;Vettore di Reset
		goto	Inizio

		org	0x05		;Salva il vettore di interrupt

;**********************************************************************************
;Tabella: Questa procedura converte il codice BCD presente nei 4 bits di minore peso
;del reg. W nel suo equivalente a 7 segmenti. Il codice a 7 segmenti ritorna anche
;nel reg. W

Tabella:	addwf	PCL,F			;Spostamento sulla tabella
		retlw	b'00111111'		;Cifra 0
		retlw	b'00000110'		;Cifra 1
		retlw	b'01011011'		;Cifra 2
		retlw	b'01001111'		;Cifra 3
		retlw	b'01100110'		;Cifra 4
		retlw	b'01101101'		;Cifra 5
		retlw	b'01111101'		;Cifra 6
		retlw	b'00000111'		;Cifra 7
		retlw	b'01111111'		;Cifra 8
		retlw	b'01100111'		;Cifra 9

;*********************************************************************************
;Delay_20_ms: Questa procedura di temporizzazione ha per scopo di eliminare l'"effetto
;rimbalzo" delle periferiche elettromeccaniche. Realizza un delay di 20 mS. Se il PIC
;lavora a una frequenza di 4MHz, il TMR0 cambia ogni uS. Se desideriamo tempori-
;zzare 20000 uS (20 mS) con un prescaler di 128, il TMR0 dovrà contare 156 eventi
;(156 * 128). >Il valore 156 equivale a 9c hex. e poiché il TMR0 è ascendente bisognerà
;caricare il suo complemento a 1 (63 hex.).

Delay_20_ms:	bcf	INTCON,T0IF	;Disconnetti il flag di overflow
		movlw	0x63		;Complemento hex. di 156
		movwf	TMR0		;carica il TMR0
Delay_20_ms_1	clrwdt			;Aggiornare il WDT
		btfss	INTCON,T0IF	;Overflow del TMR0 ??
		goto	Delay_20_ms_1	;Ancora no
		bcf	INTCON,T0IF	;Adesso sì, rimettere il flag
		return

Inizio	        clrf 	PORTB		;Cancella i latch di uscita
		bsf	STATUS,RP0	;Seleziona banco 1
		clrf	TRISB		;Porta B si configura come uscita
		movlw	b'00011111'		
		movwf	TRISA		;Porta A si configura come entrata		
		movlw	b'00000110'
		movwf	OPTION_REG	;Prescaler di 128 per il TMR0
		bcf	STATUS,RP0	;Seleziona banco 0			                                                                         
		clrf	Contatore	;Mettere a 0 del contatore
				
Loop		movf	Contatore,W
		call	Tabella		;Converti BCD in 7 segmenti
		movwf	PORTB		;Visualizza il valore del contatore
Wait_0		clrwdt			;Aggiornare il WDT
		btfss	PORTA,0		;Aumento del segnale RA0 ?
		goto	Wait_0		;No
		call	Delay_20_ms	;Elimina rimbalzi

Wait_1		clrwdt			;Aggiornare il WDT
		btfsc	PORTA,0		;Diminuzione di RA0 (impulso) ??
		goto	Wait_1		;No
		call	Delay_20_ms	;C'è stato impulso, eliminare rimbalzi

		btfss	PORTA,1		;RA1 = 1
		goto	Down		;No, conto discendente

Up		incf	Contatore,F	;Aumenta contatore
		movlw	.10
		subwf	Contatore,W
		btfss	STATUS,Z	;E' maggiore di 9 ??
		goto	Loop		;No
		clrf	Contatore	;Sì, mettere a 0 il contatore
		goto	Loop

Down		decf	Contatore,F	;Diminuisci il contatore
		movlw	0xff
		subwf	Contatore,W
		btfss	STATUS,Z	;E' minore di 0 ??
		goto	Loop		;No
		movlw	0x09
		movwf	Contatore	;Sì, mettere a 9 il contatore
		goto	Loop

		end			;Fine del programma principale

