Je suis étudiant en Système Électronique, j'ai réaliser un montage simple comprenant un PIC 18F8722 , un écran LCD 8bit , et un Clavier Matriciel 16 touches.
je programme en C avec le logiciel MikroC Pro et un module Pic Flash 2
j'ai repris un exemple du logiciel permettant d'afficher la touche appuyé du clavier sur l’écran, je l'ai adapter a mon montage , mais je n'arrive pas a le faire fonctionner
L'affichage n'a aucun problème , mais le microcontroleur ne lit pas le clavier.
Je pense que le problème viens du PORTF ( un registre que je n'aurais pas ou mal régler ? )
Si quelqu'un connait ce type de microcontroleur , son aide est la bienvenue .
Merci d'avance
voici mon programme :
unsigned short kp, cnt, oldstate = 0;
char txt[6];
// Brochage du Clavier
char keypadPort at PORTF;
// Fin du brochage
// Brochage de l'ecran LCD
sbit LCD_RS at RE5_bit;
sbit LCD_EN at RE7_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISE5_bit;
sbit LCD_EN_Direction at TRISE7_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// Fin du brochage
void main() {
ADCON1 =0x0F; // Desactive le compteur analogique/numerique du PORTF et met les 0/I en numerique
MEMCON.F7=1; // Desactive le bus de memoire externe sur le PORTD
CMCON =0x07; // Desactive le comparateur sur le PORTF
PORTE = 0; // Met le PORTE a 0
PORTD = 0; // Met le PORTD a 0
PORTF = 0;
TRISE = 0; // Met le PORTE en sortie
TRISD = 0; // Met le PORTD en sortie
Keypad_Init(); // Initialise le Clavier
Lcd_Init(); // Initialise l'ecran LCD
Lcd_Cmd(_LCD_CLEAR); // Efface l'ecran LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Desactive le curseur
Lcd_Out(1, 1, "Vous avez presse"); // Ecrit ce texte sur l'ecran LCD
Lcd_Out(2, 1, "la touche :"); // Ecrit ce texte sur l'ecran LCD
do {
kp = 0; // Met la variable kp a 0
// Attend qu'une touche soit préssé et relaché
kp = Keypad_Key_Click(); // Store key code in kp variable
//Prepare la valeur en sortie , les cases correspondent a l'emplacement des touches sur le clavier
//, la valeur de kp asssocié correspond au code ASCII en base 10 de la touche.
moi je comprends qu'il faut forcément initialiser, pas que ça suffit.
18/05/2011 - 09h45
Pili47
Date d'inscription
mars 2008
Âge
26
Messages
19
Re : Language C et montage PIC18F8722
salut
Dans l'exemple d'utilisation du keypad ils écrivent le programme de la même façon, c'est pour sa que je pense que le problème viens plutôt d'un registre sur le PORTF que je n'ai pas activer ou désactivé
ou de ma mauvaise utilisation des registre
ADCON1 =0x0F;
CMCON =0x07;
ou TRIF, LATF ?
18/05/2011 - 10h32
RicounetZap
Date d'inscription
juillet 2008
Localisation
Baillargues
Messages
302
Re : Language C et montage PIC18F8722
Vite fait encore une fois, ton clavier semble avoir 16 touches, donc une matrice de 4 par 4
Donc, en théorie, il faut configurer 4 ports en entrées et 4 ports en sorties.
Mais sans schéma et sans détail de la fonction d'init du clavier, on ne peut que supposer
Cordialement
N'importe quoi, for ever :-)
18/05/2011 - 12h19
Aurélien
Date d'inscription
janvier 2003
Localisation
Paris
Âge
30
Messages
737
Re : Language C et montage PIC18F8722
Bon, tu nous le poste ton code pour les fonctions de gestion du clavier ???
Peut etre qu'elles necessitent une gestion par IT, et si tu ne les as pas activées ça ne marchera pas. (meme si j'en doute si tu utilises le portF)
18/05/2011 - 12h45
Pili47
Date d'inscription
mars 2008
Âge
26
Messages
19
Re : Language C et montage PIC18F8722
c'est ce code la que tu veux ?
unsigned short kp, cnt, oldstate = 0;
char txt[6];
// Keypad module connections
char keypadPort at PORTD;
// End Keypad module connections
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
void main() {
cnt = 0; // Reset counter
Keypad_Init(); // Initialize Keypad
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1, 1, "1");
Lcd_Out(1, 1, "Key :"); // Write message text on LCD
Lcd_Out(2, 1, "Times:");
do {
kp = 0; // Reset key code variable
// Wait for key to be pressed and released
do
// kp = Keypad_Key_Press(); // Store key code in kp variable
kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);
// Prepare value for output, transform key to it's ASCII value
switch (kp) {
//case 10: kp = 42; break; // '*' // Uncomment this block for keypad4x3
//case 11: kp = 48; break; // '0'
//case 12: kp = 35; break; // '#'
//default: kp += 48;
case 1: kp = 49; break; // 1 // Uncomment this block for keypad4x4
case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
case 4: kp = 65; break; // A
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
case 8: kp = 66; break; // B
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 12: kp = 67; break; // C
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
case 16: kp = 68; break; // D
}
if (kp != oldstate) { // Pressed key differs from previous
cnt = 1;
oldstate = kp;
}
else { // Pressed key is same as previous
cnt++;
}
Lcd_Chr(1, 10, kp); // Print key ASCII value on LCD
if (cnt == 255) { // If counter varialble overflow
cnt = 0;
Lcd_Out(2, 10, " ");
}
WordToStr(cnt, txt); // Transform counter value to string
Lcd_Out(2, 10, txt); // Display counter value on LCD
} while (1);
}
sinon quelqu’une gestion par IT ?
18/05/2011 - 12h59
Aurélien
Date d'inscription
janvier 2003
Localisation
Paris
Âge
30
Messages
737
Re : Language C et montage PIC18F8722
Non !
Tu as un probleme avec ton clavier, donc il faut que tu mettes le code des fonctions qui gerent ton clavier. Je te l'ai deja demandé en #4 !
Fonctions : Keypad_Key_Click() et Keypad_Init()
18/05/2011 - 14h29
Pili47
Date d'inscription
mars 2008
Âge
26
Messages
19
Re : Language C et montage PIC18F8722
fonction :
Keypad_Key_Click
Description :
Call to Keypad_Key_Click is a blocking call: the function waits until some key is pressed and released. When released, the function returns 1 to 16, depending on the key. If more than one key is pressed simultaneously the function will wait until all pressed keys are released. After that the function will return the code of the first pressed key.
Une fonction bloquante pour detecter des boutons poussoirs, ça se voit que son concepteur n'a jamais fait un programme depassant les interactions entre un bouton et une LED...
Bon sinon, tu n'as toujours pas compris, c'est le CODE DE CES FONCTIONS qui peut nous amener la solution.
18/05/2011 - 17h01
Pili47
Date d'inscription
mars 2008
Âge
26
Messages
19
Re : Language C et montage PIC18F8722
non je n'ai toujours pas compris , qu'es ce que tu appelle le " CODE "!
18/05/2011 - 17h53
Aurélien
Date d'inscription
janvier 2003
Localisation
Paris
Âge
30
Messages
737
Re : Language C et montage PIC18F8722
Tu te fiches de moi ?
Sur ce, je pars en vacance demain, marre d'être patient, debrouille toi.