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.