Define ADC_CLOCK = 3
Define ADC_SAMPLEUS = 50

ADCON1.ADFM = True
ADCON1.PCFG3 = True
ADCON1.PCFG2 = True
ADCON1.PCFG1 = True
ADCON1.PCFG0 = True
INTCON.PEIE = True
INTCON.GIE = True
PIE1.TMR1IE = True
T1CON.T1CKPS1 = True
T1CON.T1CKPS0 = True
T1CON.T1OSCEN = False
T1CON.T1SYNC = True
T1CON.TMR1CS = False
T1CON.TMR1ON = False
SSPCON.WCOL = False
SSPCON.SSPEN = True
SSPCON.CKP = True
SSPCON.SSPM3 = False
SSPCON.SSPM2 = False
SSPCON.SSPM1 = False
SSPCON.SSPM0 = False
SSPSTAT.SMP = False
SSPSTAT.CKE = True

TRISC = %00010000
TRISA = %00000001
TRISB = %00000000
TRISD = %00000000
TRISE = %00000000

Symbol rst = PORTC.1
Symbol cs = PORTC.2
cs = True

Dim preload As Word
Dim timer As Byte
Dim time As Long
Dim sample As Word
Dim i As Byte
Dim temperature As Long
time = 86340
Dim temp As Byte
preload = 15536
TMR1H = preload.HB
TMR1L = preload.LB


Call init_vfd()
T1CON.TMR1ON = True

End                                               
_____________________________________________________________________________________________________________________________________________________________

On Interrupt
	If timer = 10 Then
		For i = 1 To 30
			Adcin 0, sample
			temperature = temperature + sample
		Next i
		temperature = ((((temperature / 31) * 473) / 100) - 500)
		If time >= 86400 Then
			time = 0
		Endif
		Call spi_cs(10)
		Call spi_send(%00010000, 1)
		temp = get_digit((((time / 3600) Mod 24) / 10))
		If temp = "0" Then
			Call spi_send(" ", 1)
		Else
			Call spi_send(temp, 1)
		Endif
		temp = get_digit(((time / 3600) Mod 10))
		Call spi_send(temp, 1)
		Call spi_send(":", 1)
		temp = get_digit((((time / 60) Mod 60) / 10))
		Call spi_send(temp, 1)
		temp = get_digit(((time / 60) Mod 10))
		Call spi_send(temp, 1)
		Call spi_send(".", 1)
		temp = get_digit(((time Mod 60) / 10))
		Call spi_send(temp, 1)
		temp = get_digit((time Mod 10))
		Call spi_send(temp, 1)
		Call spi_send(" ", 1)
		Call spi_send(" ", 1)
		temp = get_digit((temperature / 100))
		Call spi_send(temp, 1)
		temp = get_digit(((temperature / 10) Mod 10))
		Call spi_send(temp, 1)
		Call spi_send(".", 1)
		temp = get_digit((temperature Mod 10))
		Call spi_send(temp, 1)
		Call spi_send(%11111000, 1)
		Call spi_send("C", 1)
		Call spi_cs(10)
		time = time + 1
		timer = 0
	Else
		timer = timer + 1
	Endif
	TMR1H = preload.HB
	TMR1L = preload.LB
	PIR1.TMR1IF = False
Resume                                            


Proc init_vfd()
	'reset vfd
	rst = False
	WaitMs 1
	rst = True
	'number of digit
	Call spi_cs(10)
	Call spi_send(%01100000, 1)
	Call spi_cs(10)
	'dimming adjust
	Call spi_cs(10)
	Call spi_send(%01010000, 1)
	Call spi_cs(10)
	'comma and decimal point
	Call spi_cs(10)
	Call spi_send(%00110000, 1)
	Call spi_send(%00000000, 16)
	Call spi_cs(10)
	'display position & char data
	Call spi_cs(10)
	Call spi_send(%00010000, 1)
	Call spi_send(%00100000, 16)
	Call spi_cs(10)
	'segment mode
	Call spi_cs(10)
	Call spi_send(%01110000, 1)
	Call spi_cs(10)
End Proc                                          

Proc spi_send(data As Byte, repeat As Byte)
	Dim reversed_data As Byte
	'MSB<->LSB irány megfordítása, mert az SSP-t elfelejtettem átállítani :)
	reversed_data.0 = data.7
	reversed_data.1 = data.6
	reversed_data.2 = data.5
	reversed_data.3 = data.4
	reversed_data.4 = data.3
	reversed_data.5 = data.2
	reversed_data.6 = data.1
	reversed_data.7 = data.0
	Dim i As Byte
	WaitUs 10
	For i = 1 To repeat Step 1
		SSPBUF = reversed_data
		WaitUs 10
	Next i
End Proc                                          

Proc spi_cs(delay As Byte)
	WaitUs delay
	Toggle cs
	WaitUs delay
End Proc                                          

Function get_digit(data As Byte) As Byte
	'A karakterek a nekik megfelelő byteként vannak kiküldve a VFD-nek. A számok viszont decimális értékként, ezért a byte LookUp nélkül karaktereket adnának vissza.
	get_digit = LookUp("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"), data
End Function                                      