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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-12-22T18:57:58+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=21750&amp;mode</id>
<entry>
<author><name><![CDATA[Gammadion]]></name></author>
<updated>2018-12-22T18:57:58+01:00</updated>
<published>2018-12-22T18:57:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21750&amp;p=214944#p214944</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21750&amp;p=214944#p214944"/>
<title type="html"><![CDATA[Menu LCD z użyciem instrukcji switch]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21750&amp;p=214944#p214944"><![CDATA[
Witam,<br /><br />jestem początkujący w tych tematach i mam problem odnośnie &quot;dokończenia&quot; menu. <br />W instrukcji &quot;switch&quot; na podstawie 4 przycisków micro-switch: ENTER, UP, DOWN, CANCEL - chciałbym poruszać się w menu wedle przeznaczenia przycisków.<br />Wyświetlacz mam HD44780 4x20.<br />Najbardziej nie wiem jak stworzyć funkcję, która pozwoli mi sprawdzić położenie kursora i zmienić położenie w tym samym poziomie menu (czyli przyciski UP, DOWN). <br />Wiem, że temat menu na forum jest już oklepany, natomiast metod jest wiele i nie wszystkie rozumiem, a zacząłem już tworzyć program wg. własnego sposobu, który też zaczerpnąłem od znajomego. Będę wdzięczny za wszelką pomoc. <br /><br />main.h<br />[syntax=c]extern const char main_menu_str&#91;&#93;;<br />typedef char PROGMEM menuname;<br />typedef struct mulitline menu;<br />const char main_menu_str&#91;&#93; PROGMEM = {&quot;CENTRALA WENTYLACYJNA&quot;};<br /><br />       // ----------------MENU--------------<br />       const char MN00&#91;&#93; PROGMEM=&quot;PRACA DYPLOMOWA&quot;;<br />         const char MN01&#91;&#93; PROGMEM=&quot;ZARZĄDZANIE CENTRALĄ&quot;;<br />         const char MN02&#91;&#93; PROGMEM=&quot;PODGLĄD SYSTEMU&quot;;<br />         const char MN03&#91;&#93; PROGMEM=&quot;USTAWIENIA DATY I GODZINY&quot;;<br />         const char MN04&#91;&#93; PROGMEM=&quot;PROGRAMATOR&quot;;<br />           const char MN05&#91;&#93; PROGMEM=&quot;PRACA POM 1&quot;;<br />           const char MN06&#91;&#93; PROGMEM=&quot;PRACA POM 2&quot;;<br />           const char MN07&#91;&#93; PROGMEM=&quot;STOP POM 1&quot;;<br />           const char MN08&#91;&#93; PROGMEM=&quot;STOP POM 2&quot;;<br />           const char MN09&#91;&#93; PROGMEM=&quot;NASTAWA TEMP 1&quot;;<br />           const char MN10&#91;&#93; PROGMEM=&quot;NASTAWA TEMP 2&quot;;<br />           const char MN11&#91;&#93; PROGMEM=&quot;ZABLOKUJ USERA 1&quot;;<br />           const char MN12&#91;&#93; PROGMEM=&quot;ZABLOKUJ USERA 2&quot;;<br />           const char MN13&#91;&#93; PROGMEM=&quot;USTAW ZAKRES TEMP&quot;;<br />           const char MN14&#91;&#93; PROGMEM=&quot;TEMPERATURA POM 1&quot;;<br />           const char MN15&#91;&#93; PROGMEM=&quot;TEMPERATURA POM 2&quot;;<br />           const char MN16&#91;&#93; PROGMEM=&quot;TEMPERATURA WYMIENNIKA&quot;;<br />           const char MN17&#91;&#93; PROGMEM=&quot;PRACA WENTYLATORA&quot;;<br />           const char MN18&#91;&#93; PROGMEM=&quot;PRACA NAGRZEWNIC&quot;;<br />           const char MN19&#91;&#93; PROGMEM=&quot;STAN POLOZENIA PRZEPUSTNIC&quot;;<br />           const char MN20&#91;&#93; PROGMEM=&quot;DATA&quot;;<br />           const char MN21&#91;&#93; PROGMEM=&quot;GODZINA&quot;;<br />           const char MN22&#91;&#93; PROGMEM=&quot;USTAW CZAS WLACZENIA&quot;;<br />           const char MN23&#91;&#93; PROGMEM=&quot;USTAW CZAS WYLACZENIA&quot;;[/syntax]<br /><br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &quot;LCD/lcd.h&quot;<br />#include &quot;LCD/menu.h&quot;<br /><br /><br />static void (*main_menu)();<br />void register_main_menu (void (*callback)()){<br />main_menu=callback;<br /><br />}<br /><br /><br />void menu0(void) { // menu glowne 0x0000<br /><br />lcd_write_cmd(HD44780_CLS); // czyszczenie wyswietlacza<br />lcd_write_cmd(HD44780_ONOFF|HD44780_CURSOR_ON); // wlaczenie wyswietlacza, wlaczenie kursora<br />lcd_locate(0,0);<br />lcd_str_P(MN01);<br />    lcd_locate(1,0);<br />    lcd_str_P(MN02);<br />    lcd_locate(2,0);<br />    lcd_str_P(MN03);<br />    lcd_locate(3,0);<br />    lcd_str_P(MN04);<br />    lcd_write_cmd( HD44780_ONOFF|HD44780_DISPLAY_ON ); // wlaczenie wyswietlacza<br />};<br /><br />void menu1(void){ // podmenu ZARZADZANIE CENTRALA 0x1000<br /><br />lcd_write_cmd(HD44780_CLS);<br />lcd_write_cmd(HD44780_ONOFF|HD44780_CURSOR_ON);<br />lcd_locate(0,0);<br />lcd_str_P(MN05);<br />lcd_locate(1,0);<br />lcd_str_P(MN06);<br />lcd_locate(2,0);<br />lcd_str_P(MN07);<br />lcd_locate(3,0);<br />lcd_str_P(MN08);<br />lcd_write_cmd( HD44780_ONOFF|HD44780_DISPLAY_ON );<br /><br /><br />};<br /><br />void menu2(void){ // podmenu PODGLAD SYSTEMU 0x2000<br /><br />lcd_write_cmd(HD44780_CLS);<br />lcd_write_cmd(HD44780_ONOFF|HD44780_CURSOR_ON);<br />lcd_locate(0,0);<br />lcd_str_P(MN14);<br />lcd_locate(1,0);<br />lcd_str_P(MN15);<br />lcd_locate(1,0);<br />lcd_str_P(MN16);<br />lcd_locate(1,0);<br />lcd_str_P(MN17);<br />lcd_write_cmd( HD44780_ONOFF|HD44780_DISPLAY_ON );<br /><br />};<br /><br />void menu3(void){ // podmenu USTAWIENIA DATY I GODZINY 0x3000<br /><br />lcd_write_cmd(HD44780_CLS);<br />lcd_write_cmd(HD44780_ONOFF|HD44780_CURSOR_ON);<br />lcd_locate(0,0);<br />lcd_str_P(MN20);<br />lcd_locate(1,0);<br />lcd_str_P(MN21);<br />lcd_write_cmd( HD44780_ONOFF|HD44780_DISPLAY_ON );<br />};<br /><br />void menu4(void){ // podmenu PROGRAMATOR<br /><br />lcd_write_cmd(HD44780_CLS);<br />lcd_write_cmd(HD44780_ONOFF|HD44780_CURSOR_ON);<br />lcd_locate(0,0);<br />lcd_str_P(MN22);<br />lcd_locate(1,0);<br />lcd_str_P(MN23);<br />lcd_write_cmd( HD44780_ONOFF|HD44780_DISPLAY_ON );<br /><br />};[/syntax]<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &quot;przyciski.h&quot;<br />#include &quot;LCD/lcd.h&quot;<br />#include &quot;LCD/menu.h&quot;<br /><br /><br />#define EEMEM __attribute__((section(&quot;.eeprom&quot;)))<br />#define LED_PIN (1&lt;&lt;PC7 | PC6 | PC5)   // definicja pinu do którego podłączona jest dioda<br />#define LED_ON PORTC &amp;= ~LED_PIN// makrodefinicja – załączenie diody<br />#define LED_OFF PORTC |= LED_PIN// makrodefinicja – wyłączenie diody<br /> const uint8_t znak_buzka&#91;&#93; PROGMEM = {14,17,27,17,17,21,17,14};// wzór znaku buźki w pamięci FLASH<br />int main (void) {<br /><br /><br />        DDRD |= (1&lt;&lt;PA7); // ustawienie kierunku linii podświetlenia LCD jako wyjście<br />PORTD |= (1&lt;&lt;PA7); // stan wysoki LCD - podświetlenie<br /><br /><br /><br />    lcd_defchar(0x80, znak_L);<br />    lcd_defchar(0x81, znak_buzka);<br /><br />//    lcd_locate(0,0);<br />//    lcd_str(&quot;***MENU G\x80OWNE***&quot;);<br /><br /><br />//Ustawienie przyciskow jako wejscia<br />DDR(KEY1_PORT) &amp;= ~ (KEY1_UP);<br />DDR(KEY2_PORT) &amp;= ~ (KEY2_DOWN);<br />DDR(KEY3_PORT) &amp;= ~ (KEY3_ENTER);<br />DDR(KEY4_PORT) &amp;= ~ (KEY4_CANC);<br /><br />//Podciągniecie do VCC - stan wysoki<br />PORTD |= (KEY1_UP);<br />        PORTD |= (KEY2_DOWN);<br />        PORTD |= (KEY3_ENTER);<br />        PORTD |= (KEY4_CANC);<br /><br /><br />        DDRC |= LED_PIN;// kierunek pinu – wyjściowy<br /><br /><br />        char multilinemenu;<br />        sei();<br /><br />        lcd_init();<br />        lcd_cls();<br /><br /><br />while(1){<br /><br />menu_lcd(multilinemenu); // wyswietlenie odpowiedniej pozycji menu<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;***CENTRALA WENTYLACYJNA***&quot;);<br />lcd_locate(1,0);<br />lcd_str(&quot;NACISNIJ DOWOLNY KLAWISZ&quot;);<br /><br /><br />if (KEY1_UP | KEY2_DOWN | KEY3_ENTER | KEY4_CANC == 1){<br />menu0();<br />lcd_str_(0x81);<br />lcd_locate(0,16); // pozycja kursora domyslnie ustawia sie na pozycji: ZARZADZANIE CENTRALA<br />};<br /><br /><br />switch(multilinemenu){<br /><br /><br /><br />case 0x0100: // przejscie kursora w gore na: ZARZADZANIE CENTRALA<br />if (KEY1_UP == 1){<br />_delay_ms(200);<br />        menu0();<br />        lcd_str_(0x81); // ustawienie pozycji kursora<br />        lcd_locate(0,16);<br />};<br />break;<br /><br />case 0x0200: // przejscie kursora w gore na : PODGLAD SYSTEMU<br />if (KEY1_UP == 1){<br />_delay_ms(200);<br />menu0();<br />lcd_str_(0x81);<br />lcd_locate(1,16);<br />    };<br />break;<br /><br />case 0x0300: // przejscie kursora w gore na : USTAWIENIA DATY I GODZINY<br />if (KEY1_UP == 1){<br />menu0();<br />lcd_str_(0x81);<br />lcd_locate(2,16);<br />};<br />break;<br /><br />case 0x0400: // przejscie kursora w gore na : PROGRAMATOR<br />if (KEY1_UP == 1){<br />    menu0();<br />lcd_str_(0x81);<br />lcd_locate(3,16);<br />};<br />break;<br /><br />case 0x0500: // przejscie kursora w dol na : ZARZADZANIE CENTRALA<br />if (KEY2_DOWN == 1){<br />menu0();<br />lcd_str_(0x81);<br />lcd_locate(0,16);<br />};<br />break;<br /><br />case 0x0600: // przejscie kursora w dol na : PODGLAD SYSTEMU<br />if (KEY2_DOWN == 1){<br />menu0();<br />lcd_str_(0x81);<br />lcd_locate(1,16);<br />};<br />break;<br /><br />case 0x0700: // przejscie kursora w dol na : USTAWIENIA DATY I GODZINY<br />if (KEY2_DOWN == 1){<br />menu0();<br />lcd_str_(0x81);<br />lcd_locate(2,16);<br />};<br />break;<br /><br />case 0x0700: // przejscie kursora w dol na : USTAWIENIA DATY I GODZINY<br />if (KEY2_DOWN == 1){<br />menu0();<br />lcd_str_(0x81);<br />lcd_locate(3,16);<br />};<br />break;<br /><br /><br />case 0x1000: // przejscie do podmenu : ZARZADZANIE CENTRALA<br />if (KEY3_ENTER == 1){<br />menu1();<br />lcd_str_(0x81);<br />lcd_locate(0,16);<br />};<br />break;<br /><br />case 0x2000: // przejscie do podmenu : PODGLAD SYSTEMU<br />if (KEY3_ENTER == 1){<br />menu2();<br />lcd_str_(0x81);<br />lcd_locate(0,16);<br />};<br />break;<br /><br />case 0x3000: // przejscie do podmenu : USTAWIENIA DATY I GODZINY<br />if (KEY3_ENTER == 1){<br />menu3();<br />lcd_str_(0x81);<br />lcd_locate(0,16);<br />};<br />break;<br /><br />case 0x4000: // przejscie do podmenu : PODGLAD SYSTEMU<br />if (KEY3_ENTER == 1){<br />menu4();<br />lcd_str_(0x81);<br />lcd_locate(0,16);<br />};<br />break;<br /><br />case 0x5000: // przejscie do podmenu : PODGLAD SYSTEMU<br />if (KEY4_CANC == 1){<br />menu2();<br />lcd_str_(0x81);<br />lcd_locate(0,16);<br />};<br />break;<br />// pozostale case'y do dokonczenia<br /><br />}<br /><br />}<br /><br />        return(0);<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20433">Gammadion</a> — 22 gru 2018, o 18:57</p><hr />
]]></content>
</entry>
</feed>