Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

struct menu{.....} = problem

08 Jan 2011 23:33 2368 24
  • Level 14  
    Co w tym kodzie jest nie tak ?

    Code:
    struct menu {
    
    char funkcja[14];
    char nr_menu;
    char nr_poz;
    char prg;
    }nazwa[7];                        // linia 38

    zmien   ={"    Zmien   ",1,2,1},
    Sprawdz ={"   Sprawdz  ",1,3,2},
    Ustaw   ={"Ustaw. Serwa",2,0,3},
    Tcx     ={"Temp.cz.-max",2,0,4},
    Tcm     ={"Temp.cz.-min",2,0,5},
    Tc      ={"Temp-czopuch",3,0,6},
    Tw      ={"Temp - wewn ",3,0,7},
    Tz      ={"Temp - zewn ",3,0,8};
                
          nazwa[0]=zmien;          // linia 50
          nazwa[1]=Sprawdz;
          nazwa[2]=Ustaw;
          nazwa[3]=Tcx;
          nazwa[4]=Tcm;
          nazwa[5]=Tc;
          nazwa[6]=Tw;
          nazwa[7]=Tz;   

    kompilator nt to:
    .
    Code:
    ../menu.c:50: error: conflicting types for 'nazwa'
    
    ../menu.c:38: error: previous declaration of 'nazwa' was here
    ../menu.c:50: error: invalid initializer

    Nie dziala
  • Level 24  
    A jakieś błędy kompilator zgłasza, bo na podstawie zamieszczonego kodu nie wiadomo, jakiego typu są zmienne "zmien", "sprawdz", "ustaw" itp. No i albo kopiujemy na piechotę, albo memcpy(). Na konstruktor kopiujący, przeciążony operator i inne bajery nie ma co liczyć
  • Level 14  
    Jak zadeklaruje:
    Code:
    char zmien,Sprawdz,Ustaw,Tcx,Tcm,Tc,Tw,Tz;   // linia 32

    to są nowe błedy:
    Code:
    ../menu.c:41: error: conflicting types for 'zmien'
    
    ../menu.c:32: error: previous declaration of 'zmien' was here

    w lini deklaracji. ??
  • Level 42  
    Zastosuj sobie "typedef" podczas tworzenia struktury, dzięki temu będziesz mógł później nadawać od razu takie typy zmiennym, np:

    Code:

    typedef struct {
      char pole1;
      char pole2;
    } SNAZWA;


    a później już ładnie:

    Code:

    SNAZWA zmien;
    SNAZWA sprawdz;
    SNAZWA ustaw;


    i już masz trzy gotowe struktury. Ale co dalej chciałeś z nimi zrobić to musiałbyś lepiej opisać bo z twojego kodu za dobrze to nie wynika no i nie dziwota, że kompilator płacze :(
  • Level 14  
    Jestem za krótki w C więc musze poszukac innej drogi do:

    Chodzi mi o stworzenie bazy danych na kształt .dbf
    zawierajacej: text,liczba,liczba,liczba i takich rekordów powiedzimy 20


    Czy może być tak:

    zmien [text][liczba][liczba][liczba];
    sprawdz[text][liczba][liczba][liczba];

    Ale jak je spiąć czyli zrobic tablice tablic?

    Napewno to możliwe, ale dopiero raczkuje w C.
    Może Ktoś podpowiedzieć jak to wykonać?
  • Level 24  
    Code:
    struct menu { 
    
    char funkcja[14];
    char nr_menu;
    char nr_poz;
    char prg;
    };             

    struct menu nazwa[] = {{"    Zmien   ",1,2,1},
    {"   Sprawdz  ",1,3,2},
    {"Ustaw. Serwa",2,0,3},
    {"Temp.cz.-max",2,0,4},
    {"Temp.cz.-min",2,0,5},
    {"Temp-czopuch",3,0,6},
    {"Temp - wewn ",3,0,7},
    {"Temp - zewn ",3,0,8}};
  • Level 14  
    Zmagań cd. Niestety.
    Jako struktura jest zapisywana w pamieci. Ale dostepu do niej ni hu hu.
    Ostatnie kombinowanie polegało na:
    Code:
    #include <avr/sfr_defs.h>
    
    #include <avr/io.h>


    struct  menu {
    int funkcja[14];
    int nr_menu;
    int nr_poz;
    int prg;
    }nazwa[7],abc,xyz;               // linia 11
    abc={"  Sprawdz    ",1,3,2};
    xyz.nr_poz=0;                  // linia 15
    nazwa[1].funkcja="temp";         // linia 17
    nazwa[]={"Ustaw. Serwa ",2,0,3};   // linia 19


    void main(void)
    {
    while(1){}
    }

    i zwrot kompilatora:
    Code:


    ../menu.c:13: warning: data definition has no type or storage class
    ../menu.c:13: warning: type defaults to 'int' in declaration of 'abc'
    ../menu.c:13: error: conflicting types for 'abc'
    ../menu.c:11: error: previous declaration of 'abc' was here
    ../menu.c:13: warning: initialization makes integer from pointer without a cast
    ../menu.c:13: warning: excess elements in scalar initializer
    ../menu.c:13: warning: (near initialization for 'abc')
    ../menu.c:13: warning: excess elements in scalar initializer
    ../menu.c:13: warning: (near initialization for 'abc')
    ../menu.c:13: warning: excess elements in scalar initializer
    ../menu.c:13: warning: (near initialization for 'abc')
    ../menu.c:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token
    ../menu.c:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token
    ../menu.c:19: warning: data definition has no type or storage class
    ../menu.c:19: warning: type defaults to 'int' in declaration of 'nazwa'
    ../menu.c:19: error: conflicting types for 'nazwa'
    ../menu.c:11: error: previous declaration of 'nazwa' was here
    ../menu.c:19: error: excess elements in struct initializer
    ../menu.c:19: error: (near initialization for 'nazwa')
    ../menu.c:19: error: excess elements in struct initializer
    ../menu.c:19: error: (near initialization for 'nazwa')
    ../menu.c:19: error: excess elements in struct initializer
    ../menu.c:19: error: (near initialization for 'nazwa')
    ../menu.c:19: error: wchar_t-array initialized from non-wide string
    ../menu.c:24: warning: return type of 'main' is not 'int'
    make: *** [menu.o] Error 1
    Build failed with 13 errors and 12 warnings...

    Nie mam już zdrowia.
  • Level 24  
    Dostał kolega gotowca, a wkleja jakąś radosną twórczość. O co chodzi ?
  • Level 42  
    5657jz wrote:
    Nie mam już zdrowia.


    No to albo bierz się za jakąś książkę do nauki C ;) bo takim sposobem można dość szybko przestać być raczkującym w C ..... albo czytaj uważniej boć przecież sulfur podał ci jak na talerzu co i jak a ty znowu to samo ;)
  • Level 14  
    Macie racje. Kupie większe okulary.
    Jak wkleiłem podany kod ,problem zniknął.
    W każdą strukturę mogę wpisać daną:
    Code:
    nazwa[1].nr_poz=2;

    lecz odwrotnie
    Code:
    x=nazwa[1].nr_poz;

    niestety nie działa. I znów mam problem.Czy źle robię,czy odczytać można tylko za pomoca wskaźników, lub inny sposób. A dąże do:
    Code:
    if(nazwa[1].nr_poz==2)
    
      to wykonaj ......;
    Program wchodzi w if zapętla sie jakby nie mógł znaleźć danej: nezwa[1].nr_poz.(debugger AVR Studi4)
    O co chodzi ?. Jak pokazac if że chodzi o strukturę, chociaż nie logiczne jest dla mnie, że if nie moze sobie dać z tym rady.
    I jeszcze jedno- taki kod:
    Code:
     void funkcja (void)
    
    {
    unsigned char x=0;
    ...
    }

    Doczytałem sie że: zmienna x powinna byc automatyczną widzianą w powyższej funkcji. Ale mój debugger nie widzi jej. Natomiast widzi wszystkie zmienne zainicjowane przed main().
    Wybaczcie że marudzę. Moja scieżka edukacyjna poszła złym torem, bo zacząłem od Clipper-a (duższy czas temu). Teraz mam problem z C. Ale to tak na marginesie.
    Może mnie ktoś oświeci na czym polega myślenie w C.
  • Level 42  
    5657jz wrote:
    Może mnie ktoś oświeci na czym polega myślenie w C.


    hohoo hooo - na ten temat to można byłoby całą książkę napisać a nawet nie jedną. Z drugiej zaś strony jak tylko zaskoczysz podstawy i przestaną cię one przerażać - to strasznie szybko sam zobaczysz na czym to myślenie polega - tzn przynajmniej zaczniesz to wyraźnie dostrzegać i łatwiej będzie się go uczyć na bazie np choćby przeglądania innych programów itp.
  • Level 34  
    5657jz wrote:

    lecz odwrotnie
    Code:
    x=nazwa[1].nr_poz;

    niestety nie działa.

    Tak jest poprawnie. Możesz objaśnić, co znaczy "nie działa"?
    Quote:
    Program wchodzi w if zapętla sie jakby nie mógł znaleźć danej: nezwa[1].nr_poz.(debugger AVR Studi4)
    O co chodzi ?.

    Nie napisałeś, jakiego masz AVR-a. Bo może masz mało pamięci? Te struktury i napisy zajmują RAM, jeżeli przepisałeś wprost kod od sulfura. Ile pamięci wg kompilatora/linkera zajmuje Twój program?
    Quote:

    I jeszcze jedno- taki kod:
    Code:
     void funkcja (void)
    
    {
    unsigned char x=0;
    ...
    }

    Doczytałem sie że: zmienna x powinna byc automatyczną widzianą w powyższej funkcji. Ale mój debugger nie widzi jej. Natomiast widzi wszystkie zmienne zainicjowane przed main().

    Upewnij się, że masz wyłączoną optymalizację, jak chcesz debugować program. Opcja "-o0" kompilatora, pewnie jest też gdzieś w ustawieniach AVR-Studio.
  • Level 14  
    debugging -to symulator AVR Studio4. (nie Jtag)
    Kompilator ma właczony -0s
    Program po kompilacji:
    Code:
    ../menu2.c:30: warning: no semicolon at end of struct or union
    
    ../menu2.c: In function 'ile_poz':
    ../menu2.c:52: warning: suggest parentheses around assignment used as truth value
    ../menu2.c: In function 'wykonaj':
    ../menu2.c:119: warning: return type of 'main' is not 'int'
    ../menu2.c:119: warning: 'main' is normally a non-static function
    ../menu2.c: In function 'main':
    ../menu2.c:156: warning: suggest explicit braces to avoid ambiguous 'else'
    ../menu2.c:150: warning: suggest explicit braces to avoid ambiguous 'else'
    ../menu2.c:126: warning: unused variable 'strzalka'
    ../menu2.c: In function 'wykonaj':
    ../menu2.c:182: warning: 'return' with a value, in function returning void
    ../menu2.c: In function 'ile_poz':
    ../menu2.c:57: warning: array subscript is above array bounds
    Build succeeded with 9 Warnings...



    a jak tworze .hex:
    Code:

    ../menu2.c:30: warning: no semicolon at end of struct or union
    ../menu2.c: In function 'ile_poz':
    ../menu2.c:52: warning: suggest parentheses around assignment used as truth value
    ../menu2.c: In function 'wykonaj':
    ../menu2.c:119: warning: return type of 'main' is not 'int'
    ../menu2.c:119: warning: 'main' is normally a non-static function
    ../menu2.c: In function 'main':
    ../menu2.c:156: warning: suggest explicit braces to avoid ambiguous 'else'
    ../menu2.c:150: warning: suggest explicit braces to avoid ambiguous 'else'
    ../menu2.c:126: warning: unused variable 'strzalka'
    ../menu2.c: In function 'wykonaj':
    ../menu2.c:182: warning: 'return' with a value, in function returning void
    ../menu2.c: In function 'ile_poz':
    ../menu2.c:57: warning: array subscript is above array bounds
    avr-gcc -mmcu=atmega16 -Wl,-Map=menu2.map menu2.o     -o menu2.elf
    d:/program files/winavr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr5/crtm16.o:(.init9+0x0): undefined reference to `main'
    make: *** [menu2.elf] Error 1
    Build failed with 1 errors and 9 warnings...

    tz. błąd:
    Code:
    avr-gcc -mmcu=atmega16 -Wl,-Map=menu2.map menu2.o     -o menu2.elf
    
    d:/program files/winavr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr5/crtm16.o:(.init9+0x0): undefined reference to `main'
    make: *** [menu2.elf] Error 1

    Pogubiłem sie w tym wszystkim. O co chodzi w powyższm błędzie?
  • Level 34  
    Brak fukcji main() w programie. Coś namieszałeś, pewnie z nawiasami. Generalnie - z takimi ostrzeżeniami program Ci raczej nie bedzie chodził. Kod trzeba pisać tak, aby ostrzeżeń nie było. Więcej nic nie poradzę nie widząc źródeł.
    P.S. Na Twoim poziomie zapomnij o debugowaniu z włączona optymalizacją. To dobra rada. :)
  • Moderator of Microcontroller designs
    Poza tym błędy i ostrzeżenia należy eliminować od pierwszego do ostatniego, a nie od końca. Często kolejne błędy są spowodowane pierwszym, w efekcie komunikaty z nimi związane są mylące. Jeśli gdzieś wcześniej zapomniałeś średnika na końcu, to nic dziwnego, że kompilator nie widzi funkcji main (która zapewne w programie jest). Po prostu semantyka mu na to nie pozwala.

    Dodano po 1 [minuty]:

    Aha, dobra rada - zanim zabierzesz się za C na mikrokontrolery kup sobie książkę o C i poćwicz na PC - wyjdzie taniej i efektywniej. Bo na tym etapie zamiast pisać program rozwiązujący dany problem, leżysz na podstawach z C.
  • Level 14  
    TO TAK NA ZAKOŃCZENIE TEMATU.
    Poniżej kod naibardziej banalnego programu na mikrokontroler który udało mi sie napisać.
    Liczę, że znajdzie sie Ktoś, kto powie mi gdzie ten bład, którego nie mogę przeskoczyć. Starałem sie opisać, czego gdzie oczekuje od programu, aby prościej było odszyfrować o co tam chodzi.

    Przyjmę każdą zjebkę, ale oczekuję na jakąś podpowiedź.


    Code:
    /* MENU.C     AVR Studi4  4.18.692
    
    W "struct" zapisuje  -"text do wyswietlenia",  przynależność do menu,  nastepne menu,  nr funkcji
    wyswietlam menu glowne czyli nr_menu=1. (jedną "funkcja" ze strzałkami lewo/prawo lub bez).
    Po wyborze przenoszę do nastepnego menu,lub wykonuje funkcje, czyszczę ekran i wyswietlam  menu ponownie.



    */
    #include <avr/io.h>
    #include <avr/sfr_defs.h>

    #define PIN(x) (*(&x - 2))  /* address of data direction register of port x */
    #define DDR(x) (*(&x - 1))  /* address of input register of port x          */
    #define PORT(x) (*(&x ))

    /***** Konfiguracja przyciskow MENU  ****/
    #define MENU_PORT   PORTA   // Port MENU aktywne stanem niskim

    #define MENU   0
    #define PLUS   1
    #define MINUS   2
    #define ENTER   3
    #define POWROT   4
    /****************************************/   
    #define IF_MENU     PIN(MENU_PORT),MENU
    #define IF_PLUS      PIN(MENU_PORT),PLUS
    #define IF_MINUS   PIN(MENU_PORT),MINUS
    #define IF_ENTER   PIN(MENU_PORT),ENTER
    #define IF_POWROT   PIN(MENU_PORT),POWROT

    #define MAX_MENU  7

    struct menu{char funkcja[14];
             unsigned char nr_menu;    // przynależność do danego menu
             unsigned char nr_poz;   // menu podrzedne
             unsigned char prg};      // funkcja do wykonania
    struct menu nazwa[]={{"    Zmien   ",1,2,1},
                         {"   Sprawdz  ",1,3,2},
                         {"Ustaw. Serwa",2,0,3},
                         {"Temp.cz.-max",2,0,4},
                         {"Temp.cz.-min",2,0,5},
                         {"Temp-czopuch",3,0,6},
                         {"Temp - wewn ",3,0,7},
                         {"Temp - zewn ",3,0,8}};
             

    unsigned char flaga_menu;  //menu do wyswietlenia
    unsigned char poz_struct;    // pozycja w strukturze
    unsigned char ile_poz_menu=0;// ile pozycji menu do wyswietlenia

    /************************* Sprawdzi ile pozycji w menu *****************/

    unsigned char ile_poz(unsigned char flaga_menu)
    {
       unsigned char i; 
       unsigned char wartosc=0;   // ile rekordów  do wyświetlenia zawierających   nr_menu=1

       for(i=0;i<=MAX_MENU;i++)     
       {
             if (nazwa[i].nr_menu==flaga_menu)    wartosc++;
       }
    return wartosc;   // ile_poz_menu
    }   
             
    /**************** wykonaj program wybrany w menu **************************/

    void wykonaj(unsigned char funkcja)
    {
         switch (funkcja)
         {
           case 0:
             ;
             break;
        
           case 1:
             ;
             break;
       
           case 2:
          //ZMIEN-Ustaw. Serwa
             ;
             break;
       
           case 3:
          //ZMIEN-Temp.cz.-max
             ;
             break;
           
          case 4:
          //ZMIEN-Temp.cz.-min
             ;
             break;
           
          case 5:
          //SPRAWDZ-Temp.-czopuch
             ;
             break;
           
          case 6:
          //SPRAWDZ-Temp - wewn
             ;
             break;
           
          case 7:
          //SPRAWDZ-Temp - zewn
             ;
             break;
             
           default:
             ;
             break;
     }
    }
    /****************************************************************************/
    /****************************************************************************/

    void main(void)
    {

       DDR(PORTA)|=_BV(MENU)|_BV(PLUS)|_BV(MINUS)|_BV(ENTER)|_BV(POWROT);
       PORT(MENU_PORT)|=_BV(MENU)|_BV(PLUS)|_BV(MINUS)|_BV(ENTER)|_BV(POWROT);
       flaga_menu=1;               // nr_menu wyswietlanego
       poz_struct=1;               // nr_poz  menu wyswietlonego 

       while(1)
       {
          if(bit_is_clear(PORTA,MENU))       // wejscie do menu   Miało być  bit_is_clear(IF_PLUS) ale bład
          {
                         
                do
                {
                   ile_poz_menu=ile_poz(flaga_menu);   // ile pozycji menu do wyswietlenia

                      if(ile_poz_menu==1)
                         ;// wyswietl menu  ->     |  funkcja[?]  |
                         
                      else if(ile_poz_menu>1)
                         ;// wyswietl menu  ->     |   fukcja[?] >|     dostęp do pozostałych funkcji - w prawo
                      
                      else
                         // Brak menu
                         break;
                   while(1)     // poki nie nacisniesz klawisza
                   {
                      if (bit_is_clear(PORTA,PLUS)){      // Miało być  bit_is_clear(IF_PLUS) ale bląd.
                         if (poz_struct==ile_poz_menu)         // jesli niema podmenu
                            ;//nic nie rob
                         else
                            if(poz_struct<ile_poz_menu)       // jesli jest więcej
                               poz_struct++;
                               // przesuń ekran w lewo    |  funkcja[poz_struct-1] |  jesli ostatnia zgaś strzłke prawa
                      }            
                      else if ( bit_is_clear(PORTA,MINUS)){
                         if (poz_struct==ile_poz_menu)
                             ;// nic ne rob
                         else{      
                            if(poz_struct<ile_poz_menu)
                            // przestaw ekran w prawo    |< funkcja[poz_struct-1 > | jesli pierwsza zgas strzałke lewa
                            poz_struct--;
                         }
                      }
                      else if (bit_is_clear(PORTA,ENTER)){
                            if  (nazwa[flaga_menu+1].nr_poz){
                               // przenies do nastepnego menu
                               flaga_menu++;
                               poz_struct++;
                               break;
                               }
                            else { 
                               // wybrano (nazwa[poz_struct-1].prg)
                               // wykonaj program
                               wykonaj(nazwa[poz_struct-1].prg);//pobierz ze struct i wyślij
                                  // wyczyść ekran
                               poz_struct=1;     
                               break;
                            }
                      }
                      else  if(bit_is_clear(PORTA,POWROT)){   //
                            flaga_menu--;
                            break;
                      }
                      else
                      ;   // koniec if
                   }//end while(1)
                       
                       
                }
                while(flaga_menu);
          
          } // endif MENU
       } // end while
    } // end main()   

  • VIP Meritorious for electroda.pl
    Może powinieneś to menu wrzucić do PROGMEM ?
  • Level 14  
    Kod powyżej uaktualniony.

    for poprawilem. następna kicha.
    //OPUSZCZA LINIE PONIŻEJ ,WYKONUJE - ile_poz_menu=ile_poz(flaga_menu).
    Prawdopodobnie gdyby: flaga_menu=1; poz_struct=1; były przed main() zostały by zauwazone. Czy tak jak jest to BŁAD?
  • Level 24  
    Nie opuszcza, tylko to są tak elementarne operacje, że nie ma co tam debugować.
  • Level 14  
    Kod zaktualizowany
    Wyżuciłem 2 zmienne na poczatek main().
    .
    Code:
    void main(void) 
    
    {

       DDR(PORTA)|=_BV(MENU)|_BV(PLUS)|_BV(MINUS)|_BV(ENTER)|_BV(POWROT);
       PORT(MENU_PORT)|=_BV(MENU)|_BV(PLUS)|_BV(MINUS)|_BV(ENTER)|_BV(POWROT);
       flaga_menu=1;               // nr_menu wyswietlanego
       poz_struct=1;               // nr_poz  menu wyswietlonego 

    Teraz są widoczne, przyjmują wartość jak wpisano
    Nie widzę mozliwości przemieszczenia zmiennej "wartość" której też ne widać.
    Dlaczego jej nie widać ?. (na symulatorze AVR Studio)
    Code:
    unsigned char ile_poz(unsigned char flaga_menu)
    
    {
       unsigned char i; 
       unsigned char wartosc=0;   // ile rekordów  do wyświetlenia zawierających   nr_menu=1

       for(i=0;i<=MAX_MENU;i++)     
       {
             if (nazwa[i].nr_menu==flaga_menu)    wartosc++;
       }
    return wartosc;   // ile_poz_menu
    }   
  • Level 24  
    Ponieważ jest to lokalna zmienna, i może (powinna) być widoczna tylko podczas wykonywania tej właśnie funkcji. Jej wartość trafia bezpośrednio do ile_poz_menu.
  • Level 14  
    Ponieważ program nie ma co robić, trudno uchwycić gdzie przeskakuje.
    Dam jakieś KONTROLKI w miejscach nic nie robienia. Bo jak go symuluje to jednak cos się dzieje. Ale to wieczorem. Dzięki za pomoc.

    Dodano po 2 [godziny] 42 [minuty]:

    Kombinuje z tym programem i z godz. na godz. jestem coraz głupszy.
    w
    Code:
    unsigned char ile_poz(unsigned char flaga_menu) 
    
    {
       unsigned char i; 
       unsigned char wartosc=0;   // ile rekordów  do wyświetlenia zawierających   nr_menu=1

       for(i=0;i<=MAX_MENU;i++)     
       {
             if (nazwa[i].nr_menu==flaga_menu)    wartosc++;
       }
    return wartosc;   // ile_poz_menu
    ]:

    Utworzona zostaje nowa zmnienna flaga_menu na użytek funkcji. Tak/Nie ?
    "if" powinno odczytać wartość ze "struc" i prównać ją z "flaga_menu" Tak/Nie ?
    "wartosc" przekazywana jest do wywołania funkcji. Tak/Nie ?
    Jeśli sie z tym zgadzasz. To dlaczego flaga_menu z wywołania nie aktualizuje sie ?
    Dlaczego w warunku "if" nazwa[i].nr_menu nie jest odczytywana ?
    Dlaczego w kodzie np:
    Code:
    x=nazwa[2].nr_menu  

    nie można zczytac x

    Uparłem się jak kozioł tego kodu, Bo nie wiem dlaczego jest tak jak jest.
  • Level 34  
    Wyłączyłeś optymalizację, jak pisałem?
  • Level 14  
    Nauka ograniczyła sie do tego, że program musi coś robic, inaczej trudno uchwycić co zrobił lub nie zrobił. Pierwszy raz w ten sposób coś pisałem i to był mój błąd.
    Dziekuje Wszyskim którzy starali sie pomuc.
    Poniżej kod który można wykożystać,przerobić ,dopisać. Dla tych, którzy uczą się tak jak ja.
    Tu temat zamykam.
    Do usłyszenia do nastepnego problemu.
    Code:
    /* MENU.C     AVR Studi4  4.18.692
    
    W "struct" zapisuje  -"text do wyswietlenia",  przynależność do menu,  nastepne menu,  nr funkcji
    wyswietlam menu glowne czyli nr_menu=1. (jedną "funkcja" ze strzałkami lewo/prawo lub bez).
    Po wyborze przenoszę do nastepnego menu,lub wykonuje funkcje, czyszczę ekran i wyswietlam  menu ponownie.



    */
    #include <avr/io.h>
    #include <avr/sfr_defs.h>

    #define PIN(x) (*(&x - 2))  /* address of data direction register of port x */
    #define DDR(x) (*(&x - 1))  /* address of input register of port x          */
    #define PORT(x) (*(&x ))

    /***** Konfiguracja przyciskow MENU  ****/
    #define MENU_PORT   PORTA   // Port MENU aktywne stanem niskim

    #define MENU   0
    #define PLUS   1
    #define MINUS   2
    #define ENTER   3
    #define POWROT   4
    /****************************************/   
    #define IF_MENU     PIN(MENU_PORT),MENU       //nie wiem dlaczego (bit_is_clear(IF_MENU)) to błąd
    #define IF_PLUS      PIN(MENU_PORT),PLUS
    #define IF_MINUS   PIN(MENU_PORT),MINUS
    #define IF_ENTER   PIN(MENU_PORT),ENTER
    #define IF_POWROT   PIN(MENU_PORT),POWROT

    #define MAX_MENU  7

    struct menu{char funkcja[14];
             unsigned char nr_menu;    // przynależność do danego menu
             unsigned char nr_poz;   // wskazuje menu podrzedne
             unsigned char prg};      // funkcja do wykonania kiedy nr_poz=0
    struct menu nazwa[]={{"    Zmien   ",1,2,1},
                    {"   Sprawdz  ",1,3,2},
                    {"Ustaw. Serwa",2,0,3},
                    {"Temp.cz.-max",2,0,4},
                    {"Temp.cz.-min",2,0,5},
                    {"Temp-czopuch",3,0,6},
                    {"Temp - wewn ",3,0,7},
                    {"Temp - zewn ",3,0,8}};
             // Mozesz dopisać więcej menu
             // Programy możesz uruchamiać po przeróbce z "i" a "prg" wykasowac .

    unsigned char flaga_menu;     //menu do wyswietlenia
    unsigned char poz_struct;    // pierwsza pozycja w strukturze do wyswietlenia
    unsigned char wyswietl;       // ostatnia pozycja w struct do wyswietlenia
    unsigned char ile_poz_menu=0;// ile pozycji menu do wyswietlenia
    unsigned char wartosc=0;     // zm. zliczajaca w ile_poz()
       
    /************************* Sprawdzi ile pozycji w menu *****************/

    unsigned char ile_poz(unsigned char flaga_menu,unsigned char wartosc)
    {
       unsigned char i;
       unsigned char pierwszy=1; //flaga zakończenia if
       poz_struct=0;
     
       for(i=0;i<=MAX_MENU;i++)     
       {
             if (nazwa[i].nr_menu==flaga_menu)
             {
                 wartosc++;
                if (pierwszy){poz_struct=i;    pierwszy=0;}
             }
       }
        wyswietl=poz_struct+wartosc;
    return wartosc;   // ile_poz_menu
    }   
             
    /**************** wykonaj program wybrany w menu **************************/

    void wykonaj(unsigned char funkcja)
    {
         switch (funkcja)
         {
           case 0:
             ;
             break;
        
           case 1:
             ;
             break;
       
           case 2:
          //ZMIEN-Ustaw. Serwa
             ;
             break;
       
           case 3:
          //ZMIEN-Temp.cz.-max
             ;
             break;
           
          case 4:
          //ZMIEN-Temp.cz.-min
             ;
             break;
           
          case 5:
          //SPRAWDZ-Temp.-czopuch
             ;
             break;
           
          case 6:
          //SPRAWDZ-Temp - wewn
             ;
             break;
           
          case 7:
          //SPRAWDZ-Temp - zewn
             ;
             break;
             
           default:
             ;
             break;
     }
    }
    /****************************************************************************/
    /****************************************************************************/

    void main(void)
    {

       DDR(PORTA)|=_BV(MENU)|_BV(PLUS)|_BV(MINUS)|_BV(ENTER)|_BV(POWROT);
       PORT(MENU_PORT)|=_BV(MENU)|_BV(PLUS)|_BV(MINUS)|_BV(ENTER)|_BV(POWROT);
       flaga_menu=1;               // nr_menu wyswietlanego - zaczynamy od menu głównego
                    
       
       while(1)   // linia do usuniecia w inych porogramach wykozystujących tenże kod
       {         // linia do usuniecia w inych porogramach wykozystujących tenże kod
          if(bit_is_clear(PORTA,MENU))            // wejscie do menu   Miało być  bit_is_clear(IF_PLUS) ale bład
          {                                                   //nie wiem dlaczego
                
                do
                {
                   ile_poz_menu=ile_poz(flaga_menu,wartosc);   // ile pozycji menu do wyswietlenia
                   wartosc=0;
                   
                      if(ile_poz_menu==1)
                         ;// wyswietl menu  ->     |  funkcja[?]  |
                         
                      else if(ile_poz_menu>1)
                         ;// wyswietl menu  ->     |   fukcja[?] >|     dostęp do pozostałych funkcji - w prawo
                      
                      else
                         // Brak menu
                         break;
                   while(1)     // klawisz nacisniety to Twoj wybor
                   {
                      if (bit_is_clear(PORTA,PLUS)){            
                           if (ile_poz_menu==1)                     // jesli menu zawiera jeden element nacisnij ENTER
                            ;//nic nie rob
                         else
                            if(poz_struct<wyswietl-1)               // jesli jest więcej elementów
                               poz_struct++;
                               // przesuń ekran w lewo    jesli ostatnia zgaś strzłke prawa
                      }            
                      else if ( bit_is_clear(PORTA,MINUS)){
                         if (ile_poz_menu==1)                      // jesli menu zawiera jeden element nacisnij ENTER
                               ;// nic ne rob
                         else{      
                            if(poz_struct>(wyswietl-ile_poz_menu))   // jesli jest więcej elementów
                               // przesun ekran w prawo  jesli pierwsza zgas strzałke lewa
                            poz_struct--;
                         }
                      }
                      else if (bit_is_clear(PORTA,ENTER)){
                            if  (nazwa[poz_struct].nr_poz){
                               // przenies do nastepnego menu
                               flaga_menu++;
                                  break;
                               }
                            else { 
                               // wybrano (nazwa[poz_struct].prg)
                               // wykonaj program
                               wykonaj(nazwa[poz_struct].prg);    //pobierz ze struct i wyślij
                                     // Wyswietl wynik
                               poz_struct=1;     
                               break;   // Wczytaj ostatnie menu ponownie
                            }
                      }
                      else  if(bit_is_clear(PORTA,POWROT)){   
                            flaga_menu--;
                            break;      //Powrot do menu poprzedniego / wyjscie z menu glownego
                      }
                      else
                      ;   // koniec if
                   }//end while(1)
                }
                while(flaga_menu);
          } // endif MENU
       } // end while   // linia do usuniecia w inych porogramach wykozystujących tenże kod
    } // end main()   

                           /*    KONIEC PROGRAMU   */