Comme promis dans le précédent article, je publie aujourd'hui le code source utilisé dans le microcontrôlleur.
Vous prendrez note que celui-ci a été programmé en une petite semaine et n'est pas forcément optimisé. A ce titre, vous pouvez aussi émettre des remarques constructives sur comment faire plus simple ou plus optimal.
Ce projet est accessible à un débutant. Il faut savoir que la programmation sur microcontrôlleur est un peu différente de celle sur PC. La plus grande différence est qu'on peut changer l'état des broches de sorties en agissant sur des registres internes. Le côté gratifiant et avantageux: vous écrivez du code pour interagir avec le monde réel!
Cela implique de s'appuyer sur un schéma physique des connexions, voici celui que j'ai utilisé:


Passons à la description du code.
Je ne vais pas en détailler la totalité, mais seulement quelques parties que je juge intéressantes.
//Constantes et macros
#define LED_1 PB2    //Rouge
#define LED_2 PB3    //verte
#define LED_3 PB4    //Bleue
#define STROBE PB5    //Blanche x2
#define AMBI PB1    //Led RGB Auto pour ambiance

#define BUT_MODE PB0    //Bouton pour la sélection des modes
#define BUT_STROBE PB7    //Bouton pour la sélection des modes
  Ci-dessus ce trouve la déclaration des constantes, mais pas n'importe lesquelles! Mon but ici était double: me faciliter la tâche en facilitant l'écriture et la lecture du code et permettre à un débutant lisant le code de savoir ce que fait le programme.

//Gestion des boutons
        button1=( PINB & (1<<BUT_MODE) );        //detection d'un appuis sur mode
        button2=( PINB & (1<<BUT_STROBE) );         //détection appuis sur strobe
  Cette portion de code a pour but d'acquérir l'état des boutons. Le truc ennuyant avec les boutons, c'est qu'il y a des rebonds. Pour ceux qui ne savent pas, lorsque la lame métallique du bouton touche l'autre partie du contact, celle-ci ne peut s'empêcher de rebondir (c'est un phénomène physique normal). Si on ne met pas d'anti-rebond, je peux vous assurer que même à 1 petit Mhz le programme lis plusieurs appuis!

La méthode que j'ai utilisé ici a pour avantage d'être simple et plutôt efficace en général. L'idée, c'est qu'on va inscrire l'état du bouton dans une variable en admettant qu'il est bon. Ca marche plutôt bien car la fréquence de travail du µcontrôlleur est petite, avec une fréquence plus élevée, il se peut que cette technique ne fonctionne pas. Dans ce cas, on ira demander à Google, il saura! ;)

switch (ambActiv){    //Gestion de l'allumage de la led d'ambiance
                case 0:
                    PORTB &=~(1<<AMBI);
                    break;
                case 1:
                    PORTB |=(1<<AMBI);
                    break;
            }
  Voici ce qu'on appel "tuer une mouche avec un bazooka!". J'ai utilisé un switch pour faire une comparaison toute simple, un if/else aurait suffit. L'avantage c'est que c'est super lisible.

Ce cas est intéressant pour les débutant :
On va utiliser des opérations logiques afin de modifier seulement la valeur qui nous intéresse dans le registre PORTB. Vous noterez l'utilisation de la constante "AMBI" qui nous indique qu'on bosse avec la led d'ambiance.

"PORTB &=~(1<<AMBI);" aura pour effet de faire un ET logique entre la valeur actuelle de PORTB et la valeur ce qui est entre parenthèses, mais inversé (par le "~"). On va donc inscrire un 0 sur la sortie où est connectée la led d'ambiance. La 2eme ligne fait la même chose, mais c'est un OU logique au lieu d'un ET, on va donc inscrire la valeur 1.

Concernant les procédures "num_led(int led, int ms);" et "print_number(int num);", elles sont exclusivement composées de switch qui vont permettre de gérer les combinaisons pour l'affichage. Ces combinaisons sont écrites en dur dans le code mais il reste lisible grâce à l'utilisation de nom numérotés pour les sorties.

Globalement, voici comment ce que fait le programme:
(-Initialisation)
-Lecture des boutons
-Lecture de la séquence sélectionnée OU du stroboscope

Le tout, en boucle à l'aide d'un while(1)!
Si vous téléchargez ce code, prenez le temps de lire les indications que j'ai mise pour aider le lecteur débutant.
Vous pouvez télécharger le code en suivant ce lien.