Bonjour, afin d'économiser quelques sorties de mon microcontrôleur, je voulais utiliser un registre à décalage, mais disons que ça pose un peut problème niveau programmation car ca prend un peut trop de mémoire...
Le but est de commander des afficheurs 7 segments, sans le registre à décalage ça me prend 11 bits (4 adresse, 7 données), avec ca m'en que prend 6.
Le code est un peut différent, il est adapté à Xcode (pour tester l'algo avant de le mettre dans le micro)
Voici le code sans registre à décalage, c'est pour ça que je pense que je m'y prend mal...Code:int tab_valeurs[]={1,3,6,4,8,9}; // les valeurs à transmettre en décimal. int i=0, y=0, j=0; //fonctions void interrupt() // interruption timer overflow (on envoi tout les x ms) { int tab_chiffres[]={1,1,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1}; // chiffre de 0 à 10 codé pour afficheur 7 segments PORTC=i; switch (tab_valeurs[i]) //en fonction du chiffre décimal, on commence à un endroit précis du tab_chiffres pour avoir le code binaire. { case 0:j=0; break; case 1:j=7; break; case 2:j=14; break; case 3:j=21; break; case 4:j=28; break; case 5:j=35; break; case 6:j=42; break; case 7:j=49; break; case 8:j=56; break; default:j=63;break; } y=j; do { PORTC.4=tab_chiffres[j]; // on ecrit le bit PORTC.5=1; // decalage du registre delay_us(100); PORTC.5=0; j++; // on prend le chiffre suivant du tableau } while (j<y+7); // on recommence 7 fois if(i<5)i++; // a chaque fois qu'on passe par l'interrupt on prend un autre chiffre. else i=0; } int main (int argc, const char * argv[]) { interrupt(); // on simule le compteur en appelant la fonction interrupt(); interrupt(); interrupt(); interrupt(); interrupt(); return 0; }
Je cherche à partir des valeurs 126, 48, 109 etc de récupérer le code binaire correspondant accessible bit par bit, ca serai l'idéal.Code:int tab[]={1,1,2,8,0,0}; // variable globale, valeurs à envoyer. interrupt[7] void mux() { int val[]={126,48,109,121,51,91,95,112,127,123}; // chiffre de 0 à 10 codé pour afficheur 7 segments PORTB=val[tab[i]]; //on prend la valeur dans val correspondant au chiffre de tab PORTD=i << 3; // adresses if(i<6)i++; // a chaque fois qu'on passe par l'interrupt on prend un autre chiffre. else i=0; }
Merci de votre aide.
-----