Cours:TPS 2103 tpDigicode
Révision datée du 28 février 2023 à 10:45 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 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