Cours:TPS 2103 tpDigicode

De troyesGEII
Révision datée du 14 février 2024 à 11:16 par Bjacquot (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

Fiche résumé

Retour à la liste des Tps

Éléments de correction

Arduino-nano-pinout.png


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 brièvement
  • 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 faire, vous pouvez consulter cette page

Remarque : Il y a beaucoup plus simple ;-)


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