Bonjour à tous, avant j'étais pic16 et assembleur mais comme je passe aux pic18 je me confronte maintenant au langage C, et c'est le début j'ai du mal... Il me semble que je passe a côté de trucs élémentaires, donc si tu veux bien jeter un oeuil sur mon code, merci de critiquer !
Je vous expose mon problème : sur le portB j'ai un clavier en matrice
4x4. RB0-3 en entrées, RB4-7 en sorties, Résistances de pullup actives, interruptions désactivés.Mon programme principal fait régulièrement un appel de la fonction "LireTouche()", elle met à jour ma variable "touche" qui devrait contenir le code de la touche activée. Le problème est que "Touche" ne contient pas toujours le bon code, ça marche bien pour environ 80% des touches, mais pour certaines elle me renvoie un mauvais code.
BOOL LireTouche(void) { /* Variables Locales */ BYTE CLAVier;
/* Instructions */ mInitClavier(); Touche=0; // variable qui contiendra le code de la touche appuyée
CLAV=0b00001110; // Charge le masque de la 1ere ligne (RB0=0) (RB0-3 en sorties) CLAVier=CLAV; // effectue une lecture du Clavier (RB4-7 en entrées) if(CLAVier & 0b00010000) ; else Touche = 0b00010001; //RB4 Clic Droit if(CLAVier & 0b00100000) ; else Touche = 0b00100001; //RB5 Bas Droite if(CLAVier & 0b01000000) ; else Touche = 0b01000001; //RB6 Bas if(CLAVier & 0b10000000) ; else Touche = 0b10000001; //RB7 Bas Gauche
CLAV=0b00001101; // Charge le masque de la 2e ligne (RB1=0) CLAVier=CLAV; if(CLAVier & 0b00010000) ; else Touche = 0b00010010; //RB4 if(CLAVier & 0b00100000) ; else Touche = 0b00100010; //RB5 if(CLAVier & 0b01000000) ; else Touche = 0b01000010; //RB6 if(CLAVier & 0b10000000) ; else Touche = 0b10000010; //RB7
CLAV=0b00001011; // Charge le masque de la 3e ligne (RB2=0) CLAVier=CLAV; if(CLAVier & 0b00010000) ; else Touche = 0b00010100; //RB4 if(CLAVier & 0b00100000) ; else Touche = 0b00100100; //RB5 if(CLAVier & 0b01000000) ; else Touche = 0b01000100; //RB6 if(CLAVier & 0b10000000) ; else Touche = 0b10000100; //RB7
CLAV=0b00000111; // Charge le masque de la 4e ligne (RB3=0) CLAVier=CLAV; if(CLAVier & 0b00010000) ; else Touche = 0b00011000; //RB4 if(CLAVier & 0b00100000) ; else Touche = 0b00101000; //RB5 if(CLAVier & 0b01000000) ; else Touche = 0b01001000; //RB6 if(CLAVier & 0b10000000) ; else Touche = 0b10001000; //RB7
if (Touche!=0) return TRUE; } //Fin de LireTouche()
Voilà, j'espère que l'exposé de ma situation aura été asses clair. Qu'est-ce qui ce passe d'après vous ?
Laurent