<?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=4&amp;t=7770&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-07-14T17:22:31+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7770&amp;mode</id>
<entry>
<author><name><![CDATA[dawidek034]]></name></author>
<updated>2014-07-14T17:22:31+01:00</updated>
<published>2014-07-14T17:22:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7770&amp;p=87581#p87581</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7770&amp;p=87581#p87581"/>
<title type="html"><![CDATA[Menu na LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7770&amp;p=87581#p87581"><![CDATA[
Witam.<br /><br />Problem polega na przypisaniu funkcji do jednej z pozycji menu. Mianowicie napisałem sobie funkcje, które to mają przyciemniać i rozjaśniać diodę LED oraz wyświetlać informacje na wyświetlaczu o aktualnym poziomie natężenia światła diody. Poniżej przedstawię cały program do obsługi:<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 />#include &lt;string.h&gt;<br /><br />#include &quot;Keys/keys.h&quot;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;main.h&quot;<br /><br />uint8_t key1_lock, key2_lock;<br /><br />volatile uint8_t x_y = 3;<br />volatile uint8_t STALA = 100;<br />volatile uint8_t STALA1 = 0;<br />volatile uint8_t s1_flag, sekundy;<br />volatile int16_t T_ustaw = 0;<br /><br />int main(void) {<br /><br />lcd_defchar_P(0xFF, znak_kwadrat);  //&lt;-- definicja znaku<br />PORTC |= KEY_DOWN | KEY_UP;<br /><br />DDRD |= LED | LED1;<br />//PORTD |= LED | LED1;<br />_delay_ms(10);<br /><br />ISR_Settings();<br />lcd_init();<br />sei();<br /><br />while(1) {<br />key_press(&amp;key1_lock, &amp;PINC, KEY_DOWN, brightness_DOWN);<br />key_press(&amp;key2_lock, &amp;PINC, KEY_UP, brightness_UP);<br /><br />}<br />}<br /><br />void brightness_UP(void) {<br /><br />text_brightness();// &lt;-- funkcja od stalych napisow na LCD<br />T_ustaw+= 10;<br />if(T_ustaw &gt; STALA) {<br />T_ustaw = STALA;<br />}<br /><br />lcd_locate(0,9);<br />lcd_int(T_ustaw);<br />draw_UP();<br />}<br /><br />void draw_DOWN(void) {<br />if(x_y &gt; 3 ) {<br />lcd_locate(1,--x_y);<br />lcd_str(&quot;  &quot;);<br />}<br />}<br /><br />void draw_UP( void ) {<br />if(x_y &lt; 13) {<br />lcd_locate(1,x_y++);<br />lcd_str_P(PSTR(&quot;\xFF&quot;));<br />}<br />}<br /><br />void brightness_DOWN(void) {<br /><br />text_brightness();// &lt;-- funkcja od stalych napisow na LCD<br />T_ustaw-= 10;<br /><br />if(T_ustaw &lt; STALA1) {<br />T_ustaw = -0;<br />}<br />if(T_ustaw &lt;= 10) {<br />lcd_locate(0,10);<br />lcd_str_P(PSTR(&quot; &quot;));<br />}<br /><br />if(T_ustaw &lt;= 100) {<br />lcd_locate(0,11);<br />lcd_str_P(PSTR(&quot; &quot;));<br />}<br /><br />lcd_locate(0,9);<br />lcd_int(T_ustaw);<br />draw_DOWN();<br />}<br /><br />void text_brightness(void) {<br />lcd_locate(0,1);<br />lcd_str(&quot;Jasnosc: &quot;);<br />lcd_locate(1,1);<br />lcd_char('-');<br />lcd_locate(1,14);<br />lcd_char('+');<br />}<br /><br />void ISR_Settings(void) {<br />TCCR2  |= (1&lt;&lt;WGM21);<br />TCCR2  |= (1&lt;&lt;CS20);<br />OCR2  = 200;<br />TIMSK  = (1&lt;&lt;OCIE2);<br />}<br /><br />ISR(TIMER2_COMP_vect) {<br /><br />static uint8_t cnt; //każde przerwanie odbywa co 10ms<br /><br />/*Tutaj jasnosc swiecenia  diody*/<br />if(cnt &gt;= T_ustaw)<br />PORTD &amp;=~ LED;<br />else<br />PORTD |= LED;<br />}[/syntax]<br />Program działa tak, że gdy naciskam klawisz: key_up to dioda świeci coraz to jaśniej, a klawisz key_down zmniejsza ten efekt. Teraz chciałbym dodać te funkcje do jednego z stanów w automacie do obsługi menu. Wygląda on tak:<br />[syntax=c]typedef struct {<br />uint8_t next_state&#91;4&#93;;//przejścia do następnych stanów<br />void (*callback)(uint8_t event);//funkcja zwrotna<br />uint8_t* pierwszyWiersz;<br />uint8_t* drugiWiersz;<br />} menu_item;<br /><br /><br />enum {<br />Hello,<br />Menu1,<br />SubMenu1_1,<br />SubMenu1_1_1,<br />Submenu1_2,<br />SubMenu1_2_1,<br />Menu2,<br />Menu3<br />} ;<br /><br /><br />const menu_item menu&#91;&#93; = {<br />//Iddle,Prev, Click,Next<br />{{Hello, Menu1, Menu1, Menu1}, NULL,NULL, NULL},<br />{{Menu1, Menu1, Menu2, SubMenu1_1}, NULL, MN01,MN02},<br />{{SubMenu1_1, Menu1, Submenu1_2, SubMenu1_1_1},NULL, subMN01_1, subMN01_2},<br />{{SubMenu1_1_1, SubMenu1_1, SubMenu1_1_1, SubMenu1_1_1},NULL,NULL, NULL},<br />{{Submenu1_2, Menu1, SubMenu1_1, SubMenu1_2_1}, NULL, subMN01_2, subMN01_1},<br />{{SubMenu1_2_1, Submenu1_2, SubMenu1_2_1, SubMenu1_2_1}, menuiddle,NULL,NULL},<br />{{Menu2, Menu2, Menu3, Menu2}, NULL, MN02, MN03},<br />{{Menu3, Menu3, Menu1, Menu3}, NULL, MN03, MN01},<br /><br />};[/syntax]<br /><br />Cały problem polega na tym,że nie potrafię dodać obu funkcji do jednego stanu z menu przykładowo:<br />- jestem w stanie SubMenu1_2_1 i chciałbym sterować diodą. Działa tylko wtedy jedna funkcja zwiększanie lub zmniejszanie jasności świecenia diody. Czy ktoś ma jakiś pomysł jak można się do tego dalej zabrać? Dodam jeszcze fragmenty kodu odpowiedzialnego za poruszanie się po menu:<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;klawisz/klawisz.h&quot;<br />#include &quot;menu.h&quot;<br />#include &quot;LCD/lcd44780.h&quot; //biblioteka_LCD<br /><br />#define E_IDDLE 0<br />#define E_Prev 1<br />#define E_Select 2<br />#define E_Next 3<br /><br /><br />volatile  uint8_tcurrent_menu = 0;<br />volatile  uint8_tmenu_event = E_IDDLE;<br /><br />void testy(uint8_t event);<br />uint8_t key1_lock, key2_lock, key3_lock;<br /><br /><br /><br />/*POCZATEK_FUNKCJI_MAIN*/<br />int main(void) {<br />DDRD |= (1&lt;&lt;PD7);<br />PORTD &amp;=~(1&lt;&lt;PD7);<br />//DDRC |= (1&lt;&lt;PC7);<br /><br />PORTC |= KEY1 | KEY2 | KEY3;<br /><br />TCCR2  |= (1&lt;&lt;WGM21);<br />TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);<br />OCR2  = 108;<br />TIMSK  = (1&lt;&lt;OCIE2);<br /><br />lcd_init();<br />sei();<br /><br /><br /><br />/*POCZATEK_PETLI_WHILE*/<br />while(1) {<br />key_press( &amp;key1_lock, &amp;PINC, KEY1, up );<br />key_press( &amp;key2_lock, &amp;PINC, KEY2, down );<br />key_press( &amp;key3_lock, &amp;PINC, KEY3, ok );<br /><br /><br /><br />if(menu_event) {<br />zmianaMENU();<br />}<br /><br /><br />switch(current_menu) {<br /><br />case SubMenu1_2_1:<br />menuiddle(E_Next);<br />break;<br />}<br /><br />}<br />/*KONIEC_PETLI_WHILE*/<br /><br /><br />}<br />/*KONIEC_FUNKCJI_MAIN*/<br /><br /><br /><br />void up(void) {<br />menu_event=E_Prev;<br />}<br />void down(void) {<br />menu_event=E_Next;<br />}<br />void ok(void) {<br />menu_event=E_Select;<br />}<br /><br /><br />void zmianaMENU() {<br />current_menu = menu&#91;current_menu&#93;.next_state&#91;menu_event&#93;;<br />lcd_cls();<br />//wyświetl 1-szą linię<br />if (menu&#91;current_menu&#93;.pierwszyWiersz) {<br />lcd_locate(0,1);<br />lcd_str_P((char*)menu&#91;current_menu&#93;.pierwszyWiersz);<br />}<br />//wyświetl 2-gą linię<br />if (menu&#91;current_menu&#93;.drugiWiersz) {<br />lcd_locate(1,1);<br />lcd_str_P((char*)menu&#91;current_menu&#93;.drugiWiersz);<br />}<br />//wywolaj funkcje zwrotna<br />if (menu&#91;current_menu&#93;.callback)<br />menu&#91;current_menu&#93;.callback(menu_event);<br /><br />//skasuj zdarzenie<br />menu_event = E_IDDLE;<br />}<br /><br /><br />ISR(TIMER2_COMP_vect) {<br />uint16_t n;<br /><br />n = Timer3;<br />if(n)<br />Timer3 = --n;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1862">dawidek034</a> — 14 lip 2014, o 17:22</p><hr />
]]></content>
</entry>
</feed>