Création de menu sur afficheur LCD

netdefense Messages postés 7 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 13 août 2009 - 18 mars 2006 à 15:01
netdefense Messages postés 7 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 13 août 2009 - 19 mars 2006 à 11:56
Bonjour a tous,

Je suis en train de réaliser un projet en BTS electronique qui consiste a créer un menu de configuration d'un composant horodateur sur afficheur LCD. J'ai ecrit un bout de programme j'aimerai savoir si vous voyez des erreurs ou pas car je n'ai pour l'instant pas les moyen de tester mon programme.

Code :

#include "projet.h"
#include <DS1305.C>
#include <LCD.C>
#include <KBD16TOUCHES.C>



void main()
{


int menu;
int k;
int8 jour;
int8 mois;
int8 annee;
int8 heure;
int8 minute;
int8 seconde;
int8 aheure;
int8 aminute;
int8 aseconde;
int8 bheure;
int8 bminute;
int8 bseconde;
int32 i;



setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
lcd_init();
kbd_init();


menu=0;
i=0;


lcd_putc("\f Initialisation");
delay_ms(2000);
lcd_putc("\f");
while(TRUE)
{
if(menu==0)
{
i++;
if(i==1)
{
lcd_putc(0x7E);
lcd_putc(" Reglage heure\n");
lcd_putc(" Reglage date");
}
k = kbd_getc();
if (k=='2')
{
lcd_putc("\f");
lcd_putc(0x7E);
lcd_putc(" Reglage de la date\n");
lcd_putc(" Heure de demarage");
menu = 1;
}
if (k=='E')
{
heure=0;
minute=0;
seconde=0;
while(k!='E')
{
lcd_putc("\f");
lcd_putc(heure);
lcd_putc(":");
lcd_putc(minute);
lcd_putc(":");
lcd_putc(seconde);
k = kbd_getc();
if(k==1)
heure++;
if (heure==24)
heure=0;
if(k==2)
minute++;
if (minute==60)
minute=0;
if(k==3)
seconde++;
if (seconde==60)
seconde=0;
}
write_ds1305(0x82,heure);
write_ds1305(0x81,minute);
write_ds1305(0x80,seconde);
}
}

if(menu==1)
{
lcd_putc("\f");
lcd_putc(0x7E);
lcd_putc(" Reglage de la date\n");
lcd_putc(" Heure de demarage");
k = kbd_getc();
if (k==2)
{
lcd_putc("\f");
lcd_putc(0x7E);
lcd_putc(" Heure de demarage\n");
lcd_putc(" Heure d'arret");
menu = 2;
}
if (k=='E')
{
jour=0;
mois=0;
annee=0;
while(k!='E')
{
lcd_putc("\f");
lcd_putc(jour);
lcd_putc(":");
lcd_putc(mois);
lcd_putc(":");
lcd_putc(annee);
k = kbd_getc();
if(k==1)
jour++;
if (jour==31)
jour=1;
if(k==2)
mois++;
if (mois==12)
mois=0;
if(k==3)
annee++;
}
write_ds1305(0x84,jour);
write_ds1305(0x85,mois);
write_ds1305(0x86,annee);
}
}
if(menu==2)
{
lcd_putc("\f");
lcd_putc(0x7E);
lcd_putc(" Heure de demarage\n");
lcd_putc(" Heure d'arret");
k = kbd_getc();
if (k==2)
{
lcd_putc("\f");
lcd_putc(0x7E);
lcd_putc(" Heure d'arret\n");
lcd_putc(" Reglage de l'heure");
menu = 3;
}
if (k=='E')
{
aheure=0;
aminute=0;
aseconde=0;
while(k!='E')
{
lcd_putc("\f");
lcd_putc(aheure);
lcd_putc(":");
lcd_putc(aminute);
lcd_putc(":");
lcd_putc(aseconde);
k = kbd_getc();
if(k==1)
aheure++;
if(k==2)
aminute++;
if(k==3)
aseconde++;
}
write_ds1305(0x87,aseconde);
write_ds1305(0x88,aminute);
write_ds1305(0x89,aheure);
}
}
if(menu==3)
{
lcd_putc("\f");
lcd_putc(0x7E);
lcd_putc(" Heure d'arret\n");
lcd_putc(" Reglage de l'heure");
k = kbd_getc();
if (k==2)
{
lcd_putc("\f");
lcd_putc(0x7E);
lcd_putc(" Reglage de l'heure\n");
lcd_putc(" Reglage de la date");
menu = 0;
}
if (k=='E')
{
aheure=0;
aminute=0;
aseconde=0;
while(k!='E')
{
lcd_putc("\f");
lcd_putc(bheure);
lcd_putc(":");
lcd_putc(bminute);
lcd_putc(":");
lcd_putc(bseconde);
k = kbd_getc();
if(k==1)
aheure++;
if(k==2)
aminute++;
if(k==3)
aseconde++;
}
write_ds1305(0x8B,bseconde);
write_ds1305(0x8C,bminute);
write_ds1305(0x8D,bheure);
}
}
}
}

