// Lecture des encodeurs // EPFL 2020/03/22, Pierre-Yves Rochat, pyr@pyr.ch #include #include // Définition des LED et des poussoirs pour la carte "blanche" #define Led1On P1OUT|=(1<<0) #define Led1Off P1OUT&=~(1<<0) #define Led1Toggle P1OUT^=(1<<0) #define InitLed1 P1DIR|=(1<<0);Led1Off #define Led2On P8OUT|=(1<<1) #define Led2Off P8OUT&=~(1<<1) #define Led2Toggle P8OUT^=(1<<1) #define InitLed2 P8DIR|=(1<<1);Led2Off #define Led3On P8OUT|=(1<<2) #define Led3Off P8OUT&=~(1<<2) #define Led3Toggle P8OUT^=(1<<2) #define InitLed3 P8DIR|=(1<<2);Led3Off #define Led4On P1OUT|=(1<<1) #define Led4Off P1OUT&=~(1<<1) #define Led4Toggle P1OUT^=(1<<1) #define InitLed4 P1DIR|=(1<<1);Led4Off #define Led5On P1OUT|=(1<<2) #define Led5Off P1OUT&=~(1<<2) #define Led5Toggle P1OUT^=(1<<2) #define InitLed5 P1DIR|=(1<<2);Led5Off #define Led6On P1OUT|=(1<<3) #define Led6Off P1OUT&=~(1<<3) #define Led6Toggle P1OUT^=(1<<3) #define InitLed6 P1DIR|=(1<<3);Led6Off #define Led7On P1OUT|=(1<<4) #define Led7Off P1OUT&=~(1<<4) #define Led7Toggle P1OUT^=(1<<4) #define InitLed7 P1DIR|=(1<<4);Led7Off #define Led8On P1OUT|=(1<<5) #define Led8Off P1OUT&=~(1<<5) #define Led8Toggle P1OUT^=(1<<5) #define InitLed8 P1DIR|=(1<<5);Led8Off #define Pous1On (!(P1IN&(1<<7))) #define InitPous1 P1DIR&=~(1<<7);P1REN|=(1<<7);P1OUT|=(1<<7) #define Pous2On (!(P2IN&(1<<2))) #define InitPous2 P2DIR&=~(1<<2);P2REN|=(1<<2);P2OUT|=(1<<2) void InitCarteBlanche() { InitLed1; InitLed2; InitLed3; InitLed4; InitLed5; InitLed6; InitLed7; InitLed8; InitPous1; InitPous2; } void AttenteMs(uint16_t duree) { volatile uint16_t i; while(duree-- >0) { for(i=0; i<105; i++) { } } } void CalibreMs() { // change l'état de la LED3 toutes les 10 sec. while(1) { AttenteMs(10000); Led1Toggle; } } // Simulation de l'encodeur par les poussoirs #define encodeurX (P1IN&(1<<7))>>7 //valeurs 0 ou 1 #define encodeurY (P2IN&(1<<2))>>2 void AfficheLedBleues(uint16_t val) { if (val & (1<<0)) { Led8On; } else { Led8Off; } if (val & (1<<1)) { Led7On; } else { Led7Off; } if (val & (1<<2)) { Led6On; } else { Led6Off; } if (val & (1<<3)) { Led5On; } else { Led5Off; } if (val & (1<<4)) { Led4On; } else { Led4Off; } } // Variables globales : int16_t Position; // nombre signé (positif-négatif) uint8_t X, ancienX, Y, ancienY; // Programme principal : //====================== void main(void) { WDTCTL = WDTPW | WDTHOLD; InitCarteBlanche(); Position = 0; AfficheLedBleues(Position); ancienX = encodeurX; ancienY = encodeurY; while(1) { X = encodeurX; Y = encodeurY; // valeurs actuelles if ((X!=ancienX) || (Y!=ancienY)) { // un changement s'est produit if (ancienX!=Y) { // détection du sens Position++; AfficheLedBleues(Position); } else { Position--; AfficheLedBleues(Position); } } ancienX = X; ancienY = Y; // anciennes valeurs mémorisées } } // Mode d'emploi : // En pressant sur Pous1, puis Pous2, puis relâchant Pour1, puis Pous2, et ainsi de suite, // vous verrez le compteur binaire augmenter (LED bleues). // En pressant sur Pous2, puis Pous1, puis relâchant Pour2, puis Pous1, et ainsi de suite, // vous verrez le compteur binaire diminuer.