Cours:TPS 2103 tpDigicode : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
Ligne 1 : Ligne 1 :
 +
[[Cours:CoursM2103|{{Rouge|<big>'''Fiche résumé'''</big>}}]]
 +
 +
[[Cours:TPs_2103|{{Bleu|<big>'''Retour à la liste des Tps'''</big>}}]]
 +
 +
[[Cours:TPS_2103_tpDigicode_corrige|{{Vert|<big>'''Éléments de correction'''</big>}}]]
 +
 +
[[Fichier:Arduino-nano-pinout.png|600px|droite]]
  
  

Version du 28 février 2023 à 11:45

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 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