Cours:TPS 2103 tpDigicode : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
Ligne 9 : Ligne 9 :
 
*On valide le code par la touche '#'
 
*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 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 :
 +
<source lang=cpp>
 +
int8_t lecture_ligne()
 +
{
 +
  int8_t ch;
 +
  DDRD |= (1<<PD4)|(1<<PD5)|(1<<PD6) ;// commençons par lister les sorties sur le port D
 +
  DDRB &=~( (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ) ;    // puis les entrées sur le port B
 +
  PORTD &=~( (1<<PD4)|(1<<PD5)|(1<<PD6) ) ;    // 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
 +
 +
  _delay_ms(1);        // un délais est nécessaire pour l'activation des pull-ups
 +
 +
  ch = PINB & 0b00001111; // on récupère ensuite l'état des entrées
 +
  switch (ch)
 +
  {
 +
    case  0b1111: return 0; // aucune touche
 +
    case  0b1110: return 1; // L1
 +
    case  0b1101: return 2; // L2
 +
    case  0b1011: return 3; // L3
 +
    case  0b0111: return 4; // L4
 +
    // si autre cas, deux touches ou autre
 +
    default : return -1;
 +
  }
 +
}
 +
 +
int8_t lecture_colonne()
 +
{
 +
  uint8_t ch;
 +
  DDRD &=~( (1<<PD4)|(1<<PD5)|(1<<PD6) );// colonnes en entrée
 +
  DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ;    // lignes en sortie
 +
  PORTD |= (1<<PD4)|(1<<PD5)|(1<<PD6) ;    // pull-up
 +
  PORTB &=~( (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) );    // sorties à 0
 +
 +
  _delay_ms(1);        // un délais est nécessaire pour l'activation des pull-ups
 +
 +
  ch = PIND & 0b01110000; // on récupère ensuite l'état des entrées
 +
  switch (ch)
 +
  {
 +
    case  0b01110000: return 0; // aucune touche
 +
    case  0b01100000: return 1; // C1
 +
    case  0b1010000: return 2; // C2
 +
    case  0b00110000: return 3; // C3
 +
    // si autre cas, deux touches ou autre
 +
    default : return -1;
 +
  }
 +
}
 +
 +
int8_t touches[4][3] = { { 1, 2, 3},
 +
                          { 4, 5, 6},
 +
                          { 7, 8, 9},
 +
                          {10, 0,11} };
 +
 +
int8_t getTouche()
 +
{
 +
  int8_t line,col;
 +
  line=lecture_ligne();
 +
  col=lecture_colonne();
 +
  if ((col>0) && (col<4) && (line >0) && (line < 5))
 +
    return touches[line-1][col-1];
 +
  else
 +
    return -1;
 +
}
 +
</source>
  
 
=Codez !=
 
=Codez !=

Version du 25 février 2022 à 08:50


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 ch;
  DDRD |= (1<<PD4)|(1<<PD5)|(1<<PD6) ;// commençons par lister les sorties sur le port D
  DDRB &=~( (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ) ;    // puis les entrées sur le port B
  PORTD &=~( (1<<PD4)|(1<<PD5)|(1<<PD6) ) ;    // 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

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

  ch = PINB & 0b00001111; // on récupère ensuite l'état des entrées
  switch (ch)
  {
     case  0b1111: return 0; // aucune touche
     case  0b1110: return 1; // L1
     case  0b1101: return 2; // L2
     case  0b1011: return 3; // L3
     case  0b0111: return 4; // L4
     // si autre cas, deux touches ou autre
     default : return -1;
  }
}

int8_t lecture_colonne()
{
  uint8_t ch;
  DDRD &=~( (1<<PD4)|(1<<PD5)|(1<<PD6) );// colonnes en entrée
  DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ;    // lignes en sortie
  PORTD |= (1<<PD4)|(1<<PD5)|(1<<PD6) ;    // pull-up
  PORTB &=~( (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) );    // sorties à 0

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

  ch = PIND & 0b01110000; // on récupère ensuite l'état des entrées
  switch (ch)
  {
     case  0b01110000: return 0; // aucune touche
     case  0b01100000: return 1; // C1
     case  0b1010000: return 2; // C2
     case  0b00110000: return 3; // C3
     // si autre cas, deux touches ou autre
     default : return -1;
  }
}

int8_t touches[4][3] = { { 1, 2, 3},
                          { 4, 5, 6},
                          { 7, 8, 9},
                          {10, 0,11} };

int8_t getTouche()
{
  int8_t line,col;
  line=lecture_ligne();
  col=lecture_colonne();
  if ((col>0) && (col<4) && (line >0) && (line < 5))
    return touches[line-1][col-1];
  else
    return -1;
}

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