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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2022-06-19T19:08:01+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=24256&amp;mode</id>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2022-06-19T19:08:01+01:00</updated>
<published>2022-06-19T19:08:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24256&amp;p=235661#p235661</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24256&amp;p=235661#p235661"/>
<title type="html"><![CDATA[Tworzenie menu na lcd - Prosta wersja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24256&amp;p=235661#p235661"><![CDATA[
Staram się ogarnąć od podstaw jak w prosty i w miarę przejrzysty sposób zrobić proste Menu na wyświetlacz. Menu opisałem strukturą i kod wygląda tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &quot;lcd.h&quot;<br /><br /><br />#define PREV PD0 // definicje preprocesora - klawisze<br />#define OK PD6<br />#define UP PD5<br />#define DOWN PD7<br /><br />int frame; // zmienne na potrzeby properties<br />int baud;<br /><br />void Rs232_fun(void); // funkcje <br />void PWM_fun(void);<br />void Motor_fun(void);<br />void Network_fun(void);<br />void motor_setting(void);<br />void main_menu(void);<br /><br />typedef void (*menu_func)(void); // wskaznik na funkcje<br /><br />typedef struct { // typ strukturalny opisujacy menu<br />char *tekst;<br />int properties;<br />menu_func func;<br />}menu_t;<br /><br /> menu_t menu1&#91;&#93; = { // Utworzenie nowej zmiennej typu menu_t - menu glowne<br />{&quot;RS232&quot;,(int)&amp;frame,Rs232_fun},<br />{&quot;PWM&quot;,0 ,PWM_fun},<br />{&quot;Motor&quot;,0,motor_setting},<br />{&quot;Network&quot;,0,Network_fun},<br />};<br /> menu_t menu2&#91;&#93; = { // podmenu funkcji motor<br />{&quot;FRAME&quot;,0 ,Motor_fun},<br />{&quot;BAUD&quot;,0,Network_fun},<br />{&quot;BACK&quot;,0, main_menu},<br />};<br /><br />void draw_menu (menu_t *menu, int menu_size,int sel); // deklaracje funkcji<br />void use_menu( menu_t *menu, int menu_size);<br /><br />uint8_t keylock&#91;4&#93;; // tablica pomocniczna do klawiszy<br />int sel=0; // zmienna podznaczania wyboru menu<br /><br /><br />int main(){<br /><br />DDRD |= (1&lt;&lt;PD1);<br />PORTD |= (1&lt;&lt;PREV)|(1&lt;&lt;OK)|(1&lt;&lt;UP)|(1&lt;&lt;DOWN);<br />lcd_init();<br /><br />while(1){<br /><br />use_menu(menu1,4);<br />   }<br />}<br />void draw_menu (menu_t *menu, int menu_size,int sel){ // funkcja rysujaca menu na LCD<br />int i;<br />for (i=0;i&lt;menu_size;i++){<br />if (i == sel){<br />lcd_locate(i,0);<br />lcd_char('&gt;');<br />}<br />else{<br />lcd_locate(i,0);<br />lcd_char(' ');<br />}<br />lcd_locate(i,1);<br />lcd_str(menu&#91;i&#93;.tekst);<br />if(menu&#91;i&#93;.properties&gt;0){<br />lcd_locate(i,10);<br />lcd_int(menu&#91;i&#93;.properties);<br />}<br /><br />}<br />}<br />void use_menu( menu_t *menu, int menu_size){ // funkcja nadrzędna, z obsluga klawiszy<br /><br />while(1){<br />draw_menu(menu,menu_size,sel);<br />if(!keylock&#91;0&#93; &amp;&amp; !(PIND &amp; (1&lt;&lt;DOWN))){<br />keylock&#91;0&#93;=220;<br />sel++;<br />if(sel&gt;menu_size-1)sel=0;<br />}else if (keylock&#91;0&#93; &amp;&amp; (PIND &amp; (1&lt;&lt;DOWN)))keylock&#91;0&#93;++;<br /><br />if(!keylock&#91;1&#93; &amp;&amp; !(PIND &amp; (1&lt;&lt;UP))){<br />keylock&#91;1&#93;=220;<br />sel--;<br />if(sel&lt;0)sel=menu_size-1;<br />}else if (keylock&#91;1&#93; &amp;&amp; (PIND &amp; (1&lt;&lt;UP)))keylock&#91;1&#93;++;<br /><br /><br />if(!keylock&#91;2&#93; &amp;&amp; !(PIND &amp; (1&lt;&lt;OK))){<br />keylock&#91;2&#93;=220;<br />menu&#91;sel&#93;.func();<br />}else if (keylock&#91;2&#93; &amp;&amp; (PIND &amp; (1&lt;&lt;OK)))keylock&#91;2&#93;++;<br /><br />if(!keylock&#91;3&#93; &amp;&amp; !(PIND &amp; (1&lt;&lt;PREV))){<br />keylock&#91;3&#93;=220;<br /><br />}else if (keylock&#91;3&#93; &amp;&amp; (PIND &amp; (1&lt;&lt;PREV)))keylock&#91;3&#93;++;<br />}<br />}<br /><br />void main_menu(void){<br />lcd_cls();<br />use_menu(menu1,4);<br />}<br />void motor_setting(void){<br />lcd_cls();<br />use_menu(menu2,3);<br />}<br />void Rs232_fun(void){<br />PORTD |= (1&lt;&lt;PD1);<br />}<br />void PWM_fun(void){<br />PORTD &amp;=~ (1&lt;&lt;PD1);<br />}<br />void Motor_fun(void){<br />}<br />void Network_fun(void){<br />}[/syntax]<br />Mój problem polega na tym, że początkowo wyświetlałem samo menu, bez properties. Wszystko działało jak należy. Jednak chciałem ogarnąć, abym w którymś menu/podmenu wyświetlał wartość jakieś zmiennej i mógł ją zmieniać. Obojętnie co by to było np: jasność świecenia diody w menu PWM. <br />[syntax=c]{&quot;RS232&quot;,9600,Rs232_fun},[/syntax]<br />Kiedy na sztywno wpisuje jakąś wartość wszystko wyświetla się OK, jednak gdy zaczynam bawić się zmiennymi coś się zaczyna komplikować i myślę, że czegoś tu nie rozumiem.<br />Gdy napisze to w ten sposób :<br />[syntax=c]{&quot;RS232&quot;,frame,Rs232_fun},[/syntax]<br />dostaje error: Dostaje error : main.c:33:12: error: initializer element is not constant<br /><br />więc dodaje operator &amp;<br />[syntax=c]{&quot;RS232&quot;,&amp;frame,Rs232_fun},[/syntax]<br />i dostaje warning :  warning: initialization makes integer from pointer without a cast [-Wint-conversion]<br /><br />więc robię jawne rzutowanie <br />[syntax=c]{&quot;RS232&quot;,(int)&amp;frame,Rs232_fun},[/syntax]<br />Wtedy kompilacja przechodzi bez błędów, ale na LCD dostaje wartość 298, zamiast 9600. Gdy zmienna frame będzie miała wartość 0, to wyświetla mi wartość 348.  Kompletnie nie wiem, o co tu chodzi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 19 cze 2022, o 19:08</p><hr />
]]></content>
</entry>
</feed>