Bonjour
Je souhaiterai votre aide pour m'aider à comprendre un programme en C .
Je suis plutôt pressé et je ne connais pas ce language vu qu'il ne fait pas parti du programme.



/****************************** ***********************
Project : Store Somfy
Version : 1.0
Date : 11-04-2008
Author : SOUSSI.T.
Company : Lycée DURZY
Comments:
Chip type : ATmega8535
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
****************************** ***********************/

#include <mega8535.h> // Registres uC
#include <delay.h> / / contient la fonction delay_ms
#include <lcd4bits2cd.h>
#define Bas ~PINA.4 //Capteur bas
#define Haut ~PINA.5 //Capteur haut
#define Monter PORTC&=0xD0 //Active la monter du store
#define Descendre PORTC&=0xE0 //Active la descente du store
#define Arreter PORTC|=0x30

unsigned int VITESSE=0,VitVent=0,Soleil=0;
char moy=0,touche=0,scan=0;
eeprom char SeuilVent=50,SeuilSoleil=50,te mpoVent=3,tempoSoleil=3;
bit PremierFront=1,auto=1,tropdeve nt=0,tropdesoleil=0,menu2actif =0;

void init(void)
{
char a;
DDRA = 0x80; // PA7 -> S, PA7..0 -> E
DDRB = 0xFF; // PB7..PB0 -> S
DDRC = 0xF0; // PC7..PC4 -> S, PC3..0 -> E
PORTC = 0xF0; //
DDRD = 0xFA; // PD7..PD3 et PD1 -> S, PD2 et PD0 -> E
PORTD=0x00;

ADCSRA = 0x85; // Initialisation du CAN clk=horloge/32
ACSR=0x80; // Analog Comparator off

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=0x07;
TCNT2=0x00;

// InitUart(); // Appel de la procédure d'initialisation de la communication Série
#asm("cli");

#asm("sei");

Lcd_Init(); // Appel de la procédure d'initialisation de l'écran LCD

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;

// Activation interruption timer
TIMSK=0x41;

TCNT1L=0;
TCNT1H=0;

// Global enable interrupts
#asm("sei")

a=tempoVent*32; // initialise les tempos Vent et Soleil stockées en Eeprom
OCR1AH=a-1;
OCR1AL=0xFF;
a=tempoSoleil*32;
OCR1BH=a-1;
OCR1BL=0xFF;
}

/******** Fonction de Conversion A/N de la voie sélectionnée *****/
unsigned int AdcRead(unsigned char input)
{
ADMUX=input; //N° de la voie
ADCSRA = ADCSRA | (1<<6); // Mise à 1 du bit ADSC (start conversion)
while ((ADCSRA & 0x10)==0); // Attente que le bit ADIF soit à 1 (Interrup Flag >> Fin de conversion)
ADCSRA = ADCSRA | (1<<4); // Mise à 0 du bit ADIF (en écrivant un 1 dessus)
return ADCW; // renvoie la valeur de conversion
}


// Calcul de la vitesse en km/h
unsigned int CALCUL_VITESSE (unsigned int a)
{
a = 1875/a;
return(a);
}
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
while(ASSR!=0);
TCCR1B=0x00;
TCNT1L=0;
TCNT1H=0;
if(tropdevent) //Montée si encore du vent au bout de la tempo vent
{
Monter;
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("**** Auto ****");
Lcd_Home2();
Lcd_PutS_p(" Montee ");
while(!Haut);
};
Arreter;
TIMSK=0x41;
}

