program Tachymetre ' J-C. Grimaldi novembre 2008 ' Tachymètre portable affiche mesure exacte et valeur à l'échelle ' deux phototransistors sur entrées RA0 et RA01 (pattes 15 et 16) ' distance entre les faisceaux (pour le coefficent indiqué ici) 1cm ' poussoir sur entrée RA07 (patte 14) pour choix de l'échelle ' la longueur du programme (2029 bytes) ne permet pas de mémoriser l'échelle dim text as string[16] dim txt as string[6] dim i as word dim j as byte dim k as byte dim m as longint main: CMCON = 7 ' pas d'entrée comparateur analogique TRISA = %11001111 ' initialisation port A en entrée TRISB = 0 ' initialisation port B en sortie k=87 ' initialisation par défaut à l'Echelle HO txt = "au 87e" boucleprincipale: Lcd_Config(PORTB,3,2,1,0,PORTB,4,6,5) Lcd_Cmd(LCD_CLEAR) Lcd_Cmd(LCD_CURSOR_OFF) text="Vitesse attente" Lcd_Out(1,1,text) Lcd_Out(2,1,txt) attente: if PORTA.7 = 0 then ' poussoir pour choix de l'échelle select case k case 22 k=43 txt = "au 43e" case 43 k = 87 txt = "au 87e" case 87 k = 160 txt = "au160e" case 160 k = 220 txt = "au220e" case 220 k = 22 txt = "au 22e" end select Lcd_Out(2,1,txt) delay_ms (500) end if i=0 ' initialisation compteur if PORTA.0 = 1 then ' coupure cellule entrée RA0 goto sens1 end if if PORTA.1 = 1 then ' coupure cellule entrée RA1 goto sens2 end if goto attente sens1: while PORTA.0 = 0 ' attente coupure cellule entrée RA0 i=i+1 ' comptage if i=65535 then goto depasse end if wend goto affiche sens2: while PORTA.0 = 0 ' attente coupure cellule entrée RA1 i=i+1 ' comptage if i=65535 then goto depasse end if wend goto affiche affiche: m=100000000/i ' coefficient pour 4cm (val. max.=2147483647) LongintToStr(m, text) for j = 6 to 9 ' on ne retient que les chiffres significatifs Lcd_Chr(1,j+3,text[j-1]) ' affichage valeur réelle en mm/s next j Lcd_Out(1,13,"mm/s") m=m*k ' conversion à l'échelle m=m*36 ' réduction en km/h LongintToStr(m, text) ' affichage valeur à l'échelle en km/h for j = 6 to 8 ' affichage sur 3 chiffres limité à 999 km/h Lcd_Chr(2,2+j,text[j-3]) next j Lcd_Chr(2,11,".") Lcd_Chr(2,12,text[6]) ' affichage 1 seul chiffre décimal Lcd_Out(2,13,"km/h") delay_ms(5000) ' affichage pendant 5 secondes goto boucleprincipale depasse: text=" Hors delais" ' le second faisceau n'a pas été coupé Lcd_Out(2,1,text) delay_ms(2000) ' affichage pendant 2 secondes goto boucleprincipale end.