;Gestione display LCD e rotazione LED

	LIST P=16F876

	; INCLUDE FILE, CHANGE DIRECTORY IF NEEDED
	INCLUDE "P16F876.INC"
;	__CONFIG	3FF1H	;è UNA WORD DI CONFIGURAZIONE DEL UNA SERIE DI FLAGS
			        ;RELATIVAMENTE AD ALCUNE MODALITA' DI FUNZIONAMENTO
;	RADIX	DEC	;E'UNA DIRETTIVA CHE SERVE A INFORMARE IL COMPILATORE CHE 
			;I NUMERI SENZA NOTAZIONE SONO DA INTENDERSI COME DECIMALI
	
E	EQU	04	;IL PIN DI ENABLE é COLLEGATO AL BIT 4 DEL PORTB
RS	EQU	05	;IL PIN DI REGISTER SELECT è COLLEGATO AL BIT 5 DEL PORTB
CHAR	EQU	020H
LOOP2	EQU	021H	;utilizzata nella ROUTINE di visualizzazione byte

COUNT1	EQU	022H	;variabile utilizzata nella ROUTINE di ritardo
COUNT2	EQU	023H	;variabile utilizzata nella ROUTINE di ritardo
TEMP	EQU	024H	;variabile utilizzata nella ROUTINE di ritardo

	ORG	0000H
	GOTO	START

	ORG	0010H

;.......................................................................

START	BSF	STATUS,RP0
	BCF	STATUS,RP1	;SELEZIONO IL BANCO 1 DI MEMORIA
	MOVLW	B'11000000'
	MOVWF	TRISB		;DIREZIONAMENTO IN USCITA DEI DEI BITS 0-5 DEL PORTB
	BCF	STATUS,RP0	;RITORNO AL BANCO 0 DI MEMORIA
	CALL	INIDSP		;CHIAMATA ROUTINEE DI INIZIALIZZAZIONE DEL DISPLAY
	MOVLW	'I'		;in accumulatore il carattere da visualizzare
	CALL	VISBYTE		;CHIAMATA DELLA ROUTINEE DI VISUALIZZAZIONE DEI CARATTERI
	MOVLW	'T'
	CALL	VISBYTE
	MOVLW	'I'
	CALL	VISBYTE
	MOVLW	'S'
	CALL	VISBYTE
	MOVLW	' '
	CALL	VISBYTE
	MOVLW	'S'
	CALL	VISBYTE
	MOVLW	'E'
	CALL	VISBYTE
	MOVLW	'V'
	CALL	VISBYTE
	MOVLW	'E'
	CALL	VISBYTE
	MOVLW	'R'
	CALL	VISBYTE
	MOVLW	'I'
	CALL	VISBYTE
	MOVLW	'!'
	CALL	VISBYTE


	MOVLW	0E0H		;carattere alfa della tabella A00
	CALL	VISBYTE
	MOVLW	98H		;carattere vuoto della tabella A00
	CALL	VISBYTE
	MOVLW	0F4H		;carattere omega della tabella A00
	CALL	VISBYTE



	bsf	STATUS,RP0
	bcf	STATUS,RP1	;seleziono il Banco 1 di memoria
	movlw	00h
	movwf	TRISC		;direzionamento in uscita dei bits del portC per LED
	bcf	STATUS,RP0	;seleziono il banco 0 di memoria
	movlw	01h
	movwf	PORTC		;a livello 1 il bit 0 del PORTC: accendo primo LED 
main	movlw	0FFH
	movwf	COUNT1		;inizializzazione della variabile count1 col valore FF hex
	movlw	07FH
	movwf	COUNT2		;inizializzazione della variabile count2 col valore 07F hex
	call	DELAY		;chiamata della subROUTINEe di ritardo delay
	rlf	PORTC,F		;rientro dalla subROUTINEe e rotazione dei LED
	goto	main



;.......................................................................
;       ROUTINEE DI INIZIALIZZAZIONE   DEL   D I S P L A Y