// Timer 1 output compare B interrupt service routine
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
TCCR1B=0x00;
TCNT1L=0;
TCNT1H=0;
if ((!tropdesoleil)&&(!Haut)) //Descente/Montée si présence/absence du Soleil au bout de la tempo Soleil
{
Monter;
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("**** Auto ****");
Lcd_Home2();
Lcd_PutS_p(" Montee ");
while(!Haut);
};
if ((tropdesoleil)&&(!Bas))
{
Descendre;
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("**** Auto ****");
Lcd_Home2();
Lcd_PutS_p(" Descente ");
while(!Bas);
};
Arreter;
TIMSK=0x41;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
VITESSE =0;
PremierFront=1;
moy=0;
VitVent=0;
TCCR0=0x00; //Désactive Timer/Counter 0
TCNT0=0;
}

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (PremierFront)
{
TCNT0=0;
TCCR0=0x05; // Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
PremierFront=0;
}
else
{
VITESSE += TCNT0;
VITESSE/=2; // on moyenne la valeur N sur 10 périodes
moy++;
PremierFront=1;
};
if (moy==10)
{
VitVent=CALCUL_VITESSE(VITESSE ); // Convertir N en Km/h
if (VitVent>SeuilVent)tropdevent= 1; else tropdevent=0;
moy=0;
};
}


void acquerirSoleil(void) //Active la scrutation du clavier tous les 30ms
{
Soleil = AdcRead(0);
if (Soleil>SeuilSoleil)tropdesole il=1; else tropdesoleil=0;
}

void EcrireSeuilVent(void)
{
do
{
touche=0;
Lcd_Clear();
Lcd_PutS_p("Seuil Vent: ");
Lcd_PutUInt(SeuilVent);
Lcd_Home2();
Lcd_PutS_p("+:S2 -:S1 Fin:S3 ");
delay_ms(100);
if ((touche==2)&&(SeuilVent < 120)) SeuilVent++;
if ((touche==1)&&(SeuilVent > 20)) SeuilVent--;
}
while (touche!=3);
touche=0;
}

void EcrireSeuilSoleil(void)
{
do
{
touche=0;
Lcd_Clear();
Lcd_PutS_p("Seuil Soleil: ");
Lcd_PutUInt(SeuilSoleil);
Lcd_Home2();
Lcd_PutS_p("+:S2 -:S1 Fin:S3 ");
delay_ms(100);
if ((touche==2)&&(SeuilSoleil < 120)) SeuilSoleil++ ;
if ((touche==1)&&(SeuilSoleil > 20)) SeuilSoleil--;
}
while (touche!=3);
touche=0;
}

void EcrireTempoVent(void)
{
char a;
do
{
touche=0;
Lcd_Clear();
Lcd_PutS_p("Tempo Vent: ");
Lcd_PutUInt(tempoVent);
Lcd_Home2();
Lcd_PutS_p("+:S2 -:S1 Fin:S3 ");
delay_ms(100);
if ((touche==2)&&(tempoVent < 8)) tempoVent++;
if ((touche==1)&&(tempoVent > 2)) tempoVent--;
}
while (touche!=3);
touche=0;
a=tempoVent*32;
OCR1AH=a-1;
OCR1AL=0xFF;
}

void EcrireTempoSoleil(void)
{
char a;
do
{
touche=0;
delay_ms(200);
Lcd_Clear();
Lcd_PutS_p("Seuil Soleil: ");
Lcd_PutUInt(tempoSoleil);
Lcd_Home2();
Lcd_PutS_p("+:S2 -:S1 Fin:S3 ");
delay_ms(100);
if ((touche==2)&&(tempoSoleil < 8)) tempoSoleil++ ;
if ((touche==1)&&(tempoSoleil > 2)) tempoSoleil--;
}
while (touche!=3);
touche=0;
a=tempoSoleil*32;
OCR1BH=a-1;
OCR1BL=0xFF;
}
void ProgrammePrincipal (void)
{

if (tropdevent&&(!Haut)&&(TIMSK!= 0x51)) //Lance la Tempo Vent détecté (prioritaire sur la tempo soleil)
{
TCNT1L=0; // Mode: Normal top=FFFFh
TCNT1H=0; // Clock value: 7,813 kHz
TIMSK=0x51;
TCCR1B=0x05;
};

if(auto&&(!tropdevent)&&(TIMSK ==0x41)) // Lance la Tempo Soleil détecté en mode Auto uniquement
// On s'assure ici que l'on n'a pas lancé la tempo du vent
{
if ((!tropdesoleil)&&(!Haut))
{

TCNT1L=0;
TCNT1H=0;
TIMSK=0x49;
TCCR1B=0x05;
};
if((tropdesoleil)&&(!Bas))
{
TCNT1L=0;
TCNT1H=0;
TIMSK=0x49;
TCCR1B=0x05;
};
};

if((!auto)&&(!menu2actif)) //Mode manuel désactivé dans le menu 2
{
if ((touche==4)&&(!Haut)) // remontée du Store inconditionnelle
{
Monter;
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("**** Manu ****");
Lcd_Home2();
Lcd_PutS_p(" Montee ");
while(!Haut);
};
if ((touche==3)&&(!tropdevent)&&( !Bas)) //Descente du Store si pas de Vent
{
Descendre;
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("**** Manu ****");
Lcd_Home2();
Lcd_PutS_p(" Descente ");
while(!Bas);
};
Arreter;
};

}

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
scan++;
if(scan==3)
{
touche =PINC&0x0F; // scan toutes les 96ms (3*32ms) d'une touche et affectation du n° S1, S2 ..
if (touche == 4) touche =3; // (les autres combinaisons peuvent être testées avec la valeur de touche)
if (touche == 8) touche =4;
scan=0;
};
acquerirSoleil(); // mise à jour de la valeur ensoleillement
ProgrammePrincipal(); // execution du programme du Store par interruption toutes les 32ms
PORTC.6=~tropdesoleil;
PORTC.7=~tropdevent;
}