Merci d'avance pour votre aide et si vous avez besoin de plus d'informations veuillez me poser vos questions j'y repondrais le plus vite possible.

Bonne journée bye

4 réponses

julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
18 mars 2006 à 20:10
On peut savoir sur quel cible tu dois mettre le programme?

D'apres mes lointains souvenirs, je n'ai connu qu'un compilo suffisament mal fait qui pour un lcd_putc accepte sans broncher des chaines de caractères. Utiliserais-tu par hasard CCS? (et si c'est le cas, j'en déduis que tu dois programmer sur PIC).

Pour etre tout a fait franc avec toi, en embarqué, on ne peut pas développer un code sans le tester. Dans l'absolu, meme si tout est sensé marché, il y a toujours une annerie qu'on a pas vu, un registre qu'on a pas bien initialisé.

Je vais jeter un coup d'oeil à ton code, mais te dire s'il va marcher ou pas, c'est impossible. Ca dépend trop du matériel.

Bon maintenant que j'ai regarder un peu.
Alors déja, faire des #include de fichier c, c'est a bannir (mais si tu utilises CCS, puisque qu'il prefere ca a des fichiers h....)
Ensuite, faudra que tu vérifies ce que te renvoies ton clavier. C'est un clavier de 16 touches, penses-tu qu'il va te renvoyer la lettre E ou plutot la valeur numérique 0x0E? Moi je dirais plutot 0x0E, mais toi tu as fait le contraire. Pareil pour les 0, 1, 2.... Attention à la différence entre '0' et 0.

Apres, ben je te dirais de tester au fur et a mesure en commencant par le LCD, puis le clavier.

Ah si, regarde aussi comment fonctionne kbd_getc().
Est-ce qu'elle attend qu'une touche du clavier soit enfoncée, ou est-ce qu'elle te renvoie une valuer bidon si aucune touche n'est enfoncée? (en gros bloquante ou non).

Bon courage.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
18 mars 2006 à 20:13
Non sérieusement je peux pas m'en empecher!!

Comment est-ce que cette p... de fonction fait pour marcher????
lcd_putc(0x7E); --> Je lui donne un caracètre
lcd_putc(" Reglage heure\n"); --> Et la une chaine de caractères (un pointeur quoi).

Et je suppose que tu n'as meme pas eu de warning pour ca!
CCS, tssss

PS: Désolé si c'est pas CCS que tu utilises, il m'est tellement resté en travers de la gorge que...

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
netdefense Messages postés 7 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 13 août 2009
19 mars 2006 à 11:16
Oula ! Bon apparement j'ai encore d'enorme progrés a faire en C :)

Déjà en effet je travail sur PIC16F876 dsl j'avoir omis de le preciser. Et effectivement j'utilise CCS.

JE voudrais déjà savoir pk faire des #include de fichier .C c'est a exclure ?

