/*****************************************************************
*        PWM Logiciel ~~Commande LED RGB sans interrup.~~
*        MikroC Pro
*        PIC 16F876A
*        Quartz 16 Mhz - Fusibles par defaut -
*
*
*                 FB Aka Hearty, 2010
******************************************************************/


// Attribution port vers LED

sbit Rouge at RB0_bit;
sbit Vert at RB1_bit;
sbit Bleu at RB2_bit;


sbit Rouge_Direction at TRISB0_bit;
sbit Vert_Direction at TRISB1_bit;
sbit Bleu_Direction at TRISB2_bit;


int i = 0 ,Compteur_PWM = 2000;   //Permet de changer la vitesse de transition


void Delay(int temps);
void Rouge_haut(void);
void Rouge_bas(void);
void Vert_haut(void);
void Vert_bas(void);
void Bleu_haut(void);
void Bleu_bas(void);

//Définition des PWM montants et descendants pour chaque couleur

void Rouge_haut(void){              // Rouge montant
  for (i = 0; i < Compteur_PWM; i++)
 {

  Rouge = 0;
  Delay(Compteur_PWM - i);

  Rouge = 1;
  Delay(i);
  }
}
void Rouge_bas(void){           // Rouge descendant
   for (i = 0; i < Compteur_PWM; i++)
 {

  Rouge = 1;
  Delay(Compteur_PWM - i);

  Rouge = 0;
  Delay(i);
  }
}
void Vert_haut(void){           // Vert montant
   for (i = 0; i < Compteur_PWM; i++)
 {

  Vert = 0;
  Delay(Compteur_PWM - i);

  Vert = 1;
  Delay(i);
  }
}
void Vert_bas(void){          // Vert descendant
  for (i = 0; i < Compteur_PWM; i++)
 {

  Vert = 1;
  Delay(Compteur_PWM - i);

  Vert = 0;
  Delay(i);
  }
}
void Bleu_haut(void){             // Bleu montant
  for (i = 0; i < Compteur_PWM; i++)
 {

  Bleu = 0;
  Delay(Compteur_PWM - i);

  Bleu = 1;
  Delay(i);
  }
}
void Bleu_bas(void){          // Bleu descendant
   for (i = 0; i < Compteur_PWM; i++)
 {

  Bleu = 1;
  Delay(Compteur_PWM - i);

  Bleu = 0;
  Delay(i);
  }
}

void Delay(int temps)
{
 while(temps>100)
 temps--;
}


// Programme principal

void main(void)
{
 CMCON  |= 7;                     //  Comparateur desactivé
 TRISA = 0;
 PORTA = 0;
 TRISB = 0;
 PORTB = 0;

while(1){

// Mise en place des combinaisons de couleurs montantes et descendantes
// en modifiants l'ordre on peut ainsi déterminer les séquences de couleurs
// que l'on désire.
// Pour permettre de boucler les couleurs sans extinction
// on démarre par une des couleurs à l'état haut

   Rouge=1;
   Delay_ms(1000);              //rouge

   Bleu_haut();
   Delay_ms(1000);              //magenta
   
   Rouge_bas();
   Delay_ms(1000);              //bleu
   
   Vert_haut();
   Delay_ms(1000);              //cyan
   
   Bleu_bas();
   Delay_ms(1000);             //vert

   Rouge_haut();
   Delay_ms(1000);             //jaune

   Bleu_haut();
   Delay_ms(1000);             //blanc

   Vert_bas();
   Bleu_bas();
   

}
}