program ils0000 ' FUSES = _INTRC_IO, _ALL_OFF...
'
' LES VARIABLES
'
dim tab_chiffre as byte[10] ' déclare 1 tableau de 10 octets (les chiffres)
dim tours as word ' déclare 1 variable 16 bits unsigned
dim distance as longword ' déclare 1 variable 32 bits unsigned
dim dizaines, unites, kmh, periode, circonference_en_cm as byte ' 5 octets
'
' LES INTERRUPTIONS
'
sub procedure interrupt
if INTCON.INTF = 1 then ' si interruption sur INT RB0 (une impulsion)
inc(tours) ' incremente tours
INTCON.INTF = 0 ' re-active INT RB0
end if
'
if PIR1.TMR1IF = 1 then ' si interruption sur TMR1 (période de 500ms)
inc(periode) ' compte 120 périodes de 500ms
if periode > 119 then ' si 1 minute (120x500ms=60s)
distance = tours * circonference_en_cm ' distance en 1mn (en cm)
distance = distance * 60 ' distance en 1h (en cm)
distance = distance / 100 ' distance en 1h (en m)
kmh = distance / 1000 ' distance en 1h (en km)
dizaines = kmh div 10 ' isole le chiffre des dizaines
unites = kmh mod 10 ' isole le chiffre des unites
tours = 0 ' re-initialise les tours
periode = 0 ' re-initialise le periode
end if
TMR1L = 220 ' période de 500ms @4Mhz/PreScaler = 8
TMR1H = 11 ' période de 500ms @4Mhz/PreScaler = 8
PIR1.TMR1IF = 0 ' re-active INT TMR1
end if
end sub
'
main:
'
' INITIALISE LE PIC 16F88
'
OSCCON = %01100010 ' oscillateur interne @ 4Mhz
ANSEL = %00000000 ' désactive ADC
TrisA = %00000000 ' ports A en sorties
TrisB = %00000001 ' port RB0 en entrée
'
tab_chiffre[0] = %01111110 ' 0
tab_chiffre[1] = %00001100 ' 1
tab_chiffre[2] = %10110110 ' 2
tab_chiffre[3] = %10011110 ' 3
tab_chiffre[4] = %11001100 ' 4
tab_chiffre[5] = %11011010 ' 5
tab_chiffre[6] = %11111010 ' 6
tab_chiffre[7] = %00001110 ' 7
tab_chiffre[8] = %11111110 ' 8
tab_chiffre[9] = %11011110 ' 9
dizaines = 0
unites = 0
periode = 0
tours = 0
circonference_en_cm = 53 ' circonférence de la roue en cm...
'
T1CON = %00110001 ' activation du TMR1 avec PreScaler = 8
TMR1L = 220 ' période de 500ms @4Mhz/PreScaler = 8
TMR1H = 11 ' période de 500ms @4Mhz/PreScaler = 8
INTCON = %11010000 ' activation INT RB0 + INT sur Périphs
PIE1 = %00000001 ' activation INT TMR1 (Périphs)
'
' LE PROGRAMME PRINCIPAL (dans une boucle infinie)
'
while true
PortA = %00000000 ' éteint tout
PortB = tab_chiffre[dizaines]
PortA = %00000100 ' allume afficheur des dizaines
Delay_ms(10)
PortA = %00000000 ' éteint tout
PortB = tab_chiffre[unites]
PortA = %00001000 ' allume afficheur des unites
Delay_ms(10)
wend
'
end.