void menuTempo(void)
{
unsigned int j;
bit S3=0;
touche=0;
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("Vent/Soleil : S3");
Lcd_Home2();
Lcd_PutS_p(" Retour : S4 ");
delay_ms(2000);
do
{

if(!S3)
{
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("Tempo Vent : S1");
for (j=0;j<15;j++)
{
Lcd_Home2();
Lcd_PutS_p("Tempo = ");
Lcd_PutUInt(tempoVent);
Lcd_PutS_p("s");
};
};
if(S3)
{
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("Tempo Soleil: S1");
for (j=0;j<15;j++)
{
Lcd_Home2();
Lcd_PutS_p("Tempo = ");
Lcd_PutUInt(tempoSoleil);
Lcd_PutS_p("s");
};
};
delay_ms(100);
if (touche==1)
{
if (S3) EcrireTempoSoleil();
else EcrireTempoVent();
touche=0;
};
if (touche==3) {S3=!S3;touche=0;};
}
while (touche!=4);
}


void menu2(void)
{
unsigned int j;
bit S3=0;
menu2actif =1;
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("Vent/Soleil : S3");
Lcd_Home2();
Lcd_PutS_p(" Retour : S4 ");
delay_ms(2000);
do
{

if(!S3)
{
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("Seuil Vent : S1");
for (j=0;j<15;j++)
{
Lcd_Home2();
Lcd_PutS_p("Vitesse= ");
Lcd_PutUInt(VitVent);
Lcd_PutS_p("km/h ");
};
};
if(S3)
{
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p("Seuil Soleil: S1");
for (j=0;j<15;j++)
{
Lcd_Home2();
Lcd_PutS_p("Soleil= ");
Lcd_PutUInt(Soleil);
Lcd_PutS_p("kLux ");
};
};
delay_ms(100);
if (touche==1)
{
if (S3) EcrireSeuilSoleil();
else EcrireSeuilVent();
};
if (touche==3) {S3=!S3;};
}
while (touche!=4);
menu2actif=0;
}


void menu(void)
{
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p (" Menu:S1");
Lcd_Home2();
if (auto)Lcd_PutS_p("Manu:S2 Tempo:S3"); else Lcd_PutS_p("Auto:S2 Tempo:* ");
delay_ms(100);
if (touche==1) menu2();
if (touche==2) auto=~auto;
if ((touche==3)&&auto) menuTempo();

}

void main(void)
{
init();
Lcd_Clear();
Lcd_Home();
Lcd_PutS_p(" LYCEE DURZY ");
Lcd_Home2();
Lcd_PutS_p(" Store Somfy ");
delay_ms(2000);

while (1)
{
menu();
};
}