Cours:TPS 2103 tpDigicode : Différence entre versions
m |
|||
Ligne 51 : | Ligne 51 : | ||
case 0b01110000: return 0; // aucune touche | case 0b01110000: return 0; // aucune touche | ||
case 0b01100000: return 1; // C1 | case 0b01100000: return 1; // C1 | ||
− | case | + | case 0b01010000: return 2; // C2 |
case 0b00110000: return 3; // C3 | case 0b00110000: return 3; // C3 | ||
// si autre cas, deux touches ou autre | // si autre cas, deux touches ou autre |
Version du 7 mars 2022 à 18:14
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 0b01010000: 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 !
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
Ajouter une procédure de changement du code.
Faire en sorte que le temps maximum de saisie du code soit de 4s