/**************************************************************************
*                Journal lumineux via 74HC595 3 matrices 8x8 LED          *
*                     Quartz 20Mhz         PIC16F876A  MikroC Pro         *
*                            - fusibles par defaut -                      *
*                 4 Ports pour la gestion totale de l'affichage           *
*                        FB Aka Hearty Juillet/Aout 2010                  *
**************************************************************************/
#define Latch PORTC.F6
//*****************
//Déclaration des variables
int i,rafraichir,dat,vitesse;
char HC595_0,HC595_1,HC595_2;

// Tableau de caractères sur 8 bits installés en ROM

const unsigned short ASCII[] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x00, 0x00, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x00,  // Code pour char !
        0x00, 0x24, 0x7E, 0x24, 0x24, 0x7E, 0x24, 0x00,  // Code pour char #
        0x00, 0x26, 0x49, 0x49, 0xFF, 0x49, 0x32, 0x00,  // Code pour char $
        0x00, 0x46, 0x26, 0x10, 0x08, 0x64, 0x62, 0x00,  // Code pour char %
        0x00, 0x70, 0x8E, 0x89, 0x99, 0x76, 0xC0, 0x00,  // Code pour char &
        0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char '
        0x00, 0x7E, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char (
        0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x7E, 0x00,  // Code pour char )
        0x00, 0x00, 0x0A, 0x04, 0x0A, 0x00, 0x00, 0x00,  // Code pour char *
        0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x00,  // Code pour char +
        0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00,  // Code pour char ,
        0x00, 0x00, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00,  // Code pour char -
        0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00,  // Code pour char .
        0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,  // Code pour char /
        0x00, 0x7E, 0xC1, 0xB1, 0x8D, 0x83, 0x7E, 0x00,  // Code pour char 0
        0x00, 0x04, 0x02, 0x01, 0xFF, 0x00, 0x00, 0x00,  // Code pour char 1
        0x00, 0xE6, 0x91, 0x91, 0x89, 0x89, 0x86, 0x00,  // Code pour char 2
        0x00, 0x42, 0x81, 0x89, 0x89, 0x89, 0x76, 0x00,  // Code pour char 3
        0x00, 0x30, 0x28, 0x24, 0x22, 0xFF, 0x20, 0x00,  // Code pour char 4
        0x00, 0x4F, 0x89, 0x89, 0x89, 0x89, 0x71, 0x00,  // Code pour char 5
        0x00, 0x7E, 0x89, 0x89, 0x89, 0x89, 0x72, 0x00,  // Code pour char 6
        0x00, 0x01, 0x01, 0xF1, 0x09, 0x05, 0x03, 0x00,  // Code pour char 7
        0x00, 0x76, 0x89, 0x89, 0x89, 0x89, 0x76, 0x00,  // Code pour char 8
        0x00, 0x4E, 0x91, 0x91, 0x91, 0x91, 0x7E, 0x00,  // Code pour char 9
        0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00,  // Code pour char :
        0x00, 0x00, 0x80, 0x68, 0x00, 0x00, 0x00, 0x00,  // Code pour char ;
        0x00, 0x00, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00,  // Code pour char <
        0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00,  // Code pour char =
        0x00, 0x00, 0x00, 0x44, 0x28, 0x10, 0x00, 0x00,  // Code pour char >
        0x00, 0x06, 0x01, 0xB1, 0x09, 0x09, 0x06, 0x00,  // Code pour char ?
        0x00, 0x7E, 0x99, 0xA5, 0xA5, 0xB9, 0x5E, 0x00,  // Code pour char @
        0x00, 0xE0, 0x1C, 0x13, 0x13, 0x1C, 0xE0, 0x00,  // Code pour char A
        0x00, 0xFF, 0x89, 0x89, 0x89, 0x8E, 0x70, 0x00,  // Code pour char B
        0x00, 0x7E, 0x81, 0x81, 0x81, 0x81, 0x42, 0x00,  // Code pour char C
        0x00, 0xFF, 0x81, 0x81, 0x81, 0x42, 0x3C, 0x00,  // Code pour char D
        0x00, 0xFF, 0x89, 0x89, 0x89, 0x81, 0x81, 0x00,  // Code pour char E
        0x00, 0xFF, 0x09, 0x09, 0x09, 0x01, 0x01, 0x00,  // Code pour char F
        0x00, 0x7E, 0x81, 0x91, 0x91, 0x51, 0xF2, 0x00,  // Code pour char G
        0x00, 0xFF, 0x08, 0x08, 0x08, 0x08, 0xFF, 0x00,  // Code pour char H
        0x00, 0x00, 0x81, 0xFF, 0x81, 0x00, 0x00, 0x00,  // Code pour char I
        0x00, 0x60, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x00,  // Code pour char J
        0x00, 0xFF, 0x08, 0x18, 0x24, 0x42, 0x81, 0x00,  // Code pour char K
        0x00, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,  // Code pour char L
        0x00, 0xFF, 0x02, 0x0C, 0x0C, 0x02, 0xFF, 0x00,  // Code pour char M
        0x00, 0xFF, 0x03, 0x0C, 0x30, 0xC0, 0xFF, 0x00,  // Code pour char N
        0x00, 0x7E, 0x81, 0x81, 0x81, 0x81, 0x7E, 0x00,  // Code pour char O
        0x00, 0xFF, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00,  // Code pour char P
        0x00, 0x7E, 0x81, 0x81, 0xA1, 0x41, 0xBE, 0x00,  // Code pour char Q
        0x00, 0xFF, 0x09, 0x09, 0x09, 0x39, 0xC6, 0x00,  // Code pour char R
        0x00, 0x46, 0x89, 0x89, 0x89, 0x89, 0x72, 0x00,  // Code pour char S
        0x00, 0x00, 0x01, 0x01, 0xFF, 0x01, 0x01, 0x00,  // Code pour char T
        0x00, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x00,  // Code pour char U
        0x00, 0x0F, 0x30, 0xC0, 0xC0, 0x30, 0x0F, 0x00,  // Code pour char V
        0x00, 0x7F, 0x80, 0x70, 0x70, 0x80, 0x7F, 0x00,  // Code pour char W
        0x00, 0x07, 0x08, 0xF0, 0xF0, 0x08, 0x07, 0x00,  // Code pour char Y
        0x00, 0xC1, 0xA1, 0x91, 0x89, 0x85, 0x83, 0x00,  // Code pour char Z
        0x00, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char [
        0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00,  // Code pour char BackSlash
        0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xFF, 0x00,  // Code pour char ]
        0x00, 0x00, 0x04, 0x02, 0x02, 0x04, 0x00, 0x00,  // Code pour char ^
        0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00,  // Code pour char _
        0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,  // Code pour char `
        0x00, 0x00, 0x20, 0x54, 0x54, 0x78, 0x00, 0x00,  // Code pour char a
        0x00, 0x00, 0x7E, 0x48, 0x48, 0x30, 0x00, 0x00,  // Code pour char b
        0x00, 0x00, 0x38, 0x44, 0x44, 0x28, 0x00, 0x00,  // Code pour char c
        0x00, 0x00, 0x30, 0x48, 0x48, 0x7E, 0x00, 0x00,  // Code pour char d
        0x00, 0x00, 0x38, 0x54, 0x54, 0x58, 0x00, 0x00,  // Code pour char e
        0x00, 0x00, 0x7C, 0x0A, 0x0A, 0x02, 0x00, 0x00,  // Code pour char f
        0x00, 0x00, 0x18, 0xA4, 0xA8, 0x7C, 0x00, 0x00,  // Code pour char g
        0x00, 0x00, 0x7E, 0x08, 0x08, 0x70, 0x00, 0x00,  // Code pour char h
        0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x00,  // Code pour char i
        0x00, 0x00, 0x80, 0x80, 0x7A, 0x00, 0x00, 0x00,  // Code pour char j
        0x00, 0x00, 0x7E, 0x10, 0x28, 0x40, 0x00, 0x00,  // Code pour char k
        0x00, 0x00, 0x00, 0x7E, 0x40, 0x00, 0x00, 0x00,  // Code pour char l
        0x00, 0x7C, 0x08, 0x04, 0x78, 0x04, 0x78, 0x00,  // Code pour char m
        0x00, 0x00, 0x7C, 0x08, 0x04, 0x78, 0x00, 0x00,  // Code pour char n
        0x00, 0x00, 0x38, 0x44, 0x44, 0x38, 0x00, 0x00,  // Code pour char o
        0x00, 0x00, 0xFC, 0x28, 0x24, 0x18, 0x00, 0x00,  // Code pour char p
        0x00, 0x00, 0x18, 0x24, 0x28, 0xFC, 0x00, 0x00,  // Code pour char q
        0x00, 0x00, 0x7C, 0x08, 0x04, 0x08, 0x00, 0x00,  // Code pour char r
        0x00, 0x00, 0x08, 0x54, 0x54, 0x20, 0x00, 0x00,  // Code pour char s
        0x00, 0x00, 0x3E, 0x48, 0x40, 0x00, 0x00, 0x00,  // Code pour char t
        0x00, 0x00, 0x3C, 0x40, 0x40, 0x3C, 0x00, 0x00,  // Code pour char u
        0x00, 0x00, 0x1C, 0x60, 0x60, 0x1C, 0x00, 0x00,  // Code pour char v
        0x00, 0x3C, 0x40, 0x70, 0x70, 0x40, 0x3C, 0x00,  // Code pour char w
        0x00, 0x00, 0x6C, 0x10, 0x10, 0x6C, 0x00, 0x00,  // Code pour char x
        0x00, 0x00, 0x0C, 0x90, 0x90, 0x7C, 0x00, 0x00,  // Code pour char y
        0x00, 0x00, 0x64, 0x54, 0x54, 0x4C, 0x00, 0x00,  // Code pour char z
        0x00, 0x00, 0x08, 0x76, 0x81, 0x00, 0x00, 0x00,  // Code pour char {
        0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,  // Code pour char |
        0x00, 0x00, 0x00, 0x81, 0x76, 0x08, 0x00, 0x00,  // Code pour char }
        0x00, 0x00, 0x10, 0x08, 0x10, 0x08, 0x00, 0x00,  // Code pour char ~    94 lignes
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x00, 0xFF, 0x08, 0x08, 0x08, 0x08, 0xFF, 0x00,  // Code pour char H
        0x00, 0xFF, 0x89, 0x89, 0x89, 0x81, 0x81, 0x00,  // Code pour char E
        0x00, 0xE0, 0x1C, 0x13, 0x13, 0x1C, 0xE0, 0x00,  // Code pour char A
        0x00, 0xFF, 0x09, 0x09, 0x09, 0x39, 0xC6, 0x00,  // Code pour char R
        0x00, 0x00, 0x01, 0x01, 0xFF, 0x01, 0x01, 0x00,  // Code pour char T
        0x00, 0x07, 0x08, 0xF0, 0xF0, 0x08, 0x07, 0x00,  // Code pour char Y
        0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00,  // Code pour char .
        0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00,  // Code pour char .
        0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00,  // Code pour char . 832
        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  // Code pour char .
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x0E, 0x1F, 0x3E, 0xFC, 0xFC, 0x3E, 0x1F, 0x0E,  // Code for char  ----
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x08, 0x1C, 0x8A, 0xFF, 0xFF, 0x8A, 0x1C, 0x08,  // Code for char !
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x3C, 0x6E, 0xDB, 0xDF, 0xDF, 0xDB, 0x6E, 0x3C,  // Code for char "
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,  // Code for char #
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x00, 0x32, 0x62, 0x60, 0x60, 0x62, 0x32, 0x00,  // Code for char $
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x80, 0x60, 0x7E, 0xFF, 0xFF, 0x7E, 0x60, 0x80,  // Code for char %
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0xFF, 0x81, 0xBD, 0xA5, 0xA5, 0xBD, 0x81, 0xFF,  // Code for char &
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x00, 0x7E, 0x42, 0x5A, 0x5A, 0x42, 0x7E, 0x00,  // Code for char '
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code pour char Espace
         };


//******************************************************************************
//Interruption
void interrupt() {
  rafraichir++;
  vitesse++;
  TMR0   = 240;             // Valeur décimale préchargée à soustraire à 256

//Désactive l'interruption TMR0   (0xA0 = active)
  INTCON = 0x20;         // 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)
{
  Spi1_Write(HC595_0);     // données premier circuit
  Spi1_Write(HC595_1);     // données deuxième circuit
  Spi1_Write(HC595_2);     // données troisième circuit
  Latch=1;                // impulsion de validation sur LATCH
  Latch=0;

}
//******************************************************************************

void test()
{              portc=0;
if(rafraichir>=10){
if (vitesse>=3000){  // vitesse de défilement
              dat++; // scrolling caractères
              vitesse=0;

            }

                    rafraichir=0;
                    RB0_bit=1;       // d'impulsion de l'entrée clock
                    RB0_bit=0;       // du 4017

             if(i>=8)           // compteur sur la totalité des octets du tableau
              {
                i=0;
                 RB1_bit=1;     // RAZ clock 4017
                 RB1_bit=0;
                 }  // fin de If
                  i++;

              HC595_0=ASCII[i+dat];       // données sur le premier 595
              HC595_1=ASCII[(i+8)+dat];   // données sur le second 595
              HC595_2=ASCII[(i+16)+dat];   // données sur le troisième 595
              send_data(HC595_0,HC595_1,HC595_2);   // envoie les données à afficher
              Delay_ms(1);

                          } // fin de If
           if(dat>=972)     // Lorsqu'on arrive au dernier caractère
                    {
                        dat=0;   // on revient au début du tableau

                    }



}

//******************************************************************************
// 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
  rafraichir=0;                     // rafraichissement des caractères
  i=0;
  dat=0;                            //initialisation du tableau de caractère

//Paramètre de configuration des ports pour la gestion du 74HC595
  Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4,_SPI_DATA_SAMPLE_MIDDLE,_SPI_CLK_IDLE_HIGH,_SPI_LOW_2_HIGH);
  
//******************************************************************************
//boucle infinie
      while(1)

             {
             test();
            
           }  //fin de while

}  // fin de main

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