/**************************************************************************
* 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
//***************************************************************************