begin process at 2012 05 28 23:29:19
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

Création de menu sur afficheur LCD


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Création de menu sur afficheur LCD

samedi 18 mars 2006 à 15:01:44 | Création de menu sur afficheur LCD

netdefense

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

samedi 18 mars 2006 à 20:10:03 | Re : Création de menu sur afficheur LCD

julienbj


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
Savon
samedi 18 mars 2006 à 20:13:11 | Re : Création de menu sur afficheur LCD

julienbj


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
Savon
dimanche 19 mars 2006 à 11:16:04 | Re : Création de menu sur afficheur LCD

netdefense

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
dimanche 19 mars 2006 à 11:56:47 | Re : Création de menu sur afficheur LCD

netdefense

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);
}



Cette discussion est classée dans : menu, heure, lcd, putc, int8


Répondre à ce message

Sujets en rapport avec ce message

Win32(control) [ par NitRic ] Bonjour, pour mon premier prog Win32 en C++ j'ai décider de faire un petit NotPad sauf que la j'ai un problème:J'ai fais des menu et dans le menu Édi Modification du menu Système [ par Xaviou ] Salut.Je voudrais ajouter une command "About ..." au menu système de mon prog.J'ai donc écris le code suivant:HMENU hSysMenu;MENUITEMINFO minfo;minfo. (vc++) menu popup [ par madVinz ] $@lµT, je cherche un faire un menu ki saffiche a la position du curseur, mé sans fenetre, qd on lance le prog, le menu saffiche direct la ou é le curs Creer un raccourci dans le menu Démarrer [ par Godbout ] Salut a tous,Voila je cherche les fonctions qui permettent de creer un raccourci, que je placerais dans le menu demarrer.Merci d'avance ;) comment faire inscrire un texte dans un editeur en cliquant sur le menu [ par Astrogeo ] j'ai fais un editeur de textej'aimerai que lorsque l'on clique sur le menu il affiche un texte là ou l'on ecrit.Comment fait-on Merci de bien vouloir MFC : marche pas tout le temps. [ par jefk ] Voila, j'ai un pbm zarbi. J'ai fait une application SDI bidon sous visual studio avec le wizzard MFC.Ya deux menus, chacun a un sous menu qui fait apa Menu contextuel avec le bouton droit [ par header ] Voila mon problème : G une ListBox et j'aimerai lui attacher un menu contextuel c'est àdire que lorsque je séléctionee quelquechose dedns en faisant u Prendre l'heure du bios [ par JosueClement ] Quelle fonction dois-je utiliser pour prendre l'heure du bios pour pouvoir faire un prog (horloge) ?Avec un exemple ce serait cool !..Josué Clémentjos Problème incompréhensible [ par JosueClement ] Regardez plutot...Ce programme est une sorte d'horloge!Il n'y a aucune erreur de compilation, mais les heures n'augmentent jamais!!A la ligne 54, j'ai menu et ressources [ par Xs ] salut !!vala un pb de plus de ma part.donc, il est simple, j'ai fait une dialog en ressource, je l'ai intégrée a mon prog, ele marche trés bien, mais


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales