Cours:TPS 2103 tpDigicode : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m
Ligne 15 : Ligne 15 :
 
int8_t lecture_ligne()
 
int8_t lecture_ligne()
 
{
 
{
   int8_t ch;
+
   int8_t etatEntrees;
   DDRD |= (1<<PD4)|(1<<PD5)|(1<<PD6) ;// commençons par lister les sorties sur le port D
+
   DDRB  |= ((1<<PB2)|(1<<PB1)|(1<<PB0));           // commençons par lister les sorties sur le port B
   DDRB &=~( (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ) ;   // puis les entrées sur le port B
+
   DDRC  &=~((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)); // puis les entrées sur le port C
   PORTD &=~( (1<<PD4)|(1<<PD5)|(1<<PD6) ) ;   // on place les sortie à l'état 0
+
   PORTB &=~((1<<PB2)|(1<<PB1)|(1<<PB0));           // on place les sortie à l'état 0
   PORTB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ;   // on active les résistances de pull-up sur les entrées
+
   PORTC |= ((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)); // on active les résistances de pull-up sur les entrées
  
   _delay_ms(1);        // un délais est nécessaire pour l'activation des pull-ups
+
   _delay_ms(1);        // un délai est nécessaire pour l'activation des pull-ups
  
   ch = PINB & 0b00001111; // on récupère ensuite l'état des entrées
+
   etatEntrees = PINC & 0b00111100; // on récupère ensuite l'état des entrées en cachant les bits non utiles
   switch (ch)
+
   switch (etatEntrees)
 
   {
 
   {
     case  0b1111: return 0; // aucune touche
+
     case  0b00111000: return 0; // L0 (appui sur l'une des touches 0/1/2 )
     case  0b1110: return 1; // L1
+
     case  0b00110100: return 1; // L1
     case  0b1101: return 2; // L2
+
     case  0b00101100: return 2; // L2
     case  0b1011: return 3; // L3
+
     case  0b00011100: return 3; // L3
    case  0b0111: return 4; // L4
+
     // si autre cas, pas de touches deux touches ou autre
     // si autre cas, deux touches ou autre
 
 
     default : return -1;
 
     default : return -1;
 
   }
 
   }
 
}
 
}
 
 
int8_t lecture_colonne()
 
int8_t lecture_colonne()
 
{
 
{
   uint8_t ch;
+
   int8_t etatEntrees;
   DDRD &=~( (1<<PD4)|(1<<PD5)|(1<<PD6) );// colonnes en entrée
+
   DDRB  &=~((1<<PB2)|(1<<PB1)|(1<<PB0));           // commençons par lister les sorties sur le port B
   DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ;   // lignes en sortie
+
   DDRC  |= ((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)); // puis les entrées sur le port C
   PORTD |= (1<<PD4)|(1<<PD5)|(1<<PD6) ;   // pull-up
+
   PORTB |= ((1<<PB2)|(1<<PB1)|(1<<PB0));           // on place les sortie à l'état 0
   PORTB &=~( (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) );   // sorties à 0
+
   PORTC &=~((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)); // on active les résistances de pull-up sur les entrées
  
   _delay_ms(1);        // un délais est nécessaire pour l'activation des pull-ups
+
   _delay_ms(1);        // un délai est nécessaire pour l'activation des pull-ups
  
   ch = PIND & 0b01110000; // on récupère ensuite l'état des entrées
+
   etatEntrees = PINB & 0b00000111; // on récupère ensuite l'état des entrées en cachant les bits non utiles
   switch (ch)
+
   switch (etatEntrees)
 
   {
 
   {
     case  0b01110000: return 0; // aucune touche
+
     case  0b00000110: return 0; // L0 (appui sur l'une des touches 0/1/2 )
     case  0b01100000: return 1; // C1
+
     case  0b00000101: return 1; // L1
     case  0b01010000: return 2; // C2
+
     case  0b00000011: return 2; // L2
    case  0b00110000: return 3; // C3
+
     // si autre cas, pas de touches deux touches ou autre
     // si autre cas, deux touches ou autre
 
 
     default : return -1;
 
     default : return -1;
 
   }
 
   }
 
}
 
}
 
+
const int8_t touches[4][3] = { { 1, 2, 3},
int8_t touches[4][3] = { { 1, 2, 3},
+
                            { 4, 5, 6},
                          { 4, 5, 6},
+
                            { 7, 8, 9},
                          { 7, 8, 9},
+
                            {10, 0,11} };
                          {10, 0,11} };
 
  
 
int8_t getTouche()
 
int8_t getTouche()
 
{
 
{
   int8_t line,col;
+
   int8_t ligne,colonne;
   line=lecture_ligne();
+
   ligne  =lecture_ligne();
   col=lecture_colonne();
+
   colonne=lecture_colonne();
   if ((col>0) && (col<4) && (line >0) && (line < 5))
+
   if ((ligne==-1)or(colonne==-1)) return -1;
    return touches[line-1][col-1];
+
   else                           return touches[ligne][colonne];
   else
 
    return -1;
 
 
}
 
}
 
</source>
 
</source>

Version du 13 février 2023 à 10:46


Nous allons utiliser la fonction getTouche() pour réaliser un programme de digicode.

Commençons pour définir les contraintes :

  • On appuie sur la touche '*' pour démarrer la saisie du code => la led rouge s'allume
  • L'utilisateur doit alors saisir le code sur 4 chiffres
  • On valide le code par la touche '#'
  • Si le code est bon la led verte s'allume pendant 10s, sinon la led rouge clignote pendant 10s


Si vous n'avez pas terminé le tp précédent, vous pouvez utiliser les fonctions suivantes :

int8_t lecture_ligne()
{
  int8_t etatEntrees;
  DDRB  |= ((1<<PB2)|(1<<PB1)|(1<<PB0));           // commençons par lister les sorties sur le port B
  DDRC  &=~((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2));  // puis les entrées sur le port C
  PORTB &=~((1<<PB2)|(1<<PB1)|(1<<PB0));           // on place les sortie à l'état 0
  PORTC |= ((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2));  // on active les résistances de pull-up sur les entrées

  _delay_ms(1);        // un délai est nécessaire pour l'activation des pull-ups

  etatEntrees = PINC & 0b00111100; // on récupère ensuite l'état des entrées en cachant les bits non utiles
  switch (etatEntrees)
  {
     case  0b00111000: return 0; // L0 (appui sur l'une des touches 0/1/2 )
     case  0b00110100: return 1; // L1
     case  0b00101100: return 2; // L2
     case  0b00011100: return 3; // L3
     // si autre cas, pas de touches deux touches ou autre
     default : return -1;
  }
}
int8_t lecture_colonne()
{
  int8_t etatEntrees;
  DDRB  &=~((1<<PB2)|(1<<PB1)|(1<<PB0));           // commençons par lister les sorties sur le port B
  DDRC  |= ((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2));  // puis les entrées sur le port C
  PORTB |= ((1<<PB2)|(1<<PB1)|(1<<PB0));           // on place les sortie à l'état 0
  PORTC &=~((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2));  // on active les résistances de pull-up sur les entrées

  _delay_ms(1);        // un délai est nécessaire pour l'activation des pull-ups

  etatEntrees = PINB & 0b00000111; // on récupère ensuite l'état des entrées en cachant les bits non utiles
  switch (etatEntrees)
  {
     case  0b00000110: return 0; // L0 (appui sur l'une des touches 0/1/2 )
     case  0b00000101: return 1; // L1
     case  0b00000011: return 2; // L2
     // si autre cas, pas de touches deux touches ou autre
     default : return -1;
  }
}
const int8_t touches[4][3] = { { 1, 2, 3},
                             { 4, 5, 6},
                             { 7, 8, 9},
                             {10, 0,11} };

int8_t getTouche()
{
  int8_t ligne,colonne;
  ligne  =lecture_ligne();
  colonne=lecture_colonne();
  if ((ligne==-1)or(colonne==-1)) return -1;
  else                            return touches[ligne][colonne];
}

Codez !

Question.jpg Ecrire un algorithme ( sur feuille !! ) puis réaliser le programme correspondant


En cas de besoin, et seulement si vous n'avez aucune idée sur comment fait, vous pouvez consulter cette page

Améliorations

Question.jpg Ajouter une procédure de changement du code.


Question.jpg Faire en sorte que le temps maximum de saisie du code soit de 4s