unsigned long Lecture; unsigned long ResultLecture; unsigned long AffichageUnite; unsigned long AffichageDizaine; unsigned long AffichageCentaine; unsigned char RA1orRA2orRA3; void init() { TRISA = 0b00100000; // 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 } void interrupt() { if ((TMR0IF_bit == 1) && (RA1orRA2orRA3 == 0)) { LATA.RA1 = 0; LATA.RA2 = 0; LATA.RA0 = 0; RA1orRA2orRA3 = 1; TMR0L = 0x00; TMR0H = 0x00; TMR0IF_bit = 0; } if ((TMR0IF_bit == 1) && (RA1orRA2orRA3 == 1)) { LATA.RA2 = 0; LATA.RA0 = 0; LATA.RA1 = 0; RA1orRA2orRA3 = 2; TMR0L = 0x00; TMR0H = 0x00; TMR0IF_bit = 0; } if ((TMR0IF_bit == 1) && (RA1orRA2orRA3 == 2)) { LATA.RA0 = 0; LATA.RA1 = 0; LATA.RA2 = 0; RA1orRA2orRA3 = 0; TMR0L = 0x00; TMR0H = 0x00; TMR0IF_bit = 0; } } void AffichageSegmentsUnite(int ValeursUnite) { switch (ValeursUnite) { case 0 : LATD = 0b00111111; break; case 1 : LATD = 0b00000110; break; case 2 : LATD = 0b01011011; break; case 3 : LATD = 0b01001111; break; case 4 : LATD = 0b01100110; break; case 5 : LATD = 0b01101101; break; case 6 : LATD = 0b01111101; break; case 7 : LATD = 0b00000111; break; case 8 : LATD = 0b01111111; break; case 9 : LATD = 0b01101111; break; } } void AffichageSegmentsDizaine(int ValeursDizaine) { switch (ValeursDizaine) { case 0 : LATD = 0b00111111; break; case 1 : LATD = 0b00000110; break; case 2 : LATD = 0b01011011; break; case 3 : LATD = 0b01001111; break; case 4 : LATD = 0b01100110; break; case 5 : LATD = 0b01101101; break; case 6 : LATD = 0b01111101; break; case 7 : LATD = 0b00000111; break; case 8 : LATD = 0b01111111; break; case 9 : LATD = 0b01101111; break; } } void AffichageSegmentsCentaine(int ValeursCentaine) { switch (ValeursCentaine) { case 0 : LATD = 0b10111111; break; case 1 : LATD = 0b10000110; break; case 2 : LATD = 0b11011011; break; case 3 : LATD = 0b11001111; break; case 4 : LATD = 0b11100110; break; case 5 : LATD = 0b11101101; break; case 6 : LATD = 0b11111101; break; case 7 : LATD = 0b10000111; break; case 8 : LATD = 0b11111111; break; case 9 : LATD = 0b11101111; break; } } void Lecture_Vcons() { if (RA1orRA2orRA3 == 0) { LATA.RA0 = 1; // Lecture des unités AffichageUnite = (ResultLecture % 10) ; // on récupère le chiffre apres la virgule soit des unitées AffichageSegmentsUnite(AffichageUnite); } if (RA1orRA2orRA3 == 1) { LATA.RA1 = 1; // Lecture des dizaines AffichageDizaine = (ResultLecture / 10) % 10; AffichageSegmentsDizaine(AffichageDizaine); // On récupère le chiffre des dizaines } if (RA1orRA2orRA3 == 2) { LATA.RA2 = 1; // Lecture des centaines AffichageCentaine = ((ResultLecture / 100) % 10); AffichageSegmentsCentaine(AffichageCentaine); // On récupère le chiffre des centaines } } void main() { init(); while (1) { 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(); } }