/**************************************************************************
*             Exercice de démultiplication de port via 74HC595            *
*             Sortie sur 24 LEDs.          PIC16F876A  MikroC             *
*             3 Ports pour 24 sorties avec 3x 74HC595                     *
*              Chaque circuit ajouté permet 8 ports supplémentaires       *
*                     FB Aka Hearty Juillet 2010                          *
**************************************************************************/

//*****************
//Déclaration des variables
int i,vitesse;
char HC595_0,HC595_1,HC595_2;

// Tableau de figure sur 8 bits installés en ROM
const char sequence[]={
    0b00000000, 0b00000000, 0b00000000,
    0b00000000, 0b00000000, 0b00000001, // LED allumée = 1 -- HC595_0, HC595_1, HC595_2
    0b00000000, 0b00000000, 0b00000010,
    0b00000000, 0b00000000, 0b00000100,
    0b00000000, 0b00000000, 0b00001000,
    0b00000000, 0b00000000, 0b00010000,
    0b00000000, 0b00000000, 0b00100000,
    0b00000000, 0b00000000, 0b01000000,
    0b00000000, 0b00000000, 0b10000000,
    0b00000000, 0b00000001, 0b00000000,
    0b00000000, 0b00000010, 0b00000000,
    0b00000000, 0b00000100, 0b00000000,
    0b00000000, 0b00001000, 0b00000000,
    0b00000000, 0b00010000, 0b00000000,
    0b00000000, 0b00100000, 0b00000000,
    0b00000000, 0b01000000, 0b00000000,
    0b00000000, 0b10000000, 0b00000000,
    0b00000001, 0b00000000, 0b00000000,
    0b00000010, 0b00000000, 0b00000000,
    0b00000100, 0b00000000, 0b00000000,
    0b00001000, 0b00000000, 0b00000000,
    0b00010000, 0b00000000, 0b00000000,
    0b00100000, 0b00000000, 0b00000000,
    0b01000000, 0b00000000, 0b00000000,
    0b10000000, 0b00000000, 0b00000000
      };
//******************************************************************************
//Interruption
void interrupt() {
  vitesse++;
  TMR0   = 0;             // Valeur décimale préchargée à soustraire à 256
//********************
//Désactive l'interruption TMR0   (0xA0 = active)
  INTCON = 0x20;         // Set T0IE, clear T0IF (Met à 1 le bit TMROIE , Efface(0) le Flag TMROIF de débordement d'interruption)
                 }       //fin interruption

//******************************************************************************


void send_data(char HC595_0, char HC595_1, char HC595_2)
{
  Spi_Write(HC595_0);     // données premier circuit
  Spi_Write(HC595_1);     // données deuxième circuit
  Spi_Write(HC595_2);     // données troisième circuit
  PORTC.F6=1;             // impulsion de validation sur LATCH
  PORTC.F6=0;
}
//******************************************************************************
// Programme principal
void main(){

  INTCON=0xA0;                      // Activer l'interruption TMR0
  OPTION_REG = 0x00;                // Assigner prescaler sur TMR0  valeur 2   = 000
  TMR0=0;
  ADCON0=0;                         // ADC désactivé
  TRISA=1;                          // PORTA configuré en Entrée
  TRISB=0;                          // PORTB configuré en sortie
  TRISC=0;                          // PORTC configuré en sortie
  PORTA=0;                          // mise à zéro des ports A
  PORTB=0;                          // mise à zéro des ports B
  PORTC=0;                          // mise à zéro des ports C
  vitesse=0;                        // vitesse de défilement
  i=0;

//Paramètre de configuration des ports pour la gestion du 74HC595
  Spi_Init_Advanced(MASTER_OSC_DIV16,DATA_SAMPLE_MIDDLE,CLK_IDLE_LOW,LOW_2_HIGH);

//******************************************************************************
//boucle infinie
      while(1)
             {
            if(vitesse==512){
            vitesse=0;
             if(i==24)           // compteur sur la totalité des octets du tableau
              {
                i=0;
                 }  // fin de If
                  i++;
              HC595_0=sequence[i*3];       // données sur le premier 595
              HC595_1=sequence[(i*3)+1];   // données sur le second 595
              HC595_2=sequence[(i*3)+2];   // données sur le troisième 595
              send_data(HC595_0,HC595_1,HC595_2);   // envoie les données à afficher


                          } // fin de If

           }  //fin de while
           
}  // fin de main

//***************************************************************************