Cours:TPS 2103 tpDigicode
Révision datée du 14 février 2024 à 11:16 par Bjacquot (discussion | contributions)
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 !
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
Ajouter une procédure de changement du code.
Faire en sorte que le temps maximum de saisie du code soit de 4s