unsigned char clavier(void) //définition de la fonction clavier
{
unsigned char colonne; //déclaration des variables liées à cette fonction
unsigned char ligne;
unsigned char codetouche;
unsigned char touche;
DDRC=0b11110000;
colonne=0b00100000;
versportc: //étiquette permettant un saut
PORTC=colonne;
#asm //appel à des instructions de l'assembleur
nop //pour retarder la lecture du portC afin
nop //d'obtenir des niveaux de tensions valides sur
#endasm //les entrées/sorties du clavier.
ligne=PINC;
byte cod1, cod2,cod3,cod4 'chiffre du code
byte car1, car2, car3, car4 'chiffre tapés
byte touche 'variable de touche
Initialisation des variables :
On défini le code qui sera utilisé par le programme. L’utilisateur n’aura aucune influence sur ce code : il est défini à la programmation.
'----- initialisation des variables ------
'--- définition du code secret
cod1=1
cod2=9
cod3=8
cod4=5
Configuration des ports E/S :
On configure le port E en digital. Par ailleurs, on signale l’utilisation des port C, B et D :
'--------- initialisation des variables, des ports et fonctionnalités -------
'--- port E ----
PCFG3=1: PCFG2=0: PCFG1=0:PCFG0=1 'configuration de PE1 et PE2 en digital si utilisation LCD
'-- port B ----
' clavier = pullup activé par clavierinit et PB0,PB3 et PB4 en entrée
'--- port C ---
'D4 à D7 sur PC4-PC7 configuré en sortie par lcd2x16.bas
'---- port D ----
'clavier = lignes sur PD0 à PD3 en sortie
if ((ligne&0b00001111)==0) //structures if ... then ...else
{
colonne=colonne<<1;
if (colonne!=0)
{
goto versportc;
}
else
{
touche=255;
}
}
else
{
codetouche=colonne|ligne;
switch (codetouche) //structure switch ... case
{case (0b00100001):
{touche=3; break;}
case (0b00100010):
{touche=6; break;}
case (0b00100100):
{touche=9; break;}
case (0b00101000):
{touche=11; break;}
case (0b00101000):
{touche=2; break;}
case (0b01000010):
{touche=5; break;}
case (0b01000100):
{touche=8; break;}
case (0b01001000):
{touche=0; break;}
case (0b10000001):
{touche=1; break;}
case (0b10000010):
{touche=4; break;}
case (0b10000100):
{touche=7; break;}
case (0b10001000):
{touche=10; break;}
default: touche=255;
}
}
return touche; //mot clef return afin de renvoyer la valeur de "touche"
}
monprog:
lcdcmnd(clear)
lcd_putsf(ENTREZ CODE !)
lcdcmnd(L2+1)
lcd_putsf(----)
lcdcmnd(L2+1)
Ensuite par une série de « pas » successif, on assure la saisie de chacun des caractères tapés par l’utilisateur. A noter que le caractère # est obligatoire pour valider le code tapé.
pas1:
touche=lireclavier()
if touche=0 then goto pas1 'si pas de caractère tapé, relire clavier
car1=touche
lcd_putsf(*)
pause 500
pas2:
touche=lireclavier()
if touche=0 then goto pas2 'si pas de caractère tapé, relire clavier
car2=touche
lcd_putsf(*)
pause 500
pas3:
touche=lireclavier()
if touche=0 then goto pas3 'si pas de caractère tapé, relire clavier
car3=touche
lcd_putsf(*)
pause 500
pas4:
touche=lireclavier()
if touche=0 then goto pas4 'si pas de caractère tapé, relire clavier
car4=touche
lcd_putsf(*)
pause 500
pas5:
touche=lireclavier()
if touche=0 then goto pas5 'si pas de caractère # tapé, relire clavier
if touche<>12 then goto pas5 'si pas appui sur #, relire clavier
'--- comparaison avec code ---
lcdcmnd(L1+1)
if car1<>cod1 then goto erreur
if car2<>cod2 then goto erreur
if car3<>cod3 then goto erreur
if car4<>cod4 then goto erreur
'---- si code bon ---
lcd_putsf(Code exact! )
pause 4000
goto monprog
'--- si code faux ---
erreur:
lcd_putsf(code faux )
pause 4000
goto monprog