program Afficheur_003; var Lecture : dWord; ResultLecture : dWord; AffichageUnite : dWord; AffichageDizaine : dWord; AffichageCentaine : dWord; RA1orRA2orRA3 : byte; procedure init(); begin TRISA := %00100000; // Le PORTA broche 5 configurée comme une entrée PORTA := 0x00; LATA := 0x00; TRISD := 0x00; PORTD := 0x00; LATD := 0x00; CMCON := 0x07; // On désactive le module de comparaison ADON_bit := 1; // On active le module en convertisseur analogique numérique CHS0_bit := 0; // | CHS1_bit := 0; // | On configure la broche 5 (RA5) CHS2_bit := 1; // | en mode analogique/numérique (A/N) CHS3_bit := 0; // | ADC_Init(); TMR0ON_bit := 1; // On Active le Timer 0 T08BIT_bit := 0; // On règle le Timer 0 en 8 bits T0CS_bit := 0; // On utilise l'horloge en interne et non la PIN T0CKI PSA_bit := 0; // Le prescaler est assigné T0PS0_bit := 0; // | T0PS1_bit := 0; // | Prescaler réglé sur 1:2 T0PS2_bit := 0; // | GIE_bit := 1; // On active les interrutpions générales TMR0IE_bit := 1; // On active l'interruption du Timer0 sur débordement TMR0IF_bit := 0; // Drapeau de débordement baissé TMR0L := 0; // TMR0L mis à zéro TMR0H := 0; // TMR0H luis aussi mis à zéro pour commencer à compter RA1orRA2orRA3 := 0; // Permet d'activer Q1 Q2 ou Q3 end; procedure interrupt(); begin if ((TMR0IF_bit = 1) and (RA1orRA2orRA3 = 0)) then begin LATA.RA1 := 0; LATA.RA2 := 0; LATA.RA0 := 0; RA1orRA2orRA3 := 1; TMR0L := 0x00; TMR0H := 0x00; TMR0IF_bit := 0; end; if ((TMR0IF_bit = 1) and (RA1orRA2orRA3 = 1)) then begin LATA.RA2 := 0; LATA.RA0 := 0; LATA.RA1 := 0; RA1orRA2orRA3 := 2; TMR0L := 0x00; TMR0H := 0x00; TMR0IF_bit := 0; end; if ((TMR0IF_bit = 1) and (RA1orRA2orRA3 = 2)) then begin LATA.RA0 := 0; LATA.RA1 := 0; LATA.RA2 := 0; RA1orRA2orRA3 := 0; TMR0L := 0x00; TMR0H := 0x00; TMR0IF_bit := 0; end; end; procedure AffichageSegmentsUnite(ValeursUnite : Word); begin case ValeursUnite of 0 : LATD := %00111111; 1 : LATD := %00000110; 2 : LATD := %01011011; 3 : LATD := %01001111; 4 : LATD := %01100110; 5 : LATD := %01101101; 6 : LATD := %01111101; 7 : LATD := %00000111; 8 : LATD := %01111111; 9 : LATD := %01101111; end; end; procedure AffichageSegmentsDizaine(ValeursDizaine : word); begin case (ValeursDizaine) of 0 : LATD := %00111111; 1 : LATD := %00000110; 2 : LATD := %01011011; 3 : LATD := %01001111; 4 : LATD := %01100110; 5 : LATD := %01101101; 6 : LATD := %01111101; 7 : LATD := %00000111; 8 : LATD := %01111111; 9 : LATD := %01101111; end; end; procedure AffichageSegmentsCentaine(ValeursCentaine : Word); begin case (ValeursCentaine) of 0 : LATD := %10111111; 1 : LATD := %10000110; 2 : LATD := %11011011; 3 : LATD := %11001111; 4 : LATD := %11100110; 5 : LATD := %11101101; 6 : LATD := %11111101; 7 : LATD := %10000111; 8 : LATD := %11111111; 9 : LATD := %11101111; end; end; procedure Lecture_Vcons(); begin if (RA1orRA2orRA3 = 0) then begin LATA.RA0 := 1; // Lecture des unités AffichageUnite := (ResultLecture MOD 10) ; // on récupère le chiffre apres la virgule soit des unitées AffichageSegmentsUnite(AffichageUnite); end; if (RA1orRA2orRA3 = 1) then begin LATA.RA1 := 1; // Lecture des dizaines AffichageDizaine := (ResultLecture / 10) MOD 10; AffichageSegmentsDizaine(AffichageDizaine); // On récupère le chiffre des dizaines end; if (RA1orRA2orRA3 = 2) then begin LATA.RA2 := 1; // Lecture des centaines AffichageCentaine := ((ResultLecture / 100) MOD 10); AffichageSegmentsCentaine(AffichageCentaine); // On récupère le chiffre des centaines end; end; begin init(); while true do begin Lecture := ADC_Get_Sample(4) * 100 ; // On mutliplie par 100 afin d'avoir 2 chiffres après la virgule ResultLecture := ((Lecture * 5) / 1023); Lecture_Vcons(); end; end.