Pour le fonctionnement du clavier j'avoue que j'ai du mal a tout comprendre donc je vais mettre le code du fichier KBD16TOUCHES.C en debut d'aprem car je ne suis pas chez moi la et si tu peux me dire les reponses aux questions que tu me pose dans ton premier message ca m'aiderai bien pck je me suis posé les meme question mais sans trop etre sur de mes reponses. (Bien qu'il me semble qu'effectivement la fonction kbd_getc( ) n'attend pas un appui de touche mais renvoi plutot la valeur "\0")

Et pour cette histoire de lcd_putc(0x7E) et lcd_putc(" Reglage heure\n"); je comprend pas trop le problème que ca pose ?

Escuse moi pck j'avoue que je suis loin d'etre bon en C et il doit surement y avoir des enorme boulette lol :) En tout cas merci beaucoup pour ton aide ca m'ai vraiment utile et puis pour le code du fichier KBD16TOUCHES.C je le met très vite sur le site.

Bye et bonne aprem
0
netdefense Messages postés 7 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 13 août 2009
19 mars 2006 à 11:56
Voilà le fichier KBD16TOUCHES.C

#if defined(__PCH__)
#if defined use_portb_kbd
#byte kbd = 0xF81 // This puts the entire structure
#else
#byte kbd = 0xF83 // This puts the entire structure
#endif
#else
#if defined use_portb_kbd
#byte kbd = 6 // on to port B (at address 6)
#else
#byte kbd = 8 // on to port D (at address 8)
#endif
#endif


#if defined use_portb_kbd
#define set_tris_kbd(x) set_tris_b(x)
#else
#define set_tris_kbd(x) set_tris_d(x)
#endif


#define blue_keypad true


//Keypad connection: (for example column 0 is B2)
// Bx:


#ifdef blue_keypad ///////////////////////////////////// For the blue keypad
#define COL0 (1 << 2)
#define COL1 (1 << 3)
#define COL2 (1 << 6)
#define COL3 1


#define ROW0 (1 << 4)
#define ROW1 (1 << 7)
#define ROW2 (1 << 1)
#define ROW3 (1 << 5)


#else ////////////////////////////////////////////////// For the black keypad
#define COL0 (1 << 5)
#define COL1 (1 << 6)
#define COL2 (1 << 7)


#define ROW0 (1 << 1)
#define ROW1 (1 << 2)
#define ROW2 (1 << 3)
#define ROW3 (1 << 4)


#endif


#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2|COL3)


// Keypad layout:
char const KEYS[4][4] = {{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};


#define KBD_DEBOUNCE_FACTOR 33 // Set this number to apx n/333 where
// n is the number of times you expect
// to call kbd_getc each second



void kbd_init() {
}


char kbd_getc( ) {
static BYTE kbd_call_count;
static short int kbd_down;
static char last_key;
static BYTE col;


BYTE kchar;
BYTE row;


kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
switch (col) {
case 0 : set_tris_kbd(ALL_PINS&~COL0);
kbd=~COL0&ALL_PINS;
break;
case 1 : set_tris_kbd(ALL_PINS&~COL1);
kbd=~COL1&ALL_PINS;
break;
case 2 : set_tris_kbd(ALL_PINS&~COL2);
kbd=~COL2&ALL_PINS;
break;
case 3 : set_tris_kbd(ALL_PINS&~COL3);
kbd=~COL3&ALL_PINS;
break;


}


if(kbd_down) {
if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
kbd_down=FALSE;
kchar=last_key;
last_key='\0';
}
} else {
if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
if((kbd & ROW0)==0)
row=0;
else if((kbd & ROW1)==0)
row=1;
else if((kbd & ROW2)==0)
row=2;
else if((kbd & ROW3)==0)
row=3;
last_key =KEYS[row][col];
kbd_down = TRUE;
} else {
++col;
if(col==4)
col=0;
}
}
kbd_call_count=0;
}
set_tris_kbd(ALL_PINS);
return(kchar);
}
0
Rejoignez-nous