INIDSP	BCF	PORTB,RS	;RS A LIVELLO L per INVIO DI ISTRUZIONI AL DISPLAY 
	BCF	PORTB,E		;EN A LIVELLO L
	MOVLW	0FFH
	MOVWF	COUNT1		;CARICO COUNT1 CON FF HEX
	MOVLW	028H
	MOVWF	COUNT2		;CARICO COUNT2 CON 28 HEX
	CALL	DELAY		;RITARDO DI 30MS PER SETUP DI Vdd
	MOVLW	033H		;SET DI INTERFACCIA A 4 BITS 
	CALL	VISBYTE	
	MOVLW	032H
	CALL	VISBYTE
	MOVLW	028H		;2 LINEE- 5X7 CHR. FONT 
	CALL	VISBYTE
	MOVLW	08H		;TURN OFF DISPLAY AND CURSOR
	CALL	VISBYTE	
	MOVLW	0FH		;TURN ON DISPLAY AND CURSOR
	CALL	VISBYTE	
	MOVLW	06H		;SHIFT AUTOMATICO A DESTRA
	CALL	VISBYTE	
	MOVLW	01H		;CLR DISPLAY
	CALL	VISBYTE	

	BSF	PORTB,RS	;RS A LIVELLO H per INVIO DI ISTRUZIONI AL DISPLAY
	RETURN
;.......................................................................
;RITARDO= (2+((3*COUNT1)+5)COUNT2)*TCY
;COUNT1=COUNT2=FF CK=4MHZ RITARDO=196352*1US=30.9mS

DELAY	MOVF	COUNT1,W	;1 CICLO MACCHINA
	MOVWF	TEMP		;1 CICLO MACCHINA
DELAY1	DECFSZ	TEMP,1		;1 CICLO MACCHINA
	GOTO	DELAY1		;2 CICLI MACCHINA
	MOVF	COUNT1,W	;1 CICLO MACCHINA
	MOVWF	TEMP		;1 CICLO MACCHINA
	DECFSZ	COUNT2,1	;1 CICLO MACCHINA
	GOTO	DELAY1		;2 CICLO MACCHINA
	RETURN			;1 CICLO MACCHINA

;.......................................................................	
;INVIA AL DISPLAY IL BYTE CONTENUTO NELL'ACCUMULATORE.

VISBYTE	MOVWF	CHAR		;SALVO PER IL SECONDO NIBBLE
	MOVLW	02
	MOVWF	LOOP2		;LOOP2=2 viene decrementato per inviare due nibble
NIBBLE2	SWAPF	CHAR,F		;SCAMBIO I DUE NIBBLE DI CHAR: invio prima il nibble hi
	MOVLW	B'11110000'	;PER non alterare gli STATI DI E,RS,B6 E B7
	ANDWF	PORTB,F		;dapprima AZZERO le linee dati (RB0-RB3) 		
	MOVLW	B'00001111'	;quindi invio in W i bit low di CHAR che contengono il nibble
	ANDWF	CHAR,W		;da inviare al display. Il successivo OR LOGICO TRA W e il
	IORWF	PORTB,F		;PORTB (scaricato in PORTB) mi trasferisce il nibble basso
				;di CHAR in RB0-RB3 lasciando inalterati RB4-RB7
	BSF	PORTB,E		;SET DI ENABLE
	NOP			;IL DATA-SHEET RICHIEDE UN Enable cycle time > 1 µs.
	BCF	PORTB,E		;CLR DI ENABLE PER L'ACQUISIZIONE DEL NIBBLE
	
	MOVLW	0FFH
	MOVWF	COUNT1
	MOVLW	28H
	MOVWF	COUNT2		;ATTESA PER ACQUISIZIONE DI 6 mS POICHE' IL
	CALL	DELAY		;RITARDO OPPORTUNO E' DI ALMENO 5mS
	DECFSZ	LOOP2,1
	GOTO	NIBBLE2
	RETURN

	END
