<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=30&amp;t=1861&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-11-15T16:07:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=1861&amp;mode</id>
<entry>
<author><name><![CDATA[krzysztoffx]]></name></author>
<updated>2013-11-15T16:07:29+01:00</updated>
<published>2013-11-15T16:07:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=56977#p56977</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=56977#p56977"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=56977#p56977"><![CDATA[
no już w pierwszym poście wspomniałem że program działa i się kompiluje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, chodzi o to że to makro jest wykorzystywane bardzo często i to podkreślanie jest &quot;ściśle irytujące&quot;, może ktoś zna sposób na dodanie wyjątku w eclipse ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1459">krzysztoffx</a> — 15 lis 2013, o 16:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysztoffx]]></name></author>
<updated>2013-11-15T15:36:46+01:00</updated>
<published>2013-11-15T15:36:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=56974#p56974</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=56974#p56974"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=56974#p56974"><![CDATA[
Jak dla mnie to wygląda na całkiem poprawną kompilację  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br />[syntax=c_loadrunner]<br />**** Build of configuration Release for project x0024_ENCODED_MENU ****<br /><br />make all <br />Building file: ../main.c<br />Invoking: AVR Compiler<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF&quot;main.d&quot; -MT&quot;main.d&quot; -c -o&quot;main.o&quot; &quot;../main.c&quot;<br />Finished building: ../main.c<br /> <br />Building file: ../Menu/menu.c<br />Invoking: AVR Compiler<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF&quot;Menu/menu.d&quot; -MT&quot;Menu/menu.d&quot; -c -o&quot;Menu/menu.o&quot; &quot;../Menu/menu.c&quot;<br />Finished building: ../Menu/menu.c<br /> <br />Building file: ../MK_ENCODER/mk_encoder.c<br />Invoking: AVR Compiler<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF&quot;MK_ENCODER/mk_encoder.d&quot; -MT&quot;MK_ENCODER/mk_encoder.d&quot; -c -o&quot;MK_ENCODER/mk_encoder.o&quot; &quot;../MK_ENCODER/mk_encoder.c&quot;<br />Finished building: ../MK_ENCODER/mk_encoder.c<br /> <br />Building file: ../LCD_ATM8_BF/lcd44780.c<br />Invoking: AVR Compiler<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF&quot;LCD_ATM8_BF/lcd44780.d&quot; -MT&quot;LCD_ATM8_BF/lcd44780.d&quot; -c -o&quot;LCD_ATM8_BF/lcd44780.o&quot; &quot;../LCD_ATM8_BF/lcd44780.c&quot;<br />Finished building: ../LCD_ATM8_BF/lcd44780.c<br /> <br />Building file: ../Keys/keys.c<br />Invoking: AVR Compiler<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF&quot;Keys/keys.d&quot; -MT&quot;Keys/keys.d&quot; -c -o&quot;Keys/keys.o&quot; &quot;../Keys/keys.c&quot;<br />Finished building: ../Keys/keys.c<br /> <br />Building target: gb02_UART_ASCII_AT.elf<br />Invoking: AVR C Linker<br />avr-gcc -Wl,-Map,gb02_UART_ASCII_AT.map -mmcu=atmega8 -o&quot;gb02_UART_ASCII_AT.elf&quot;  ./main.o  ./Menu/menu.o  ./MK_ENCODER/mk_encoder.o  ./LCD_ATM8_BF/lcd44780.o  ./Keys/keys.o   <br />Finished building target: gb02_UART_ASCII_AT.elf<br /> <br />Invoking: AVR Create Extended Listing<br />avr-objdump -h -S gb02_UART_ASCII_AT.elf  &gt;&quot;gb02_UART_ASCII_AT.lss&quot;<br />Finished building: gb02_UART_ASCII_AT.lss<br /> <br />Create Flash image (ihex format)<br />avr-objcopy -R .eeprom -O ihex gb02_UART_ASCII_AT.elf  &quot;gb02_UART_ASCII_AT.hex&quot;<br />Finished building: gb02_UART_ASCII_AT.hex<br /> <br />Create eeprom image (ihex format)<br />avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex gb02_UART_ASCII_AT.elf  &quot;gb02_UART_ASCII_AT.eep&quot;<br />Finished building: gb02_UART_ASCII_AT.eep<br /> <br />Invoking: Print Size<br />avr-size --format=avr --mcu=atmega8 gb02_UART_ASCII_AT.elf<br />AVR Memory Usage<br />----------------<br />Device: atmega8<br /><br />Program:    2878 bytes (35.1% Full)<br />(.text + .data + .bootloader)<br /><br />Data:        160 bytes (15.6% Full)<br />(.data + .bss + .noinit)<br /><br /><br />Finished building: sizedummy<br /> <br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1459">krzysztoffx</a> — 15 lis 2013, o 15:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysztoffx]]></name></author>
<updated>2013-11-14T18:42:09+01:00</updated>
<published>2013-11-14T18:42:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=56855#p56855</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=56855#p56855"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=56855#p56855"><![CDATA[
Jestem w trakcie uruchamiania menu rezusmara przy wykorzystaniu enkodera. Niby wszystko jest ok i działa jak należy jednak bezczelny kompilator podkreśla mi wszystkie linie w których wykorzystane jest makro GET_ADDR jako błąd składni  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> . Oto definicja makra:[syntax=c]#define GET_ADDR(ptr, field) (void*)pgm_read_word(((uint8_t*)ptr)+offsetof(struct _menuitem, field))[/syntax]   Zaznaczam że w plikach związanych z menu póki co nic nie zmieniałem. W konsoli nie ma żadnego warn'a... może ktoś już walczył z tym problemem ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1459">krzysztoffx</a> — 14 lis 2013, o 18:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-10-15T19:41:41+01:00</updated>
<published>2013-10-15T19:41:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53075#p53075</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53075#p53075"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53075#p53075"><![CDATA[
No ja miałem dokładnie ten sam problem na swoim 4x16.<p>Statystyki: Napisane przez Gość — 15 paź 2013, o 19:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mario]]></name></author>
<updated>2013-10-15T19:22:57+01:00</updated>
<published>2013-10-15T19:22:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53071#p53071</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53071#p53071"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53071#p53071"><![CDATA[
Anty, dzięki, już się bezbłędnie kompiluje.<br /><br />Krauser....chylę czoła  <img src="https://forum.atnel.pl/images/smilies/icon_exclaim.gif" alt=":!:" title="Wykrzyknik" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=415">mario</a> — 15 paź 2013, o 19:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-10-15T19:16:39+01:00</updated>
<published>2013-10-15T19:16:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53067#p53067</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53067#p53067"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53067#p53067"><![CDATA[
W tym wątku wspominał kolega elkuba, że z adresacją mogą być niespodzianki. Proponuje taki kod w odpowiednim miejscu:<br />[syntax=c]// definicje adresów w DDRAM dla różnych wyświetlaczy<br />// inne są w wyświetlaczach 2wierszowych i w 4wierszowych<br />#if ( (LCD_Y == 4) &amp;&amp; (LCD_X == 16) )<br />#define LCD_LINE1 0x00          // adres 1 znaku 1 wiersza<br />#define LCD_LINE2 0x28          // adres 1 znaku 2 wiersza<br />#define LCD_LINE3 0x14          // adres 1 znaku 3 wiersza<br />#define LCD_LINE4 0x54          // adres 1 znaku 4 wiersza<br />#elif ( (LCD_Y == 4) &amp;&amp; (LCD_X == 20) )<br />#define LCD_LINE1 0x00          // adres 1 znaku 1 wiersza<br />#define LCD_LINE2 0x40          // adres 1 znaku 2 wiersza<br />#define LCD_LINE3 0x14          // adres 1 znaku 3 wiersza<br />#define LCD_LINE4 0x54          // adres 1 znaku 4 wiersza<br />#else <br />#define LCD_LINE1 0x00          // adres 1 znaku 1 wiersza<br />#define LCD_LINE2 0x40          // adres 1 znaku 2 wiersza<br />#define LCD_LINE3 0x10          // adres 1 znaku 3 wiersza<br />#define LCD_LINE4 0x50          // adres 1 znaku 4 wiersza<br />#endif[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 15 paź 2013, o 19:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mario]]></name></author>
<updated>2013-10-15T18:05:14+01:00</updated>
<published>2013-10-15T18:05:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53054#p53054</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53054#p53054"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=53054#p53054"><![CDATA[
Próbuję uruchomić menu rezusmara na wyświetlaczu 4x20. Z tego co rozumiem z kodu, układ menu powinien się dostosować do ustawień wyświetlacza w pliku lcd44780.h . Niestety, działa poprawnie tylko dla wyświetlacza 16 znakowego. Przy ustawieniu 20 znaków mam taki efekt:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/415/7b584799a93a757ebff99a6abe197e08.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/415/7b584799a93a757ebff99a6abe197e08.jpg" alt="Obrazek" /></a><br /><br />oprocz tego, kompilator wywala warrningi &quot;passing argument 1 of 'lcd_str_P' discards qualifiers from pointer target type&quot; w pliku menu.c <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=415">mario</a> — 15 paź 2013, o 18:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Michal21]]></name></author>
<updated>2013-04-03T04:45:59+01:00</updated>
<published>2013-04-03T04:45:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=32872#p32872</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=32872#p32872"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=32872#p32872"><![CDATA[
Czyli za pomocą funkcji memcpy_P odczytujemy znacznik callback i jeśli w danym menu znajduje się jakaś funkcja np. set_clock, to zmienną event i inouth wpisujemy do wskaźnika *call za pomocą komendy pobrania adresu &amp;call. W miedzy czasie dzięki callbeckowi wywołujemy funkcję set_clock. Następnie sprawdzamy czy mamy tą samą pozycje menu. Jeśli tak, to nadpisujemy zmienną event wartością menu_event, a zmienną inoutch wartością current, jeśli nie, to nadpisujemy wartościami (menu_event, in)<br /><br />Natomiast w funkcji set_clock  cały czas sprawdzamy wartość zmiennych event-(menu_event) i inout-(current,in). Jeśli nie zmienimy pozycji menu, switch(event) zaczyna sprawdzać który przycisk naciśniemy. Domyślnie jest E_IDDLE czyli 0<br /><br />Wiem, że męczę <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> ale chciałbym mieć pewność, że dobrze to rozumiem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Może takie dokładne wytłumaczenie przyda się nie tylko mi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Co to za warunek ?? co On sprawdza ?? :<br /><br />[syntax=c]// event 1s<br />                if(s1_lcnt != s1_cnt)<br />                {<br />                        s1_lcnt = s1_cnt;[/syntax]<br /><br />Czy mógłbyś wrzucić cały plik ?? staram się i nie mogę uruchomić menu z tego co wkleiłeś. Błędów nie mam a menu nie chodzi...<br /><br />edit<br />Dobra, wszystko działa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Dla takich zielonych osób jak ja( s1_lcnt jest to przerwanie ). Teraz muszę jeszcze przerobić menu pod siebie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Dlatego nadal proszę o poprawnie mnie jeśli źle rozumiem działanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=967">Michal21</a> — 3 kwi 2013, o 04:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[nixie]]></name></author>
<updated>2013-04-02T08:59:34+01:00</updated>
<published>2013-04-02T08:59:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=32736#p32736</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=32736#p32736"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=32736#p32736"><![CDATA[
<div class="quotetitle">Michal21 napisał(a):</div><div class="quotecontent"><br />if(inout == in)<br />if(inout == current)<br />switch(event)<br />     case E_Next:<br />     case E_Click:<br /><br />1)Dlaczego zmienna inout jest porównywana z in czy też current ?? skąd wiadomo że przyjmie wartość 1 albo 2 ??<br /></div><br /><br /><br /><br />Przy przejściu do nowej pozycji menu (jej zmianie) funkcja zwrotna jest wywoływana z dodatkowym argumentem mającym wartość 'in', natomiast gdy wywoływane zdarzenia w danej pozycji menu nie zmienia jej to ta wartość przyjmuje 'current'. Np gdy zmieniasz wartość zegara to pozycja menu nie zmienia się. Odpowiedzialną za przekazanie tego argumentu jest funkcja change_manu().<br /><br />[syntax=c]// wywołanie funkcji zwrotnej<br />if(previous_menu==current_menu)<br />{<br />// przy tej samej pozycji menu<br />if (call)<br />call(menu_event, current);<br />}<br />else<br />{<br />// przy przejsciu do nowej pozycji menu<br />if (call)<br />call(menu_event, in);<br /><br />[/syntax]<br /><div class="quotetitle">Michal21 napisał(a):</div><div class="quotecontent"><br />2) skąd wiadomo, że event przyjmie wartość E_Next czy też E_Click ?? <br /><br />Pozdrawiam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br /><br />O to już musisz sam zadbać generując takie zdarzenie np po wciśnięciu klawisza lub odebraniu komendy IR.<br /><br />[syntax=c]void key_up(void)<br />{<br />menu_event = E_Prev;<br />}<br />void key_click(void)<br />{<br />menu_event = E_Click;<br />}<br />void key_down(void)<br />{<br />menu_event = E_Next;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=358">nixie</a> — 2 kwi 2013, o 08:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Michal21]]></name></author>
<updated>2013-04-02T08:29:51+01:00</updated>
<published>2013-04-02T08:29:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=32730#p32730</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=32730#p32730"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=32730#p32730"><![CDATA[
Na początek witam wszystkich forumowiczów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Tak czytam i czytam kod menu użytkownika nixie, niby wiem jak działa ale jednak nie do końca <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br />Jeśli dobrze rozumiem, to dzięki wskaźnikowi callback, a dokładniej jego zmiennej event wykona się funkcja, która znajduje się w wybranym podmenu np( set_clock). Jeśli event=null wskaźnik jest przeźroczysty. Ale tutaj pojawia się dalszy kod programu z wywoływaną funkcją:<br /><br />[syntax=c]<br /> <br />void set_clock(unsigned char event, uint8_t inout)<br />{<br />        enum {set, set_min, set_godz};<br /> <br />        static t_clock set_clock;<br />        static uint8_t set_position;<br /> <br />        // Wejscie do funkcji zwrotnej<br />        if(inout == in)<br />        {<br />                set_clock.min = clock.min;<br />                set_clock.godz = clock.godz;<br />                set_position = set_min;<br /> <br />//              lcd_locate(1,7);<br />//              lcd_str_P(PSTR(&quot;^^&quot;));<br /> <br />        }<br /> <br />        // Ponowne wywołanie funkcji zwrotnej<br />        if(inout == current)<br />        {<br /> <br />                switch(event)<br />                {<br />                case E_Next:<br />                        if(set_position == set_min)<br />                        {<br /> <br />//                              lcd_locate(1,7);<br />//                              lcd_str_P(PSTR(&quot;^^&quot;));<br /> <br />                                if(++set_clock.min == 60)<br />                                        set_clock.min = 0;<br />                        }<br />                        if(set_position == set_godz)<br />                        {<br />//                              lcd_locate(1,4);<br />//                              lcd_str_P(PSTR(&quot;^^   &quot;));<br /> <br />                                if(++set_clock.godz == 24)<br />                                        set_clock.godz = 0;<br />                        }<br />                        break;<br /> <br />                case E_Click:<br />                        if(++set_position &gt; set_godz)<br />                        {<br />                                clock.min = set_clock.min;<br />                                clock.godz = set_clock.godz;<br />                                clock.sec = 0;<br />                                set_position = set;<br /> <br />                        }<br />                        break;<br />                }<br />        }<br /> <br />        update_clock_buffor(&amp;clock_buf,&amp;set_clock);<br />        lcd_locate(0,4);<br />        lcd_str(clock_buf.bufor);<br />        lcd_locate(1,4);<br />        if(set_position == set_min)<br />                lcd_str_P(PSTR(&quot;   ^^&quot;));<br />        else if(set_position == set_godz)<br />                lcd_str_P(PSTR(&quot;^^   &quot;));<br /> <br />[/syntax]<br /><br />Tutaj mam zgrzyt <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />if(inout == in)<br />if(inout == current)<br />switch(event)<br />     case E_Next:<br />     case E_Click:<br /><br />1)Dlaczego zmienna inout jest porównywana z in czy też current ?? skąd wiadomo że przyjmie wartość 1 albo 2 ?? <br />2) skąd wiadomo, że event przyjmie wartość E_Next czy też E_Click ?? <br />Głowię się nad tym i jakoś nie mogę wykminić.. Może po prostu nie widzę w którym miejscu są przypisywane podane wartości do tych zmiennych. Proszę o w miarę proste wyjaśnienie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Jestem początkujący, co pewnie idzie wywnioskować z moich pytań <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br />Pozdrawiam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=967">Michal21</a> — 2 kwi 2013, o 08:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-13T10:41:57+01:00</updated>
<published>2012-12-13T10:41:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21049#p21049</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21049#p21049"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21049#p21049"><![CDATA[
Dokładnie, jak by mi kto w twarz napluł, a najgorsze w tym wszystkim jest to, że ten chamski moderator, miał czelność mieć mi za złe i napisać to w zablokowanym usuniętym temacie, gdzie ja już nie miałem możliwości odniesienia się do jego słów, normalnie jak za komuny, dostałeś pałą od zomo i miałeś siedzieć cicho.<p>Statystyki: Napisane przez Gość — 13 gru 2012, o 10:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2012-12-13T10:22:10+01:00</updated>
<published>2012-12-13T10:22:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21048#p21048</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21048#p21048"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21048#p21048"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Do dupy takie forum, gdzie nawet nie można wspomnieć o reszcie świata.<br /></div><br /><br />Jak w Chinach normalnie  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" />  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" />  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=127">Sonix</a> — 13 gru 2012, o 10:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-13T10:10:25+01:00</updated>
<published>2012-12-13T10:10:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21047#p21047</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21047#p21047"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21047#p21047"><![CDATA[
Dokładnie, banda, rozumiem, jak bym ofen dał linka do forum atnel. No to mogę zrozumieć.<br />Sam podałem tylko informację, że kolega Krauser z forum atnel znalazł rozwiązanie i tyle w tej kwestii, a mod od razu wywalił, na czerwono i, że bez zgody podmiotu bla bla bla <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />Do dupy takie forum, gdzie nawet nie można wspomnieć o reszcie świata.<p>Statystyki: Napisane przez Gość — 13 gru 2012, o 10:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2012-12-13T10:07:35+01:00</updated>
<published>2012-12-13T10:07:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21046#p21046</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21046#p21046"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21046#p21046"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />No bo mod wywalił mi informację gdzie i kto znalazł rozwiązanie problemu, więc niech się za przeproszeniem gonią. Sprawa się oparła o sysopa czyli gulsona, więc powiedziałem, że skoro nie chcą rozwiązania niech posta wywalą do kosza!, a nie, że mod mi będzie mówił gdzie i co mam publikować!<br /></div><br /><br />sobie jaja robia ?? Masakra ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=110">jachu</a> — 13 gru 2012, o 10:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-13T09:59:54+01:00</updated>
<published>2012-12-13T09:59:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21044#p21044</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21044#p21044"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21044#p21044"><![CDATA[
No bo mod wywalił mi informację gdzie i kto znalazł rozwiązanie problemu, więc niech się za przeproszeniem gonią. Sprawa się oparła o sysopa czyli gulsona, więc powiedziałem, że skoro nie chcą rozwiązania niech posta wywalą do kosza!, a nie, że mod mi będzie mówił gdzie i co mam publikować!<p>Statystyki: Napisane przez Gość — 13 gru 2012, o 09:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elkuba]]></name></author>
<updated>2012-12-13T09:48:20+01:00</updated>
<published>2012-12-13T09:48:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21043#p21043</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21043#p21043"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=21043#p21043"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />No już tam zablokowałem temat i dałem odnośnik z rozwiązaniem na to forum <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />, a co mi tam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. tam nie będę publikować naprawionej wersji.<br /><br />Właśnie rzeźbię menu do mojego &quot;sterownika&quot; jak córka pozwoli tj. nie będzie za bardzo absorbująca to powinienem samo menu ogarnąć dzisiaj, potem zostaje napisanie poszczególnych procedur, ale to już w tym temacie <br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic1767.html" >topic1767.html</a><!-- l -->  będę publikować.<br /></div><br /><br /><br />Szukałem na elektrodzie. Szukałem i szukałem. I w końcu znalazłem! W koszu...<br />no comment<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=400">elkuba</a> — 13 gru 2012, o 09:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-12T13:17:07+01:00</updated>
<published>2012-12-12T13:17:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20920#p20920</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20920#p20920"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20920#p20920"><![CDATA[
No i fajnie nam się wątek rozwija. Musze przetrawić co mi kolega Krauser rzucił <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> w tym temacie <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic1767-30.html" >topic1767-30.html</a><!-- l --><p>Statystyki: Napisane przez Gość — 12 gru 2012, o 13:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[nixie]]></name></author>
<updated>2012-12-12T13:11:25+01:00</updated>
<published>2012-12-12T13:11:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20917#p20917</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20917#p20917"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20917#p20917"><![CDATA[
Od kilku dni wałkuję temat menu wielopoziomowego i chciałbym się podzielić swoimi &quot;przemyśleniami&quot;. Jako podstawę wykorzystałem przykłady z linku podawanego przeze mnie wcześniej w tym wątku i na stronie <a href="http://stsystem.elektroda.eu/programowanie/avr/100-multimenu"  class="postlink">http://stsystem.elektroda.eu/programowanie/avr/100-multimenu</a>. Zmieniłem trochę funkcję odpowiedzialną za zmianę i wyświetlanie menu. Dodałem dodatkową zmienną przekazywaną przez tą funkcję, która określa czy nastąpiła zmiana pozycji menu co ułatwia życie oraz zdefiniowałem długość wyświetlanego menu na wyświetlaczu. Pozwala to na wyświetlanie np 3 linii menu na wyświetlaczu z 4 liniami.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;menu.h&quot;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;config.h&quot;<br />#include &quot;common.h&quot;<br /><br />// Ilość wierszy menu może być mniejsza od ilosci wierszy LCD ale nie większa<br />#define MENUROWS 2<br /><br />volatile unsigned char menu_event = E_IDDLE;<br />volatile unsigned char current_menu = 0;<br /><br /><br />// Napisy menu<br />const unsigned char MN01[] PROGMEM=&quot;Sterowanie LED&quot;;<br />const unsigned char subMN01_1[] PROGMEM=&quot;LED 1&quot;;<br />const unsigned char subMN01_2[] PROGMEM=&quot;LED 2&quot;;<br /><br />const unsigned char MN02[] PROGMEM=&quot;Ustaw zegar&quot;;<br />const unsigned char subMN02_1[] PROGMEM=&quot;Sub 2.1&quot;;<br />const unsigned char subMN02_2[] PROGMEM=&quot;Sub 2.2&quot;;<br /><br />const unsigned char MN03[] PROGMEM=&quot;Menu 3&quot;;<br />const unsigned char subMN03_1[] PROGMEM=&quot;Sub 3.1&quot;;<br />const unsigned char subMN03_1_1[] PROGMEM=&quot;Sub 3.1.1&quot;;<br />const unsigned char subMN03_1_2[] PROGMEM=&quot;Sub 3.1.2&quot;;<br />const unsigned char subMN03_2[] PROGMEM=&quot;Sub 3.2&quot;;<br />const unsigned char subMN03_3[] PROGMEM=&quot;Sub 3.3&quot;;<br /><br />enum {<br />pozaMenu,<br />Menu1,<br />SubMenu1_1,<br />SubMenu1_1_1,<br />SubMenu1_2,<br />SubMenu1_2_1,<br />Menu2,<br />SubMenu2_1,<br />Menu3,<br />SubMenu3_1,<br />SubMenu3_1_1,<br />SubMenu3_1_2,<br />SubMenu3_2,<br />SubMenu3_3,<br />};<br /><br />typedef struct<br />{<br />uint8_t next_state[4];//przejscia do następnych stanów<br />void (*callback)(uint8_t event, uint8_t inout);//funkcja zwrotna<br />const unsigned char* text;//tekst pozycji menu<br />} menu_item_t;<br /><br />// Menu<br />// Jesli chcemy wywolac funkcję zwrotną i nie wyswietlac w tym czasie menu na ekranie to<br />// pole struktury text musi mieć wartosc NULL<br />// next_state[E_Next] ostatniej pozycji menu znajdujacej się na tym samym poziomie<br />// powinno wskazywać na pierwszy element menu na tym samym poziomie, np Menu3 -&gt; Menu1<br />// SubMenu1_2 -&gt; SubMenu1_1<br />const menu_item_t menu[] PROGMEM = {<br />// Iddle, Prev, Click, Next<br />{{ pozaMenu, pozaMenu, pozaMenu, Menu1}, NULL,NULL},//poza menu<br />/*********************************************************************************/<br />{{ Menu1, pozaMenu, SubMenu1_1, Menu2}, NULL, MN01},<br />{{ SubMenu1_1, Menu1, SubMenu1_1_1, SubMenu1_2}, NULL, subMN01_1},<br />{{ SubMenu1_1_1, SubMenu1_1, SubMenu1_1, SubMenu1_1_1}, led1_change, NULL},<br />{{ SubMenu1_2, Menu1, SubMenu1_2_1, SubMenu1_1}, NULL, subMN01_2},<br />{{ SubMenu1_2_1, SubMenu1_2, SubMenu1_2_1, SubMenu1_2_1}, NULL,subMN01_2},<br />{{ Menu2, pozaMenu, SubMenu2_1, Menu3}, NULL, MN02},<br />{{ SubMenu2_1, Menu2, SubMenu2_1, SubMenu2_1}, set_clock, NULL},<br />{{ Menu3, pozaMenu, SubMenu3_1, Menu1}, NULL, MN03},<br />{{ SubMenu3_1, Menu3, SubMenu3_1_1, SubMenu3_2}, NULL,subMN03_1},<br />{{ SubMenu3_1_1, SubMenu3_1, SubMenu3_1_1, SubMenu3_1_2}, NULL,subMN03_1_1},<br />{{ SubMenu3_1_2, SubMenu3_1, SubMenu3_1_2, SubMenu3_1_1}, NULL,subMN03_1_2},<br />{{ SubMenu3_2, Menu3, SubMenu3_2, SubMenu3_3}, NULL, subMN03_2},<br />{{ SubMenu3_3, Menu3, SubMenu3_3, SubMenu3_1}, NULL, subMN03_3}<br />};<br /><br /><br /><br />void change_menu()<br />{<br />volatile uint8_t previous_menu = 0;<br /><br />uint8_t row;<br />uint8_t menu_item;<br /><br />void (*call)(uint8_t , uint8_t ); // wskaźnik do funkcji w pamięci programu<br /><br />previous_menu=current_menu;<br />current_menu = pgm_read_byte(&amp;menu[current_menu].next_state[menu_event]);<br />lcd_cls();<br /><br />// skopiuj z pamięci funkcje zwrotną<br />memcpy_P(&amp;call, &amp;menu[current_menu].callback, sizeof(unsigned char (*)(unsigned char)));<br /><br />// wywołanie funkcji zwrotnej<br />if(previous_menu==current_menu)<br />{<br />// przy tej samej pozycji menu<br />if (call)<br />call(menu_event, current);<br />}<br />else<br />{<br />// przy przejsciu do nowej pozycji menu<br />if (call)<br />call(menu_event, in);<br /><br />}<br />menu_item = current_menu;<br />row = 0;<br />lcd_locate(0,0);<br /><br />while(pgm_read_word(&amp;menu[menu_item].text))<br />{<br />if(!row)<br />lcd_char('&gt;');<br />lcd_locate(row, 2);<br />lcd_str_P((char *)pgm_read_word(&amp;menu[menu_item].text));<br />menu_item = pgm_read_byte(&amp;menu[menu_item].next_state[E_Next]);<br />if(menu_item == current_menu)<br />break;<br />if(++row == MENUROWS)<br />break;<br />}<br />//skasuj zdarzenie<br />menu_event = E_IDDLE;<br />}<br />[/syntax]<br /> <br />[syntax=c]/*<br /> * menu.h<br /> *<br /> <br /> */<br /><br />#ifndef MENU_H_<br />#define MENU_H_<br /><br />#define E_IDDLE0<br />#define E_Prev 1<br />#define E_Click 2<br />#define E_Next3<br /><br />extern volatile unsigned char current_menu;<br />extern volatile unsigned char menu_event;<br /><br />enum {in, current, out};<br /><br />void change_menu(void);<br /><br />#endif /* MENU_H_ */<br />[/syntax]<br /><br />Dla przykładu funkcje menu:<br />[syntax=c]/*<br /> * common.c<br /> *<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;common.h&quot;<br />#include &quot;menu.h&quot;<br /><br />void clock_inc(void)<br />{<br />if(++clock.sec == 60)<br />{<br />clock.sec = 0;<br />if(++clock.min == 60)<br />{<br />clock.min = 0;<br />if(++clock.godz == 24)<br />clock.godz = 0;<br />}<br />}<br />}<br /><br />void update_clock_buffor(t_clock_buf * clock_buf, t_clock * clock)<br />{<br />clock_buf-&gt;lsec = clock-&gt;sec%10 + '0';<br />clock_buf-&gt;hsec = clock-&gt;sec/10 + '0';<br />clock_buf-&gt;lmin = clock-&gt;min%10 + '0';<br />clock_buf-&gt;hmin = clock-&gt;min/10 + '0';<br />clock_buf-&gt;lgodz = clock-&gt;godz%10 + '0';<br />clock_buf-&gt;hgodz = clock-&gt;godz/10 + '0';<br />}<br /><br />void display_clock(void){<br />update_clock_buffor(&amp;clock_buf, &amp;clock);<br />lcd_locate(0,0);<br />lcd_str(clock_buf.bufor);<br />}<br /><br />void set_clock(unsigned char event, uint8_t inout)<br />{<br />enum {set, set_min, set_godz};<br /><br />static t_clock set_clock;<br />static uint8_t set_position;<br /><br />// Wejscie do funkcji zwrotnej<br />if(inout == in)<br />{<br />set_clock.min = clock.min;<br />set_clock.godz = clock.godz;<br />set_position = set_min;<br /><br />//lcd_locate(1,7);<br />//lcd_str_P(PSTR(&quot;^^&quot;));<br /><br />}<br /><br />// Ponowne wywołanie funkcji zwrotnej<br />if(inout == current)<br />{<br /><br />switch(event)<br />{<br />case E_Next:<br />if(set_position == set_min)<br />{<br /><br />//lcd_locate(1,7);<br />//lcd_str_P(PSTR(&quot;^^&quot;));<br /><br />if(++set_clock.min == 60)<br />set_clock.min = 0;<br />}<br />if(set_position == set_godz)<br />{<br />//lcd_locate(1,4);<br />//lcd_str_P(PSTR(&quot;^^   &quot;));<br /><br />if(++set_clock.godz == 24)<br />set_clock.godz = 0;<br />}<br />break;<br /><br />case E_Click:<br />if(++set_position &gt; set_godz)<br />{<br />clock.min = set_clock.min;<br />clock.godz = set_clock.godz;<br />clock.sec = 0;<br />set_position = set;<br /><br />}<br />break;<br />}<br />}<br /><br />update_clock_buffor(&amp;clock_buf,&amp;set_clock);<br />lcd_locate(0,4);<br />lcd_str(clock_buf.bufor);<br />lcd_locate(1,4);<br />if(set_position == set_min)<br />lcd_str_P(PSTR(&quot;   ^^&quot;));<br />else if(set_position == set_godz)<br />lcd_str_P(PSTR(&quot;^^   &quot;));<br /><br />}<br />void led1_change(unsigned char event, uint8_t inout)<br />{<br />switch(event)<br />{<br />case E_Next:<br />PORTC ^= DLED1;<br />break;<br />}<br /><br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Dioda LED 1&quot;));<br />lcd_locate(1,0);<br />if(PORTC &amp; DLED1)<br />lcd_str_P(PSTR(&quot;OFF&quot;));<br />else<br />lcd_str_P(PSTR(&quot;ON&quot;));<br /><br /><br />}<br />[/syntax]<br /><br />[syntax=c]/*<br /> * common.h<br /> *<br /> */<br /><br />#ifndef COMMON_H_<br />#define COMMON_H_<br /><br />// *** PORT<br />#define PORT(x) SPORT(x)<br />#define SPORT(x) (PORT##x)<br />// *** PIN<br />#define PIN(x) SPIN(x)<br />#define SPIN(x) (PIN##x)<br />// *** DDR<br />#define DDR(x) SDDR(x)<br />#define SDDR(x) (DDR##x)<br /><br /><br />#define KL1 (1&lt;&lt;PD2)<br />#define KL1_PORT D<br />#define KL2 (1&lt;&lt;PD3)<br />#define KL2_PORT D<br />#define KL3 (1&lt;&lt;PB2)<br />#define KL3_PORT B<br /><br />#define DLED1 (1&lt;&lt;PC3)<br />#define DLED2 (1&lt;&lt;PC4)<br />#define DLED3 (1&lt;&lt;PC5)<br />#define DLED_PORT C<br /><br />#define DLED1_TOGLE PORTC ^= DLED1;<br />#define DLED2_TOGLE PORTC ^= DLED2;<br />#define DLED3_TOGLE PORTC ^= DLED3;<br /><br /><br />typedef struct {<br />uint8_t sec;<br />uint8_t min;<br />uint8_t godz;<br />} t_clock;<br /><br />typedef union {<br />struct {<br />uint8_t hgodz;<br />uint8_t lgodz;<br />uint8_t spacer2;<br />uint8_t hmin;<br />uint8_t lmin;<br />uint8_t spacer1;<br />uint8_t hsec;<br />uint8_t lsec;<br />uint8_t end;<br />};<br />char bufor[9];<br />} t_clock_buf;<br /><br />extern t_clock clock;<br />extern t_clock_buf clock_buf;<br /><br />void clock_inc(void);<br />void led1_change(unsigned char event, uint8_t inout);<br />void update_clock_buffor(t_clock_buf * clock_buf, t_clock * clock);<br />void display_clock(void);<br />void set_clock(unsigned char event, uint8_t inout);<br /><br />#endif /* COMMON_H_ */<br />[/syntax]<br /><br />I plik main z automatycznym wyjściem z menu przy określonej bezczynności. Pętla główna obsługuje wielowątkowość.<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;menu.h&quot;<br />#include &quot;systick.h&quot;<br />#include &quot;superdebounce.h&quot;<br />#include &quot;common.h&quot;<br />#include &quot;config.h&quot;<br /><br />t_clock clock;<br />t_clock_buf clock_buf;<br /><br />void key_up(void)<br />{<br />menu_event = E_Prev;<br />}<br />void key_click(void)<br />{<br />menu_event = E_Click;<br />}<br />void key_down(void)<br />{<br />menu_event = E_Next;<br />}<br />int main(void) {<br /><br />static uint8_t k1, k2, k3;<br />static uint8_t s1_lcnt;<br />static uint8_t menu_delay;<br /><br /><br /><br />clock_buf.spacer1 = ':';<br />clock_buf.spacer2 = ':';<br /><br />DDR(KL1_PORT) &amp;= ~KL1;// Porty przycisków jako wejsciowe<br />DDR(KL2_PORT) &amp;= ~KL2;// Porty przycisków jako wejsciowe<br />DDR(KL3_PORT) &amp;= ~KL3;// Porty przycisków jako wejsciowe<br />// Podciąganie na płytce<br /><br />DDR(DLED_PORT) |= (DLED1|DLED2|DLED3);<br />PORT(DLED_PORT) &amp;= ~(DLED1|DLED2|DLED3);<br /><br />timer0_init();<br />sei();<br />lcd_init();<br />lcd_cls();<br />change_menu();<br />while(1)<br />{<br />// event 1s<br />if(s1_lcnt != s1_cnt)<br />{<br />s1_lcnt = s1_cnt;<br />// testowa dioda 1Hz<br />DLED3_TOGLE;<br /><br />// zegar programowy<br />clock_inc();<br /><br />// Jesli poza menu to odswież zegar<br />if(current_menu == 0){<br /><br /><br />update_clock_buffor(&amp;clock_buf, &amp;clock);<br />lcd_cls();<br />lcd_locate(0,4);<br />lcd_str(clock_buf.bufor);<br />lcd_locate(1,2);<br />lcd_str_P(PSTR(&quot;[Poza  MENU]&quot;));<br />}<br /><br />// automatyczne wyjscie z menu przy bezczynnosci<br />if(0 == menu_delay)<br />current_menu = 0;<br />else<br />menu_delay--;<br /><br />}<br /><br />SuperDebounce(&amp;k1, &amp;PIND, KL1, 0, 0, key_up, 0);<br />SuperDebounce(&amp;k2, &amp;PIND, KL2, 0, 0, key_click, 0);<br />SuperDebounce(&amp;k3, &amp;PINB, KL3, 0, 0, key_down, 0);<br /><br /><br /><br />if (menu_event)<br />{<br />change_menu();<br />// po 5s bezczynnosci automatyczne wyjscie z menu<br />menu_delay = 5;<br />}<br />}<br />} /* ----- end of function main ----- */<br /><br /><br /><br /><br /><br />[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br />A tak to działa:<br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=358">nixie</a> — 12 gru 2012, o 13:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-07T15:49:05+01:00</updated>
<published>2012-12-07T15:49:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20447#p20447</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20447#p20447"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20447#p20447"><![CDATA[
No już tam zablokowałem temat i dałem odnośnik z rozwiązaniem na to forum <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />, a co mi tam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. tam nie będę publikować naprawionej wersji.<br /><br />Właśnie rzeźbię menu do mojego &quot;sterownika&quot; jak córka pozwoli tj. nie będzie za bardzo absorbująca to powinienem samo menu ogarnąć dzisiaj, potem zostaje napisanie poszczególnych procedur, ale to już w tym temacie <br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic1767.html" >topic1767.html</a><!-- l -->  będę publikować.<p>Statystyki: Napisane przez Gość — 7 gru 2012, o 15:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2012-12-07T15:36:28+01:00</updated>
<published>2012-12-07T15:36:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20444#p20444</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20444#p20444"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20444#p20444"><![CDATA[
Mam nadzieję że będę mógł potestować działające Menu w ten weekend. Zapowiada się ciekawie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Swoją drogą ciekawe jak długo powisi Twoje zapytanie o nie działające menu na wiadomym portalu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=127">Sonix</a> — 7 gru 2012, o 15:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-07T13:21:46+01:00</updated>
<published>2012-12-07T13:21:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20431#p20431</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20431#p20431"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20431#p20431"><![CDATA[
Spoko, jak tylko wymyślę jak przymocować moją SLT-A33 bo nie mam statywu, to zrobię film nawet w 1080p <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />.<br /><br />Ok, wracając do tematu w załączniku wersja działająca z LCD 4x16 (jak ktoś ma 4x20 itd. może przetestować na większym) na bibliotekach Mirka, oczywiście biblioteki Mirka ładnie wycięte jak w lekcji o eepromach (sami sobie wklejcie, a co <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />)<br /><br />Listing poprawionego pliku menu.c<br /><br />[syntax=c]<br />#include &quot;menu.h&quot;<br />#include &quot;..\LCD\lcd44780.h&quot;<br />#include &lt;stddef.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define GET_ADDR(ptr, field) (void*)pgm_read_word(((uint8_t*)ptr)+offsetof(struct _menuitem, field))<br /><br /><br />const char PROGMEM txt1[]=&quot;Menu1&quot;;<br />const char PROGMEM txt2[]=&quot;Menu2&quot;;<br />const char PROGMEM txt3[]=&quot;Menu3&quot;;<br />const char PROGMEM txt4[]=&quot;Menu4&quot;;<br /><br />const char PROGMEM txt5[]=&quot;Podmenu A1&quot;;<br />const char PROGMEM txt6[]=&quot;Podmenu A2&quot;;<br />const char PROGMEM txt7[]=&quot;Podmenu A3&quot;;<br /><br />const char PROGMEM txt8[]=&quot;Podmenu B1&quot;;<br />const char PROGMEM txt9[]=&quot;Podmenu B2&quot;;<br />const char PROGMEM txt10[]=&quot;&lt;z powrotem&gt;&quot;;<br />const char PROGMEM txt11[]=&quot;F: &quot;;<br /><br /><br />static const struct _menuitem *currMenuPtr=&amp;menu;<br />static int8_t menuindex;<br />static int8_t menufirstpos;<br /><br />const struct _menuitem *GetMenuItem(uint8_t index)<br />{<br />const struct _menuitem *tmpmenuitem=currMenuPtr;<br /><br />while((tmpmenuitem) &amp;&amp; (index&gt;0))<br />{<br /> tmpmenuitem=GET_ADDR(tmpmenuitem, next);<br /> index--;<br />}<br />return tmpmenuitem;<br />}<br /><br /><br />void menufunc1()<br />{<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str_P(txt1);<br />_delay_ms(2000);<br />}<br /><br />void menufunc2()<br />{<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str_P(txt3);<br />_delay_ms(2000);<br />}<br /><br />void menufunc3()<br />{<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str_P(txt4);<br />_delay_ms(2000);<br />}<br /><br />void menufunc4()<br />{<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str_P(txt5);<br />_delay_ms(2000);<br />}<br /><br />void menufunc5()<br />{<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str_P(txt7);<br />_delay_ms(2000);<br />}<br /><br />void menufunc6()<br />{<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str_P(txt8);<br />_delay_ms(2000);<br />}<br /><br />void menufunc7()<br />{<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str_P(txt9);<br />_delay_ms(2000);<br />}<br /><br /><br />const struct _menuitem menu;<br />const struct _menuitem menuA1;<br />const struct _menuitem menuB1;<br /><br />const struct _menuitem menuB3 PROGMEM = {txt10, Menu_Back, &amp;menuB1, 0, 0};<br />const struct _menuitem menuB2 PROGMEM = {txt9, menufunc7, &amp;menuB1, 0, &amp;menuB3};<br />const struct _menuitem menuB1 PROGMEM = {txt8, menufunc6, &amp;menuA1, 0, &amp;menuB2};<br /><br />const struct _menuitem menuA4 PROGMEM = {txt10, Menu_Back, &amp;menuA1, 0, 0};<br />const struct _menuitem menuA3 PROGMEM = {txt7, menufunc5, &amp;menuA1, 0, &amp;menuA4};<br />const struct _menuitem menuA2 PROGMEM = {txt6, 0, &amp;menuA1, &amp;menuB1, &amp;menuA3};<br />const struct _menuitem menuA1 PROGMEM = {txt5, menufunc4, &amp;menu, 0, &amp;menuA2};<br /><br />const struct _menuitem menu3 PROGMEM = {txt4, menufunc3, &amp;menu, 0, 0};<br />const struct _menuitem menu2 PROGMEM = {txt3, menufunc2, &amp;menu, 0, &amp;menu3};<br />const struct _menuitem menu1 PROGMEM = {txt2, 0, &amp;menu, &amp;menuA1, &amp;menu2};<br />const struct _menuitem menu PROGMEM = {txt1, menufunc1, 0, 0, &amp;menu1};<br /><br />/*bool Menu_isOnList(struct _menuitem *parent, struct _menuitem *item)<br />{<br />while(parent)<br />{<br />if(parent==item) return true;<br />parent=GET_ADDR(parent, next);<br />}<br />return false;<br />}<br /><br />bool Menu_isSubmenu(struct _menuitem *mi)<br />{<br />struct _menuitem *parent=GET_ADDR(mi, parent);<br />if(Menu_isOnList(parent, mi)==true)<br /> {<br />if(GET_ADDR(parent, parent)) return true;<br />     } else return true;<br />return false;<br />}*/<br /><br />void Menu_Show()<br />{<br />const struct _menuitem *tmpmenuitem=GetMenuItem(menufirstpos);<br /><br />for(uint8_t i=0;i&lt;LCD_Y;i++)<br />{<br />uint8_t charcnt=1;<br />lcd_locate(i,0);// Dla bibliotek Mirka lcd_locate(y,x)<br /><br />if((i+menufirstpos)==menuindex) lcd_char('&gt;'); else lcd_char(' ');<br />if(GET_ADDR(tmpmenuitem, text)&amp;&amp;tmpmenuitem) // Modyfikacja dzięki koledze Krauser<br />{<br />lcd_str_P(GET_ADDR(tmpmenuitem, text));<br />charcnt+=strlen_P(GET_ADDR(tmpmenuitem, text));<br />}<br />if(GET_ADDR(tmpmenuitem, submenu) &amp;&amp; tmpmenuitem) // Modyfikacja dzięki koledze Krauser<br />{<br />lcd_char(0x7E);<br />charcnt++;<br />}<br />for(;charcnt&lt;LCD_X;charcnt++) lcd_char(' '); //Wyczyść resztę wyświetlanej linii<br />tmpmenuitem=GET_ADDR(tmpmenuitem, next);<br /><br />}<br />}<br /><br />void Menu_SelectNext()<br />{<br />if(GetMenuItem(menuindex+1)!=0)<br /> {<br />  menuindex++;<br />  if((menuindex-menufirstpos)&gt;=LCD_Y) menufirstpos++;<br /> } else<br /> {<br />  menuindex=0;<br />  menufirstpos=0;<br />     }<br />Menu_Show();<br />}<br /><br />void Menu_SelectPrev()<br />{<br />        if(menuindex&gt;0)<br />         {<br />          menuindex--;<br />          if(menuindex&lt;menufirstpos) menufirstpos--;<br />         }<br />         else<br />         {<br />          const struct _menuitem *tmpmenuitem=currMenuPtr;<br />          while(tmpmenuitem)<br />          {<br />           tmpmenuitem=GET_ADDR(tmpmenuitem,next);<br />           if(tmpmenuitem) menuindex++;<br />          }<br />          menufirstpos=menuindex-(LCD_Y-1); //drobna modyfikacja<br />          if(menufirstpos&lt;0) menufirstpos=0;<br />     }<br />        Menu_Show();<br />}<br /><br /><br />void Menu_Back()<br />{<br />const struct _menuitem *tmpMenuPtr=GET_ADDR(currMenuPtr, parent);<br />menufirstpos=0;<br />menuindex=0;<br />currMenuPtr=tmpMenuPtr;<br />}<br /><br />void Menu_Click()<br />{<br />const struct _menuitem *tmpmenuitem=GetMenuItem(menuindex);<br />const struct _menuitem *submenu=GET_ADDR(tmpmenuitem, submenu);<br /><br />    menuitemfuncptr mfptr=GET_ADDR(tmpmenuitem, menuitemfunc);<br />if(mfptr) (*mfptr)();<br />if(submenu) <br /> {<br />  currMenuPtr=submenu;<br />  menuindex=0;<br />  menufirstpos=0;<br />     }<br />    Menu_Show();<br />}<br /><br />[/syntax]<br /><br />Nie wklejam ponownie wersji z bibliotekami z książki TF, bo szczerze, to są za przeproszeniem gówno warte..... nie wyświetlają stringów po wskaźnikach, bajzel w nich niesamowity, rozdzielone to to na 5plików nie wiadomo po co, po drugie menu na nich dalej nie działa jak powinno, bo po zmianach wyświetla się jak na 2x16, w dodatku dwóch pierwszych wierszy nie widać bo wszystko jest przesunięte o dwa wiersze do góry. Jestem naprawdę zniesmaczony iż niesprawdzone biblioteki zostają opublikowane.... helion już dawno zaczął olewać czytelników.... forum Tomka nie istnieje, a dondu się puszy na elce i elportal jak paw......i weź tu potem walcz z bugami.<br /><br />Dobrze, ze istnieje to forum, bo bym chyba sobie żyły podciął analizując te nieszczęsne struktury <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br />Tu proszę, dwa dni tematu i już wszystko działa, dzięki koledze Krauser.<br />Wychodzi na to, że ksiażka TF jest wydrukowana na papierze toaletowym i tylko do tego się nadaje <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />.....ależ jestem zły.<p>Statystyki: Napisane przez Gość — 7 gru 2012, o 13:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2012-12-07T12:55:15+01:00</updated>
<published>2012-12-07T12:55:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20426#p20426</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20426#p20426"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20426#p20426"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Z filmem będzie gorzej, bo na jellybean nie działa mi kamerka w motce.<br /></div><br /><br />ok niech beda zdjecia <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=110">jachu</a> — 7 gru 2012, o 12:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-07T12:48:46+01:00</updated>
<published>2012-12-07T12:48:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20425#p20425</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20425#p20425"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20425#p20425"><![CDATA[
Z filmem będzie gorzej, bo na jellybean nie działa mi kamerka w motce.<p>Statystyki: Napisane przez Gość — 7 gru 2012, o 12:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2012-12-07T12:45:18+01:00</updated>
<published>2012-12-07T12:45:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20424#p20424</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20424#p20424"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20424#p20424"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Spoko, spoko, wrzucę, na wersję na Mirkowych bibliotekach, na TFa jak będzie działać, a potem w innym temacie wrzucę z obsługą DS18B20 bo pewnie jeszcze po drodze będzie 1000pytań <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /></div><br /><br />I nie zapomnij o ladnym filmiku z dzialania na LCD <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=110">jachu</a> — 7 gru 2012, o 12:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-07T12:00:40+01:00</updated>
<published>2012-12-07T12:00:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20414#p20414</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20414#p20414"/>
<title type="html"><![CDATA[Re: Menu na strukturach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1861&amp;p=20414#p20414"><![CDATA[
Spoko, spoko, wrzucę, na wersję na Mirkowych bibliotekach, na TFa jak będzie działać, a potem w innym temacie wrzucę z obsługą DS18B20 bo pewnie jeszcze po drodze będzie 1000pytań <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 7 gru 2012, o 12:00</p><hr />
]]></content>
</entry>
</feed>