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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-04-08T20:27:42+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=7&amp;t=2780&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-08T20:27:42+01:00</updated>
<published>2013-04-08T20:27:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33869#p33869</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33869#p33869"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33869#p33869"><![CDATA[
To powinien być string. Podczas wprowadzania pilnujesz czy - i . już zostały użyte.<br />Jak będziesz miał &quot;-54321,0123&quot; to wtedy należy rozbić to na 2 stringi przy użyciu funkcji strtok. Znając długość 2 stringa (funkcja strlen zwróci powiedzmy fractIntLength) możesz po użyciu funkcji atoi używać tych liczb w taki przykładowy sposób:<br />[syntax=c]uint16_t multiplier = 1;<br />for (uint8_t i = 0; i&lt;fractIntLength; i++){<br />   multiplier *= 10;<br />}<br />a = ( (int32_t)b * ( (int32_t)intPart * multiplier + fractPart ) ) / multiplier;[/syntax]<br />Zwracam tu uwagę na to, że fractPart będzie takie samo dla 0,123 i 0,0123 dlatego znajomość długości tego stringa jest  kluczowa.<br />Nie jest to sprawdzony kod. Dlatego postaram się o działający przykład.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 8 kwi 2013, o 20:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-07T21:17:27+01:00</updated>
<published>2013-04-07T21:17:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33760#p33760</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33760#p33760"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33760#p33760"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />Czy możesz wprowadzić 0,01 ?<br /></div><br />Nie... :/<br /><br />Krauser problem dotyczy wprowadzania liczb typu x.0y<br />problem w tym, że część ułamkowa jest u mnie intem, a jak wiadomo 03 = 3 więc dlatego nie działają takie liczby. Jak to rozwiązać - nie wiem... Pierwszy raz w życiu implementuję klawiaturę ekranową i nie jest to takie proste jak myślałem, jeszcze gdyby można było używać double/float to by było prościej, ale na samych całkowitych to jest ciężka sprawa dla mnie...<br /><br />No i działa to tak:<br />[syntax=c]numKbdRes.fractPart = (10*numKbdRes.fractPart + keyNo)[/syntax]<br />keyNo wynosi 0, numKbdRes.fractPart wynosi 0 na początku.<br />Po tej linijce numKbdRes.fractPart = 10*0 + 0 = 0...<br />I w funkcji tftPutReal nie jest wyświetlana część ułamkowa...<br />Nawet jakby wyświetlać, to i tak niczego nie rozwiązuje. Bo 4.02 =&gt; numKbdRes.fractPart = 10*0 + 2 = 2 =&gt; mamy 4.2 zamiast 4.02...<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br />Można dodać licznik zer pod rząd po przecinku zwiększający się z każdym naciśnięciem &quot;0&quot; po kropce, jedyne co mi przychodzi do głowy. I wyświetlać te zera między częścią całkowitą i ułamkową. Ale to bardzo komplikuje cofanie (backspace).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 7 kwi 2013, o 21:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-07T10:30:15+01:00</updated>
<published>2013-04-07T10:30:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33677#p33677</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33677#p33677"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33677#p33677"><![CDATA[
Minusa przy wprowadzaniu dużej liczby pozbędziesz się:<br />[syntax=c]numKbdRes.fractPart = (10*numKbdRes.fractPart + keyNo) &amp; 0x7FFF;[/syntax]<br />w końcu trzeba przewidzieć każdą sytuację.<br />Czy możesz wprowadzić 0,01 ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 7 kwi 2013, o 10:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-07T00:21:46+01:00</updated>
<published>2013-04-07T00:21:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33645#p33645</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33645#p33645"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33645#p33645"><![CDATA[
Mi się dwa razy zwiesił od pory poprawki, ale może to wina tego, że testowałem na podłączonym USB (i programatorze co za tym idzie). Chociaż raz zawisł chyba też przy odłączonym USB i programatorze w ATB.<br /><br />Dzięki za resztę uwag. Klawiaturka nie będzie raczej służyła do wprowadzania dużych liczb (temperatura, nastawy P, I, D), a &quot;przekręca&quot; się bo przekracza zakres inta... Z tym minusem za kropką - nie mogę dojść do tego kiedy i dlaczego się pojawia. Nieco poprawiłem klawiaturkę i teraz już można wprowadzać liczby od -1 do 0. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />A to, że działa zbyt szybko to hmmm nie wiem co na to poradzić. Ma wykrywać co 5 kliknięcie w cyfrę? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Czy nie wiem kurka...<br /><br />[syntax=c]typedef struct<br />{<br />bool isReal;<br />bool isValid;<br />bool isMinus;<br />int intPart;<br />int fractPart;<br />} numKbdResult;[/syntax]<br /><br />[syntax=c]case mI_screenKbd:<br />frame_ptr = SSDXBUF4;<br />keyNo = scrKbdHandle(x,y);<br /><br />switch(keyNo)<br />{<br />case -1:<br />return;<br /><br />case 10:// &lt;x<br />if(numKbdRes.isReal == true)<br />{<br />if(numKbdRes.fractPart &lt; 10)<br />{<br />numKbdRes.isReal = false;<br />numKbdRes.fractPart = 0;<br />}<br />else<br />{<br />numKbdRes.fractPart /= 10;<br />}<br />}<br />else<br />{<br />numKbdRes.intPart /= 10;<br />}<br />break;<br /><br />case 11:// +/-<br />numKbdRes.intPart = - numKbdRes.intPart;<br /><br />bool tmp = (numKbdRes.isMinus == false) ? true : false;<br />numKbdRes.isMinus = tmp;<br />break;<br /><br />case 12:// .<br />if(numKbdRes.isReal == false)<br />{<br />numKbdRes.isReal = true;<br />}<br />break;<br /><br />case 13:// ANULUJ<br />numKbdRes.isValid = false;<br />numKbdRes.isReal = false;<br />numKbdRes.isMinus = false;<br />numKbdRes.intPart = 0;<br />numKbdRes.fractPart = 0;<br /><br />if(currSet == cS_Temp)<br />{<br />currMenu = mI_main;<br />setFrameAdr(SSDXBUF0);<br />setBuf0Main(false);<br />break;<br />}<br />else<br />{<br />currMenu = mI_set;<br />}<br /><br />setFrameAdr(SSDXBUF3);<br />break;<br /><br />case 14:// OK<br />numKbdRes.isValid = true;<br />tftFillRect(31,51,208,28,white);<br />break;<br /><br />default:<br />CX = 34;<br />}<br /><br />if(keyNo &lt; 10)<br />{<br />if(numKbdRes.isReal == true)<br />{<br />numKbdRes.fractPart = 10*numKbdRes.fractPart + keyNo;<br />}<br />else<br />{<br />numKbdRes.intPart = 10*numKbdRes.intPart + keyNo;<br />}<br />}<br /><br />if(keyNo != 13)<br />{<br />tftFillRect(31,51,208,28,white);<br />if(numKbdRes.intPart == 0 &amp;&amp; numKbdRes.isMinus == true)<br />{<br />tftPutsP(34,60,PSTR(&quot;-&quot;),black,white);<br />tftPutInt(CX,60,numKbdRes.intPart,black,white);<br />}<br />else<br />{<br />tftPutInt(34,60,numKbdRes.intPart,black,white);<br />}<br />}<br /><br />if(numKbdRes.isReal == true)<br />{<br />tftPutsP(CX,60,PSTR(&quot;.&quot;),black,white);<br /><br />if(numKbdRes.fractPart != 0)<br />{<br />int cxOld = CX;<br />tftPutInt(cxOld,60,numKbdRes.fractPart,black,white);<br />}<br />}<br /><br /><br />if(keyNo == 14 &amp;&amp; numKbdRes.isValid == true)// OK<br />{<br />numKbdRes.isValid = false;<br /><br />sets.set&#91;currSet&#93; = numKbdRes;<br /><br />if(currSet == cS_Temp)<br />{<br />currMenu = mI_main;<br />frame_ptr = SSDXBUF0;<br />tftFillRect(21,90,58,28,white);<br />tftPutReal(23,100,numKbdRes.intPart,numKbdRes.fractPart,numKbdRes.isMinus,black,white);<br />setFrameAdr(SSDXBUF0);<br />}<br />else<br />{<br />currMenu = mI_set;<br />tftFillRect(31,51,208,28,white);<br /><br />frame_ptr = SSDXBUF3;<br />tftFillRect(76,60+50*currSet,60,20,white);<br />tftPutReal(76,60+50*currSet,numKbdRes.intPart,numKbdRes.fractPart,numKbdRes.isMinus,black,white);<br />setFrameAdr(SSDXBUF3);<br />}<br /><br />numKbdRes.isReal = false;<br />numKbdRes.isMinus = false;<br />numKbdRes.intPart = 0;<br />numKbdRes.fractPart = 0;<br />}<br />break;<br />}[/syntax]<br /><br />[syntax=c]void tftPutReal(int x, int y, int intPart, int fractPart, int isMinus, uint32_t pen, uint32_t brush)<br />{<br />char bufor&#91;17&#93;;<br />itoa(intPart, bufor, 10);<br /><br />if(intPart == 0 &amp;&amp; isMinus)<br />{<br />tftPutsP(x,y,PSTR(&quot;-&quot;),black,white);<br />tftPuts(CX, y, bufor, pen, brush);<br />}<br /><br />else<br />{<br />tftPuts(x, y, bufor, pen, brush);<br />}<br /><br />if(fractPart != 0)<br />{<br />tftPutsP(CX, y, PSTR(&quot;.&quot;),pen,brush);<br /><br />itoa(fractPart, bufor, 10);<br />tftPuts(CX, y, bufor, pen, brush);<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 7 kwi 2013, o 00:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-07T00:09:52+01:00</updated>
<published>2013-04-07T00:09:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33644#p33644</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33644#p33644"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33644#p33644"><![CDATA[
Nie zauważyłem żadnej zwiechy a jeżdżę po ekranie. W funkcji drawButton dodałem na początku linię setCurrentFont(&amp;DefaultFontInfo); Klawiaturka działa zbyt szybko i trudno wprowadzić jeden znak i jak jest ich więcej to przeskakuje na minus i ten znak pojawia się również zaraz za przecinkiem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 7 kwi 2013, o 00:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-06T22:16:39+01:00</updated>
<published>2013-04-06T22:16:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33642#p33642</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33642#p33642"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33642#p33642"><![CDATA[
@Krauser: wiem, coś z czcionkami jest jeszcze nie halo, ale jak piszesz to już drobnostka. Dodatkowo je odchudziłem je w PixelFactory i zostawiłem tylko używane znaki dzięki czemu znacząco spadła pamięciożerność programu. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Klawiaturka ekranowa przecież chodzi ładnie, co masz na myśli? Zauważyłem tylko, że nie da się wprowadzić liczby z zakresu (-1,0), ale to już jest drobnostka do poprawienia. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Jak masz jakieś uwagi do programu i obsługi wyświetlacza jaką stosuję (np. menu, przyciski itp) to pisz, będę wdzięczny. Słyszałem, że szalejesz na tych TFT. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 7 minutach ]</span></strong><br /><br />Ehhh chyba za wcześnie chwaliłem dzień przed zachodem słońca. Nadal się dotyk wiesza, tylko dużo rzadziej...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 6 kwi 2013, o 22:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-06T22:13:27+01:00</updated>
<published>2013-04-06T22:13:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33641#p33641</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33641#p33641"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33641#p33641"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />Używanie Ctrl+C, Ctrl+V mnie też nieraz wpuściło w maliny  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> <br />....<br /></div><br /><br />Ja nawet wiem jak zrobiłem te babole bo najpierw napisałem obsługę na INT2, a później już na szybko chciałem bez sprawdzania w realu dopisać obsługę z kompilacją warunkową na INT0 i INT1, więc szybko CTRL+C, CTRL+V, skasowałem tyldy - ale wzrokiem niestety już nie złapałem znaków &amp; tzn żeby je zamienić na | .... i tak wyszło. Zresztą zdaje się że przy modułach RFM12 identyczna sytuacja była w bibliotece mojej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 kwi 2013, o 22:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-06T22:33:55+01:00</updated>
<published>2013-04-06T22:08:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33639#p33639</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33639#p33639"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33639#p33639"><![CDATA[
Używanie Ctrl+C, Ctrl+V mnie też nie raz wpuściło w maliny  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> <br />Przy okazji pobawiłem się programem. Coś nie tak jest z czcionką, bo zmienia się z 11 bold na default w trakcie działania w podmenu częstotliwość pomiaru, ale to kosmetyka i teraz pójdzie z górki. Klawiatura ekranowa wymagać będzie więcej pracy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 6 kwi 2013, o 22:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-06T20:44:55+01:00</updated>
<published>2013-04-06T20:44:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33633#p33633</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33633#p33633"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33633#p33633"><![CDATA[
Wygląda na to, że teraz działa dobrze. ;]<br />Chciałbym Wam gorąco podziękować - w końcu mogę iść do przodu z magisterką. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Nikt nie jest nieomylny, nawet Mirek, ale jesteśmy tylko ludźmi i ja to rozumiem. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Fajnie, że udało się rozwiązać problem.<br />Lekcja na przyszłość: nie traktować czyjegoś kodu (z bibliotek) jako w 100% działający i podchodzić krytycznie do każdej linijki. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><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=355">Ledes</a> — 6 kwi 2013, o 20:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-04T21:56:34+01:00</updated>
<published>2013-04-04T21:56:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33315#p33315</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33315#p33315"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33315#p33315"><![CDATA[
no tak - robiłem jakieś Copy&amp;Paste i walnęło mi się coś takiego <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />MCUCR <strong><span style="color: #FF0000">&amp;=</span></strong> (1&lt;&lt;ISC01);    // zbocze opadające<br /></div><br /><br />zamiast <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />MCUCR <strong><span style="color: #008000">|= </span></strong>(1&lt;&lt;ISC01);    // zbocze opadające<br /></div><br /><br />też tak mam w kodzie u siebie - niestety - muszę to dać do aktualizacji na stronie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />dzięki Krauser za znalezienie BUG'a<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />chociaż? czy ty już kiedyś o tym gdzieś tu nie pisałeś komuś? a ja zapomniałem to zaktualizować ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> eeeeh idę teraz od razu to zrobić <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 8 minutach ]</span></strong><br /><br />już jest w aktualizacjach:<br /><br /><!-- m --><a class="postlink" href="http://atnel.pl/uaktualnienia-programow-do-dvd.html" >http://atnel.pl/uaktualnienia-programow-do-dvd.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 kwi 2013, o 21:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-04T21:50:06+01:00</updated>
<published>2013-04-04T21:50:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33311#p33311</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33311#p33311"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33311#p33311"><![CDATA[
Dzięki za odpowiedź.<br />O, nie przypuszczałem nawet że to może być wina konfiguracji STMPE811. Przyjąłem po prostu kod-bibliotekę Mirka za pewnik. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Nie mam teraz możliwości tego sprawdzić, ale jutro wieczorem albo w sobotę rano napiszę, czy pomogło. <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=355">Ledes</a> — 4 kwi 2013, o 21:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-05T16:31:48+01:00</updated>
<published>2013-04-04T20:29:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33295#p33295</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33295#p33295"/>
<title type="html"><![CDATA[Re: LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerw]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33295#p33295"><![CDATA[
Chętnie pobawię się tym ciekawym kodem, ale na szybko może spróbuj zastąpić w pliku mk_stmpe811.c w funkcji stmpe811_init()  inicjalizację przerwań INTx takim kodem:<br />[syntax=c]#if defined(_AVR_IOM32_H) || defined (_AVR_IOM32A_H) || defined(_AVR_IOM16_H_) || defined(_AVR_ATmega16A_H_)<br /><br />#if USE_IRQ_NR == 0<br />// inicjalizacja przerwania synchronicznego INT0<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />GICR |= (1&lt;&lt;INT0);<br />MCUCR |= (1&lt;&lt;ISC01); // zbocze opadające<br />#endif<br /><br />#if USE_IRQ_NR == 1<br />// inicjalizacja przerwania synchronicznego INT1<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />GICR |= (1&lt;&lt;INT1);<br />MCUCR |= (1&lt;&lt;ISC11);// zbocze opadające<br />#endif<br /><br />#if USE_IRQ_NR == 2<br />// inicjalizacja przerwania asynchronicznego INT2<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />GICR |= (1&lt;&lt;INT2);<br />//MCUCSR &amp;= ~(1&lt;&lt;ISC2);// zbocze opadające<br />#endif<br />#elif defined(_AVR_IOM644P_H_) || defined(_AVR_IOM644PA_H_)<br />#if USE_IRQ_NR == 0<br />// inicjalizacja przerwania synchronicznego INT0<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />EIMSK |= (1 &lt;&lt; INT0);<br />EICRA |= (1 &lt;&lt; ISC01); // zbocze opadające<br />#endif<br /><br />#if USE_IRQ_NR == 1<br />// inicjalizacja przerwania synchronicznego INT0<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />EIMSK |= (1 &lt;&lt; INT1);<br />EICRA |= (1 &lt;&lt; ISC11); // zbocze opadające<br />#endif<br /><br />#if USE_IRQ_NR == 2<br />// inicjalizacja przerwania synchronicznego INT0<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />EIMSK |= (1 &lt;&lt; INT2);<br />EICRA |= (1 &lt;&lt; ISC21); // zbocze opadające<br />#endif<br />#endif[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 4 kwi 2013, o 20:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-04T17:30:54+01:00</updated>
<published>2013-04-04T17:30:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33262#p33262</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33262#p33262"/>
<title type="html"><![CDATA[LCD TFT 3.5'' + konwerter - dotyk się wiesza przy przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2780&amp;p=33262#p33262"><![CDATA[
Witam,<br />natknąłem się na problem podczas stosowania timera programowego (opartego na Timerze2) w Atmedze32. Otóż projekt ma dołączony wyświetlacz LCD TFT 3.5'' od Atnela wraz z konwerterem (a zatem panelem dotykowym). Jest również ADC - pomiar 8 napięć 0-2.5V.<br /><br />W czym rzecz - gdy stosuję przerwanie od timera to mi się wiesza na wyświetlaczu dotyk, nie od razu po uruchomieniu, czasami pół sekundy po a czasami 10 sekund po starcie. Nie wiem, w czym rzecz. Przerwanie uprościłem do minimum, a nawet zostawiłem je puste (!) i problem nadal występował. Gdy ustawiłem tylko rejestry od timera i nie dałem wcale obsługi przerwania (procedury ISR...) to ekran przy starcie cały czas migał (jakby się odświeżał cały czas na biało). Nie wiem, co jest grane.<br /><br />Sprzęt ok, lekcja16 działa super (te suwaki).<br /><br />Pewnie mam jakiegoś babola w kodzie, proszę o zerknięcie okiem bo mnie już szlag trafia...<br /><br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br /><br />#include &quot;MK_SSD1963/MK_SSD1963.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;MK_STMPE811/mk_stmpe811.h&quot;<br />#include &quot;TH_CONTROLLER/th_controller.h&quot;<br /><br /><br /><br />void fun();<br /><br />int main(void)<br />{<br />i2cSetBitrate(400);// ustawienie prędkości magistrali I2C<br />stmpe811Init(); // INICJALIZACJA STMPE811<br />tftInit();<br />tftCls(white);<br /><br />sei();// włączenie globalne przerwań<br /><br />controllerInit();<br />setCurrentFont(&amp;CourierNew11pt_boldFontInfo);<br />drawMenu();<br /><br />while(1)<br />{<br />if(fStmp811IntX)// jeśli zmiana współrzędnych Touch Panel<br />{<br />//showCoord(240,110);<br />handleTouch();<br />fStmp811IntX = 0;<br />}<br /><br />if((currMenu == mI_main) &amp;&amp; (cz123Changed() == true))<br />{<br />// odswiez ekran main<br />currMenu = mI_main;<br />setBuf0Main(true);<br />setFrameAdr(SSDXBUF0);<br />}<br /><br />if((currMenu == mI_graph) &amp;&amp; (cz123Changed() == true))<br />{<br />// odswiez ekran graph<br />currMenu = mI_graph;<br />setBuf1Graph(true);<br />setFrameAdr(SSDXBUF1);<br />}<br />}<br />}<br /><br />// ciało procedury obsługi przerwania Compare Match Timera2<br />// fBazowa = 100Hz<br />ISR( TIMER2_COMP_vect )<br />{<br />static uint16_t cnt; // nasz licznik<br />static uint16_t measCnt;<br /><br />static bool fIsMeasTime;<br /><br />// 10Hz, 10/s<br />if((measSpeed == mS_10) &amp;&amp; (cnt % 10 == 0))<br />{<br />fIsMeasTime = true;<br />}<br /><br />// 5Hz, 5/s<br />if((measSpeed == mS_5) &amp;&amp; (cnt % 20 == 0))<br />{<br />fIsMeasTime = true;<br />}<br /><br />// 2Hz, 2/s<br />if((measSpeed == mS_2) &amp;&amp; (cnt % 50 == 0))<br />{<br />fIsMeasTime = true;<br />}<br /><br />// 1Hz, 1/s<br />if((measSpeed == mS_1) &amp;&amp; (cnt % 100 == 0))<br />{<br />fIsMeasTime = true;<br />}<br /><br />cnt++;// zwiększanie licznika o 1<br />}<br /><br /><br />//switch(measSpeed)<br />//{<br />//case mS_1:<br />//if(cnt % 100 == 0)<br />//{<br />//fIsMeasTime = true;<br />//}<br />//break;<br />//<br />//<br />//case mS_2:<br />//if(cnt % 50 == 0)<br />//{<br />//fIsMeasTime = true;<br />//}<br />//break;<br />//<br />//<br />//case mS_5:<br />//if(cnt % 20 == 0)<br />//{<br />//fIsMeasTime = true;<br />//}<br />//break;<br />//<br />//<br />//case mS_10:<br />//if(cnt % 10 == 0)<br />//{<br />//fIsMeasTime = true;<br />//}<br />//break;<br />//<br />//<br />//default:<br />//break;<br />//}<br />//<br />////if(fIsMeasTime == true)<br />////{<br />////fIsMeasTime = false;<br />////<br />////for(int i=0; i&lt;8; i++)<br />////{<br />////movAvgRes.meas&#91;measCnt%MOVING_AVER_SIZE&#93;.sensor&#91;i&#93; = measADC(i);<br />////}<br />////<br />////measCnt++;<br />////<br />////// ----------------- srednia kroczaca (moving average) -----------------<br />////if(measCnt &gt;= MOVING_AVER_SIZE)<br />////{<br />////uint8_t sensOnCnt = 0;<br />////avrgTemp = 0;<br />////<br />////for(int i=0; i&lt;8; i++)<br />////{<br />////measRes.sensor&#91;i&#93; = 0;<br />////<br />////for(int j=0; j&lt;MOVING_AVER_SIZE; j++)<br />////{<br />////measRes.sensor&#91;i&#93; += movAvgRes.meas&#91;j&#93;.sensor&#91;i&#93;;<br />////}<br />////measRes.sensor&#91;i&#93; /= MOVING_AVER_SIZE;<br />////<br />////// srednia po aktywnych czujnikach<br />////if(sensorState&#91;i&#93; == true)<br />////{<br />////sensOnCnt++;<br />////avrgTemp += measRes.sensor&#91;i&#93;;<br />////}<br />////<br />////measRes.sensor&#91;i&#93; = adc2temp(measRes.sensor&#91;i&#93;);<br />////}<br />////<br />////avrgTemp /= sensOnCnt;<br />////<br />////avrgTemp = adc2temp(avrgTemp);<br />////}<br />////// ---------------------------------------------------------------------<br />////}<br />//}[/syntax]<br /><br />thController.h<br />[syntax=c]#ifndef TH_CONTROLLER_H_<br />#define TH_CONTROLLER_H_<br /><br />typedef enum<br />{<br />false,<br />true<br />} bool;<br /><br /><br />void controllerInit();<br />//void showCoord(uint16_t xPos, uint16_t yPos);<br />void drawButton(uint16_t xPos, uint16_t yPos, uint8_t sizeX, uint8_t sizeY, char* caption, uint8_t active);<br />void drawMenu();<br />void handleTouch();<br />uint16_t measADC(uint8_t kanal);<br />uint16_t adc2temp(uint16_t adc);<br />void setBuf0Main(bool isRefresh);<br />void setBuf1Graph(bool again);<br /><br />bool cz123Changed();<br /><br />#define VREF_VCC (1&lt;&lt;REFS0)<br />#define VREF_256 (1&lt;&lt;REFS1)|(1&lt;&lt;REFS0)<br /><br />#define KEYS_NR 15<br />#define TP_THR 1<br />#define MOVING_AVER_SIZE 10<br /><br />typedef struct<br />{<br />uint8_t xSize;<br />uint8_t ySize;<br />uint8_t xSpace;<br />uint8_t ySpace;<br />uint8_t leftMargin;<br />uint8_t upMargin;<br />} kbd;<br /><br /><br />typedef struct<br />{<br />bool isReal;<br />bool isValid;<br />int intPart;<br />int fractPart;<br />} numKbdResult;<br /><br /><br />typedef struct<br />{<br />uint16_t leftBorder&#91;KEYS_NR&#93;;<br />uint8_t upBorder&#91;KEYS_NR&#93;;<br />uint8_t xSize&#91;KEYS_NR&#93;;<br />uint8_t ySize&#91;KEYS_NR&#93;;<br />}screenKbd;<br /><br /><br />typedef enum<br />{<br />mI_main,<br />mI_sensors,<br />mI_set,<br />mI_other,<br />mI_graph,<br />mI_about,<br />mI_screenKbd,<br />mI_config<br />} menuItem;<br /><br /><br />typedef enum<br />{<br />mS_10,<br />mS_5,<br />mS_2,<br />mS_1<br />} measureSpeed;<br /><br /><br />typedef enum<br />{<br />cS_P,<br />cS_I,<br />cS_D,<br />cS_Temp<br />} currRegulatorSet;<br /><br />typedef struct<br />{<br />int min;<br />int max;<br />} movingBarRange;<br /><br /><br />typedef struct<br />{<br />numKbdResult set&#91;4&#93;;<br />} regulatorSets;<br /><br />typedef struct<br />{<br />uint16_t sensor&#91;8&#93;;<br />} measResult;<br /><br /><br />typedef struct<br />{<br />measResult meas&#91;MOVING_AVER_SIZE&#93;;<br />} movingAverageRes;<br /><br /><br />extern volatile measResult measRes;<br />extern movingAverageRes movAvgRes;<br /><br />extern menuItem currMenu;<br />extern screenKbd numKbd;<br />extern numKbdResult numKbdRes;<br />extern regulatorSets sets;<br />extern movingBarRange mBarRange;<br />extern volatile measureSpeed measSpeed;<br /><br />extern volatile bool sensorState&#91;8&#93;;<br />extern volatile uint16_t avrgTemp;<br /><br />#endif /* TH_CONTROLLER_H_ */[/syntax]<br /><br />thController.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;../MK_SSD1963/MK_SSD1963.h&quot;<br />#include &quot;../I2C_TWI/i2c_twi.h&quot;<br />#include &quot;../MK_STMPE811/mk_stmpe811.h&quot;<br />#include &quot;th_controller.h&quot;<br /><br />currRegulatorSet currSet;<br />screenKbd numKbd;<br />regulatorSets sets;<br />kbd kbdSensor;<br />kbd kbdOther;<br />volatile uint16_t avrgTemp;<br /><br />volatile bool sensorState&#91;8&#93; = {};<br />int scrKbdHandle(int x, int y);<br />menuItem currMenu;<br /><br />volatile measureSpeed measSpeed;<br /><br />numKbdResult numKbdRes;<br />numKbdResult lastNumKbdRes;<br /><br />movingBarRange mBarRange;<br />movingBarRange nomTempRange;<br /><br />volatile measResult measRes;<br />movingAverageRes movAvgRes;<br /><br />int fractDiv(int arg);<br />void setBuf1About();<br /><br />void setBuf2Sensors();<br />void setBuf2Other();<br />void setBuf0Config();<br /><br />void controllerInit()<br />{<br />currMenu = mI_main;<br /><br />// ustawienia TIMER2 w tryb CTC<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb  CTC<br />TCCR2 |= (1&lt;&lt;CS20) | (1&lt;&lt;CS21) | (1&lt;&lt;CS22);// preskaler = 1024<br /><br />OCR2 = 108;// dodatkowy podział częstotliwości przez 108 =&gt; 100Hz<br />TIMSK |= (1&lt;&lt;OCIE2);// zezwolenie na przerwanie CompareMatch<br /><br />ADMUX |= VREF_256;<br />ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS0);<br /><br />// T_zad = 20.5 *C<br />sets.set&#91;3&#93;.intPart = 20;<br />sets.set&#91;3&#93;.fractPart = 5;<br />sets.set&#91;3&#93;.isReal = sets.set&#91;3&#93;.isValid = true;<br /><br />kbdSensor.xSize = 40;<br />kbdSensor.ySize = 40;<br />kbdSensor.xSpace = 20;<br />kbdSensor.ySpace = 20;<br />kbdSensor.leftMargin = 40;<br />kbdSensor.upMargin = 60;<br /><br />kbdOther.xSize = 50;<br />kbdOther.ySize = 40;<br />kbdOther.xSpace = 20;<br />kbdOther.ySpace = 20;<br />kbdOther.leftMargin = 30;<br />kbdOther.upMargin = 60;<br /><br />measSpeed = mS_5;// domyslnie 5 pomiarów/sek<br /><br />for(int i=0; i&lt;8; i++)<br />{<br />sensorState&#91;i&#93; = true;<br />}<br /><br />// ------------------ klawiatura ekranowa ------------------------<br />for(int i=0; i&lt;5; i++)// 0-4<br />{<br />numKbd.leftBorder&#91;i&#93; = 30 + i*43;<br />numKbd.upBorder&#91;i&#93; = 90;<br />numKbd.xSize&#91;i&#93; = 38;<br />numKbd.ySize&#91;i&#93; = 38;<br />}<br /><br />for(int i=5; i&lt;10; i++) // 5-9<br />{<br />numKbd.leftBorder&#91;i&#93; = 30 + (i-5)*43;<br />numKbd.upBorder&#91;i&#93; = 140;<br />numKbd.xSize&#91;i&#93; = 38;<br />numKbd.ySize&#91;i&#93; = 38;<br />}<br /><br />for(int i=10; i&lt;13; i++) // &lt;x, +/-, .<br />{<br />numKbd.leftBorder&#91;i&#93; = 251;<br />numKbd.upBorder&#91;i&#93; = 5 + (i-9)*45;<br />numKbd.xSize&#91;i&#93; = 38;<br />numKbd.ySize&#91;i&#93; = 38;<br />}<br /><br />for(int i=13; i&lt;15; i++) // anuluj, ok<br />{<br />numKbd.leftBorder&#91;i&#93; = 90+(i-12)*77;<br />numKbd.upBorder&#91;i&#93; = 200;<br />numKbd.xSize&#91;i&#93; = 70 - (i-13)*24;<br />numKbd.ySize&#91;i&#93; = 30;<br />}<br />//--------------------------------------------------------------------<br />}<br /><br />//void showCoord(uint16_t xPos, uint16_t yPos)<br />//{<br />//if(currMenu != mI_config)<br />//{<br />//return;<br />//}<br />//<br />//frame_ptr = SSDXBUF0;<br />//static int lx, ly;<br />//int x = tpX, y = tpY;<br />//<br />//tftPutsP(xPos, yPos, PSTR(&quot;x = &quot;), white, white);<br />//tftPutInt(CX, yPos, lx, white, white);<br />//tftPutsP(xPos, CY + 15, PSTR(&quot;y = &quot;), white, white);<br />//tftPutInt(CX, CY, ly, white, white);<br />//<br />//tftPutsP(xPos, yPos, PSTR(&quot;x = &quot;), black, white);<br />//tftPutInt(CX, yPos, x, black, white);<br />//tftPutsP(xPos, CY + 15, PSTR(&quot;y = &quot;), black, white);<br />//tftPutInt(CX, CY, y, black, white);<br />//<br />//lx = x;<br />//ly = y;<br />//}<br /><br /><br />void drawButton(uint16_t xPos, uint16_t yPos, uint8_t sizeX, uint8_t sizeY, char* caption, uint8_t active)<br />{<br />if(active == 0)<br />{<br />tftFillRect(xPos,yPos,sizeX,sizeY,red);<br />tftPuts(xPos+sizeX/2-txtLen(caption)/2,sizeY/2+yPos-4,caption,black,red);<br />}<br />else<br />{<br />tftFillRect(xPos,yPos,sizeX,sizeY,green);<br />tftPuts(xPos+sizeX/2-txtLen(caption)/2,sizeY/2+yPos-4,caption,black,green);<br />}<br />}<br /><br /><br />void drawMenu()<br />{<br />// czujnik startowy = 3<br />measRes.sensor&#91;2&#93; = adc2temp(measADC(2));<br /><br />avrgTemp = measRes.sensor&#91;2&#93;;<br /><br />setBuf0Main(false);<br />setBuf1About();<br />setBuf2Sensors();<br /><br />// ========================== nastawy ===============================<br />frame_ptr = SSDXBUF3;<br />tftCls(white);<br />setCurrentFont(&amp;CourierNew11pt_boldFontInfo);<br /><br />tftPutsP(20,10,PSTR(&quot;PID&quot;),black,white);<br />tftPutsP(20,60,PSTR(&quot;P = &quot;),black, white);<br />tftPutsP(20,110,PSTR(&quot;I = &quot;),black, white);<br />tftPutsP(20,160,PSTR(&quot;D = &quot;),black, white);<br /><br />drawButton(140,50,80,25,&quot;ZMIANA&quot;,1);<br />drawButton(140,100,80,25,&quot;ZMIANA&quot;,1);<br />drawButton(140,150,80,25,&quot;ZMIANA&quot;,1);<br /><br />drawButton(250,180,50,40,&quot;OK&quot;,1);<br />// ==================================================================<br /><br /><br />// ========================== klawiatura ekranowa ===============================<br />frame_ptr = SSDXBUF4;<br />tftCls(white);<br />setCurrentFont(&amp;CourierNew11pt_boldFontInfo);<br />char* kbdStr&#91;15&#93; = {&quot;0&quot;,&quot;1&quot;,&quot;2&quot;,&quot;3&quot;,&quot;4&quot;,&quot;5&quot;,&quot;6&quot;,&quot;7&quot;,&quot;8&quot;,&quot;9&quot;,&quot;&lt;x&quot;,&quot;+/-&quot;,&quot;.&quot;,&quot;ANULUJ&quot;,&quot;OK&quot;};<br /><br />for(uint8_t i=0; i&lt;15; i++)<br />{<br />drawButton(numKbd.leftBorder&#91;i&#93;, numKbd.upBorder&#91;i&#93;, numKbd.xSize&#91;i&#93;, numKbd.ySize&#91;i&#93;,kbdStr&#91;i&#93;,1);<br />}<br /><br />tftRect(30,50,210,30,black);<br />// ==============================================================================<br /><br />frame_ptr = SSDXBUF0;<br />}<br /><br />void handleTouch()<br />{<br />int x = tpX;<br />int y = tpY;<br /><br />static int lx, ly;<br />int keyNo;<br /><br />if(((x &lt;= (lx+TP_THR)) &amp;&amp; (x &gt;= (lx-TP_THR))) || ((y &lt;= (ly+TP_THR) &amp;&amp; (y &gt;= (ly-TP_THR)))))<br />{<br />return;<br />}<br /><br />else<br />{<br />switch(currMenu)<br />{<br />case mI_main:<br />if(x&gt;245 &amp;&amp; x&lt;290 &amp;&amp; y&gt;36 &amp;&amp; y&lt;66) // main -&gt; about<br />{<br />setBuf1About();<br />currMenu = mI_about;<br />setFrameAdr(SSDXBUF1);<br />}<br />else if(x&gt;230 &amp;&amp; x&lt;290 &amp;&amp; y&gt;100 &amp;&amp; y&lt;130) // main -&gt; config<br />{<br />setBuf0Config();<br />currMenu = mI_config;<br />setFrameAdr(SSDXBUF0);<br />}<br />else if(x&gt;230 &amp;&amp; x&lt;290 &amp;&amp; y&gt;140 &amp;&amp; y&lt;170) // main -&gt; graph<br />{<br />setBuf1Graph(false);<br />currMenu = mI_graph;<br />setFrameAdr(SSDXBUF1);<br />}<br />else if(x&gt;230 &amp;&amp; x&lt;290 &amp;&amp; y&gt;180 &amp;&amp; y&lt;210) // main -&gt; stop<br />{<br /><br />}<br />else if(x&gt;130 &amp;&amp; x&lt;187 &amp;&amp; y&gt;89 &amp;&amp; y&lt;119) // main -&gt; zmiana<br />{<br />currMenu = mI_screenKbd;<br />currSet = cS_Temp;<br />setFrameAdr(SSDXBUF4);<br />}<br />break;<br /><br /><br />case mI_config:<br />if(x&gt;10 &amp;&amp; x&lt;100 &amp;&amp; y&gt;90 &amp;&amp; y&lt;160) // config -&gt; sensors<br />{<br />currMenu = mI_sensors;<br />setBuf2Sensors();<br />setFrameAdr(SSDXBUF2);<br />}<br /><br />else if(x&gt;110 &amp;&amp; x&lt;200 &amp;&amp; y&gt;50 &amp;&amp; y&lt;120) // config -&gt; set<br />{<br />currMenu = mI_set;<br />setFrameAdr(SSDXBUF3);<br />}<br />else if(x&gt;10 &amp;&amp; x&lt;100 &amp;&amp; y&gt;140 &amp;&amp; y&lt;210)// config -&gt; other<br />{<br />currMenu = mI_other;<br />setBuf2Other();<br />setFrameAdr(SSDXBUF2);<br />}<br />else if(x&gt;210 &amp;&amp; x&lt;260 &amp;&amp; y&gt;140 &amp;&amp; y&lt;180)// config -&gt; ok<br />{<br />currMenu = mI_main;<br />setBuf0Main(false);<br />setFrameAdr(SSDXBUF0);<br />}<br />break;<br /><br /><br />case mI_about&#058;<br />if(x&gt;230 &amp;&amp; x&lt;280 &amp;&amp; y&gt;100 &amp;&amp; y&lt;140) // about -&gt; main<br />{<br />currMenu = mI_main;<br />setBuf0Main(false);<br />setFrameAdr(SSDXBUF0);<br />}<br />break;<br /><br /><br />case mI_graph:<br />if(x&gt;250 &amp;&amp; x&lt;280 &amp;&amp; y&gt;100 &amp;&amp; y&lt;140) // about -&gt; main<br />{<br />currMenu = mI_main;<br />setBuf0Main(false);<br />setFrameAdr(SSDXBUF0);<br />}<br />break;<br /><br />case mI_other:<br />if(x&gt;210 &amp;&amp; x&lt;260 &amp;&amp; y&gt;180 &amp;&amp; y&lt;220) // sensors -&gt; config (OK)<br />{<br />currMenu = mI_config;<br />setFrameAdr(SSDXBUF0);<br />}<br /><br />if(y&gt;kbdOther.upMargin &amp;&amp; y&lt;(kbdOther.upMargin + kbdOther.ySize))// górny rząd<br />{<br />for(int i=0; i&lt;4; i++)<br />{<br />if(x&gt;(kbdOther.leftMargin + i*kbdOther.xSpace + i*kbdOther.xSize) &amp;&amp; x&lt;(kbdOther.leftMargin+(i+1)*kbdOther.xSize+i*kbdOther.xSpace))<br />{<br />measSpeed = i;<br />setBuf2Other();<br />}<br />}<br />}<br />break;<br /><br /><br />case mI_sensors:<br />if(x&gt;210 &amp;&amp; x&lt;260 &amp;&amp; y&gt;180 &amp;&amp; y&lt;220) // sensors -&gt; config (OK)<br />{<br />currMenu = mI_config;<br />setFrameAdr(SSDXBUF0);<br />}<br /><br />char* sensNr&#91;6&#93; = {&quot;3&quot;,&quot;4&quot;,&quot;5&quot;,&quot;6&quot;,&quot;7&quot;,&quot;8&quot;};<br />static uint8_t sensTnr&#91;6&#93; = {};<br />frame_ptr = SSDXBUF2;<br />setCurrentFont(&amp;CourierNew11pt_boldFontInfo);<br /><br />if(y&gt;kbdSensor.upMargin &amp;&amp; y&lt;(kbdSensor.upMargin + kbdSensor.ySize))// górny rząd<br />{<br />for(int i=0; i&lt;3; i++)<br />{<br />if(x&gt;(kbdSensor.leftMargin + i*kbdSensor.xSpace + i*kbdSensor.xSize) &amp;&amp; x&lt;(kbdSensor.leftMargin+(i+1)*kbdSensor.xSize+i*kbdSensor.xSpace))<br />{<br />sensTnr&#91;i&#93;++;<br /><br />if(sensTnr&#91;i&#93; % 2)<br />{<br />drawButton(kbdSensor.leftMargin + i*kbdSensor.xSpace + i*kbdSensor.xSize,kbdSensor.upMargin,kbdSensor.xSize,kbdSensor.ySize,sensNr&#91;i&#93;,0);<br />sensorState&#91;i+2&#93; = false;<br />}<br />else<br />{<br />drawButton(kbdSensor.leftMargin + i*kbdSensor.xSpace + i*kbdSensor.xSize,kbdSensor.upMargin,kbdSensor.xSize,kbdSensor.ySize,sensNr&#91;i&#93;,1);<br />sensorState&#91;i+2&#93; = true;<br />}<br />}<br />}<br />}<br />else if(y&gt;(kbdSensor.upMargin + kbdSensor.ySize + kbdSensor.ySpace) &amp;&amp; y&lt;(kbdSensor.upMargin + 2*kbdSensor.ySize + kbdSensor.ySpace))<br />{<br />for(int i=0; i&lt;3; i++)<br />{<br />if(x&gt;(kbdSensor.leftMargin + i*kbdSensor.xSpace + i*kbdSensor.xSize) &amp;&amp; x&lt;(kbdSensor.leftMargin+(i+1)*kbdSensor.xSize+i*kbdSensor.xSpace))<br />{<br />sensTnr&#91;i+3&#93;++;<br /><br />if(sensTnr&#91;i+3&#93; % 2)<br />{<br />drawButton(kbdSensor.leftMargin + i*kbdSensor.xSpace + i*kbdSensor.xSize,kbdSensor.upMargin + kbdSensor.ySize + kbdSensor.ySpace,kbdSensor.xSize,kbdSensor.ySize,sensNr&#91;i+3&#93;,0);<br />sensorState&#91;i+5&#93; = false;<br />}<br />else<br />{<br />drawButton(kbdSensor.leftMargin + i*kbdSensor.xSpace + i*kbdSensor.xSize,kbdSensor.upMargin + kbdSensor.ySize + kbdSensor.ySpace,kbdSensor.xSize,kbdSensor.ySize,sensNr&#91;i+3&#93;,1);<br />sensorState&#91;i+5&#93; = true;<br />}<br />}<br />}<br />}<br />break;<br /><br /><br />case mI_set:<br />if(x&gt;250 &amp;&amp; x&lt;300 &amp;&amp; y&gt;180 &amp;&amp; y&lt;220) // set -&gt; config (OK)<br />{<br />currMenu = mI_config;<br />setFrameAdr(SSDXBUF0);<br />}<br /><br />else if(x&gt;140 &amp;&amp; x&lt;220 &amp;&amp; y&gt;50 &amp;&amp; y&lt;75)<br />{<br />currMenu = mI_screenKbd;<br />currSet = cS_P;<br />setFrameAdr(SSDXBUF4);<br />}<br />else if(x&gt;140 &amp;&amp; x&lt;220 &amp;&amp; y&gt;100 &amp;&amp; y&lt;125)<br />{<br />currMenu = mI_screenKbd;<br />currSet = cS_I;<br />setFrameAdr(SSDXBUF4);<br />}<br />else if(x&gt;140 &amp;&amp; x&lt;220 &amp;&amp; y&gt;150 &amp;&amp; y&lt;175)<br />{<br />currMenu = mI_screenKbd;<br />currSet = cS_D;<br />setFrameAdr(SSDXBUF4);<br />}<br />break;<br /><br /><br />case mI_screenKbd:<br />frame_ptr = SSDXBUF4;<br />keyNo = scrKbdHandle(x,y);<br /><br />switch(keyNo)<br />{<br />case -1:<br />return;<br /><br />case 10:// &lt;x<br />if(numKbdRes.isReal == true)<br />{<br />if(numKbdRes.fractPart &lt; 10)<br />{<br />numKbdRes.isReal = false;<br />numKbdRes.fractPart = 0;<br />}<br />else<br />{<br />numKbdRes.fractPart /= 10;<br />}<br />}<br />else<br />{<br />numKbdRes.intPart /= 10;<br />}<br />break;<br /><br />case 11:// +/-<br />numKbdRes.intPart = - numKbdRes.intPart;<br />break;<br /><br />case 12:// .<br />if(numKbdRes.isReal == false)<br />{<br />numKbdRes.isReal = true;<br />}<br />break;<br /><br />case 13:// ANULUJ<br />numKbdRes.isValid = false;<br />numKbdRes.isReal = false;<br />numKbdRes.intPart = 0;<br />numKbdRes.fractPart = 0;<br /><br />if(currSet == cS_Temp)<br />{<br />currMenu = mI_main;<br />setFrameAdr(SSDXBUF0);<br />setBuf0Main(false);<br />break;<br />}<br />else<br />{<br />currMenu = mI_set;<br />}<br /><br />setFrameAdr(SSDXBUF3);<br />break;<br /><br />case 14:// OK<br />numKbdRes.isValid = true;<br />tftFillRect(31,51,208,28,white);<br />break;<br /><br />default:<br />CX = 34;<br />}<br /><br />if(keyNo &lt; 10)<br />{<br />if(numKbdRes.isReal == true)<br />{<br />numKbdRes.fractPart = 10*numKbdRes.fractPart + keyNo;<br />}<br />else<br />{<br />numKbdRes.intPart = 10*numKbdRes.intPart + keyNo;<br />}<br />}<br /><br />if(keyNo != 13)<br />{<br />tftFillRect(31,51,208,28,white);<br />tftPutInt(34,60,numKbdRes.intPart,black,white);<br />}<br /><br />if(numKbdRes.isReal == true)<br />{<br />tftPutsP(CX,60,PSTR(&quot;.&quot;),black,white);<br /><br />if(numKbdRes.fractPart != 0)<br />{<br />int cxOld = CX;<br />tftPutInt(cxOld,60,numKbdRes.fractPart,black,white);<br />}<br />}<br /><br /><br />if(keyNo == 14 &amp;&amp; numKbdRes.isValid == true)// OK<br />{<br />numKbdRes.isValid = false;<br /><br />sets.set&#91;currSet&#93; = numKbdRes;<br /><br />if(currSet == cS_Temp)<br />{<br />currMenu = mI_main;<br />frame_ptr = SSDXBUF0;<br />tftFillRect(21,90,58,28,white);<br />tftPutReal(23,100,numKbdRes.intPart,numKbdRes.fractPart,black,white);<br />setFrameAdr(SSDXBUF0);<br />}<br />else<br />{<br />currMenu = mI_set;<br />tftFillRect(31,51,208,28,white);<br /><br />frame_ptr = SSDXBUF3;<br />tftFillRect(76,60+50*currSet,60,20,white);<br />tftPutReal(76,60+50*currSet,numKbdRes.intPart,numKbdRes.fractPart,black,white);<br />setFrameAdr(SSDXBUF3);<br />}<br /><br />numKbdRes.isReal = false;<br />numKbdRes.intPart = 0;<br />numKbdRes.fractPart = 0;<br />}<br />break;<br />}<br />}<br /><br />lx = x;<br />ly = y;<br />}<br /><br />// zwraca nr nacisnietego klawisza w klaw. numerycznej<br />int scrKbdHandle(int x, int y)<br />{<br />for(int i=0; i&lt;KEYS_NR; i++)<br />{<br />if(  x &gt;  numKbd.leftBorder&#91;i&#93;<br />   &amp;&amp; x &lt; (numKbd.leftBorder&#91;i&#93; + numKbd.xSize&#91;i&#93;)<br />   &amp;&amp; y &gt;  numKbd.upBorder  &#91;i&#93;<br />   &amp;&amp; y &lt; (numKbd.upBorder  &#91;i&#93; + numKbd.ySize&#91;i&#93;))<br />{<br />return i;<br />}<br />}<br />return -1;<br />}<br /><br />// zwraca przez ile trzeba podzielić częc ułamkową<br />// (np. arg = 234, funkcja zwróci 1000, bo 234/1000 = 0.234)<br />int fractDiv(int arg)<br />{<br />uint8_t cnt = 0;<br />int res = 1;<br /><br />while(arg &gt; 0)<br />{<br />cnt++;<br />arg /= 10;<br />}<br /><br />while(cnt--)<br />{<br />res *= 10;<br />}<br /><br />return res;<br />}<br /><br /><br />void setBuf1About()<br />{<br />// ========================== about===============================<br />frame_ptr = SSDXBUF1;<br />tftCls(white);<br />setCurrentFont(&amp;DefaultFontInfo);<br />tftPutsP(10,10,PSTR(&quot;PRACA MAGISTERSKA&quot;),black,white);<br />tftPutsP(10,30,PSTR(&quot;\&quot;Mikroprocesorowy sterownik komory termicznej\&quot;&quot;) ,black,white);<br />tftPutsP(10,50,PSTR(&quot;Autor: Michał Kaszuba&quot;),black,white);<br />tftPutsP(10,63,PSTR(&quot;Promotor: dr inż. Michał Maćkowski&quot;),black,white);<br />tftPutsP(10,77,PSTR(&quot;2013, Politechnika Poznańska&quot;),black,white);<br /><br />setCurrentFont(&amp;CourierNew11pt_boldFontInfo);<br />drawButton(230,100,50,40,&quot;MENU&quot;,1);<br />// ==============================================================<br />}<br /><br />void setBuf1Graph(bool again)<br />{<br />// =========================== wyniki ===========================<br /><br />static uint16_t oldCz3;<br />static uint16_t oldCz1;<br />static uint16_t oldCz2;<br /><br />frame_ptr = SSDXBUF1;<br /><br />if(again == false)<br />{<br />tftCls(white);<br />}<br /><br />const uint8_t BOTTOM_THR = 217;<br /><br />//uint8_t nomTempBarY = BOTTOM_THR-sets.set&#91;3&#93;.intPart;<br />uint8_t nomTempBarY = BOTTOM_THR-((((sets.set&#91;3&#93;.intPart)*4)+40)/2);<br /><br />if(again == false)<br />{<br />setCurrentFont(&amp;CourierNew11pt_boldFontInfo);<br /><br />tftPutsP(10,10,PSTR(&quot;WYNIKI POMIARU:&quot;),black,white);<br /><br />tftPutsP(45,220,PSTR(&quot;CZ_3&quot;),black,white);<br />tftPutsP(115,220,PSTR(&quot;CZ_1&quot;),black,white);<br />tftPutsP(185,220,PSTR(&quot;CZ_2&quot;),black,white);<br /><br />drawButton(250,100,50,40,&quot;MENU&quot;,1);<br />}<br /><br />uint16_t cz3 = (105 + measRes.sensor&#91;2&#93;)/2;<br />uint16_t cz1 = (105 + measRes.sensor&#91;0&#93;)/2;<br />uint16_t cz2 = (105 + measRes.sensor&#91;1&#93;)/2;<br /><br />if(((cz3 != oldCz3) &amp;&amp; (cz3 &lt; oldCz3)))<br />{<br />tftFillRect(30,BOTTOM_THR-oldCz3,60,cz3,white);<br />}<br /><br />if(((cz1 != oldCz1) &amp;&amp; (cz1 &lt; oldCz1)))<br />{<br />tftFillRect(100,BOTTOM_THR-oldCz1,60,cz1,white);<br />}<br /><br />if(((cz2 != oldCz2) &amp;&amp; (cz2 &lt; oldCz2)))<br />{<br />tftFillRect(170,BOTTOM_THR-oldCz2,60,cz2,white);<br />}<br /><br />tftFillRect(30,BOTTOM_THR-cz3,60,cz3,silver);<br />tftFillRect(100,BOTTOM_THR-cz1,60,cz1,silver);<br />tftFillRect(170,BOTTOM_THR-cz2,60,cz2,silver);<br /><br />if(nomTempBarY &gt; 0)<br />{<br />tftFillRect(25,nomTempBarY,70,4,gray);<br />}<br />else<br />{<br /><br />}<br /><br />oldCz3 = cz3;<br />oldCz1 = cz1;<br />oldCz2 = cz2;<br /><br />// ==============================================================<br />}<br /><br />void setBuf2Sensors()<br />{<br />frame_ptr = SSDXBUF2;<br />tftCls(white);<br /><br />tftPutsP(10,10,PSTR(&quot;AKTYWNE CZUJNIKI&quot;),black,white);<br />drawButton(kbdSensor.leftMargin,kbdSensor.upMargin,kbdSensor.xSize,kbdSensor.ySize,&quot;3&quot;,sensorState&#91;2&#93;==true?1:0);<br />drawButton(kbdSensor.leftMargin+1*(kbdSensor.xSize+kbdSensor.xSpace),kbdSensor.upMargin,kbdSensor.xSize,kbdSensor.ySize,&quot;4&quot;,sensorState&#91;3&#93;==true?1:0);<br />drawButton(kbdSensor.leftMargin+2*(kbdSensor.xSize+kbdSensor.xSpace),kbdSensor.upMargin,kbdSensor.xSize,kbdSensor.ySize,&quot;5&quot;,sensorState&#91;4&#93;==true?1:0);<br />drawButton(kbdSensor.leftMargin,kbdSensor.upMargin+1*(kbdSensor.ySize+kbdSensor.ySpace),kbdSensor.xSize,kbdSensor.ySize,&quot;6&quot;,sensorState&#91;5&#93;==true?1:0);<br />drawButton(kbdSensor.leftMargin+1*(kbdSensor.xSize+kbdSensor.xSpace),kbdSensor.upMargin+1*(kbdSensor.ySize+kbdSensor.ySpace),kbdSensor.xSize,kbdSensor.ySize,&quot;7&quot;,sensorState&#91;6&#93;==true?1:0);<br />drawButton(kbdSensor.leftMargin+2*(kbdSensor.xSize+kbdSensor.xSpace),kbdSensor.upMargin+1*(kbdSensor.ySize+kbdSensor.ySpace),kbdSensor.xSize,kbdSensor.ySize,&quot;8&quot;,sensorState&#91;7&#93;==true?1:0);<br /><br />setCurrentFont(&amp;DefaultFontInfo);<br />drawButton(210,180,50,40,&quot;OK&quot;,1);<br />}<br /><br /><br />void setBuf2Other()<br />{<br />frame_ptr = SSDXBUF2;<br />tftCls(white);<br /><br />tftPutsP(10,10,PSTR(&quot;CZESTOTLIWOSC POMIARU&quot;),black,white);<br />drawButton(kbdOther.leftMargin,kbdOther.upMargin,kbdOther.xSize,kbdSensor.ySize,&quot;10/s&quot;,1);<br />drawButton(kbdOther.leftMargin+1*(kbdOther.xSize+kbdOther.xSpace),kbdOther.upMargin,kbdOther.xSize,kbdOther.ySize,&quot;5/s&quot;,1);<br />drawButton(kbdOther.leftMargin+2*(kbdOther.xSize+kbdOther.xSpace),kbdOther.upMargin,kbdOther.xSize,kbdOther.ySize,&quot;2/s&quot;,1);<br />drawButton(kbdOther.leftMargin+3*(kbdOther.xSize+kbdOther.xSpace),kbdOther.upMargin,kbdOther.xSize,kbdOther.ySize,&quot;1/s&quot;,1);<br /><br />setCurrentFont(&amp;DefaultFontInfo);<br /><br />tftPutsP(20,140,PSTR(&quot;Bieżąca częstotliwosc: &quot;),black,white);<br />switch(measSpeed)<br />{<br />case mS_10:<br />tftPutsP(CX,140,PSTR(&quot;10/sek&quot;),black,white);<br />break;<br />case mS_5:<br />tftPutsP(CX,140,PSTR(&quot;5/sek&quot;),black,white);<br />break;<br />case mS_2:<br />tftPutsP(CX,140,PSTR(&quot;2/sek&quot;),black,white);<br />break;<br />case mS_1:<br />tftPutsP(CX,140,PSTR(&quot;1/sek&quot;),black,white);<br />break;<br />}<br /><br />drawButton(210,180,50,40,&quot;OK&quot;,1);<br />}<br /><br />void setBuf0Config()<br />{<br />frame_ptr = SSDXBUF0;<br />tftCls(white);<br />tftPutsP(20,20,PSTR(&quot;KONFIGURACJA STEROWNIKA&quot;),black,white);<br />drawButton(10,50,90,70,&quot;CZUJNIKI&quot;,1);<br />drawButton(110,50,90,70,&quot;PID&quot;,1);<br />drawButton(10,140,90,70,&quot;INNE&quot;,1);<br />drawButton(210,140,50,40,&quot;OK&quot;,1);<br />}<br /><br />void setBuf0Main(bool isRefresh)<br />{<br />static uint16_t cz1, cz2, cz3;<br /><br />frame_ptr = SSDXBUF0;<br /><br />if(isRefresh == false)<br />{<br />tftCls(white);<br />}<br /><br />tftPutsP(15,15,PSTR(&quot;STEROWNIK KOMORY TERMICZNEJ&quot;),black,white);<br /><br />setCurrentFont(&amp;DefaultFontInfo);<br />drawButton(245,36,45,30,&quot;O...&quot;,1);<br /><br />tftRect(20,45,60,30,black);<br />tftPutsP(88,55,PSTR(&quot;T_kom&quot;),black,white);<br /><br />tftRect(20,89,60,30,black);<br />tftPutsP(88,99,PSTR(&quot;T_zad&quot;),black,white);<br />drawButton(130,89,57,30,&quot;ZMIANA&quot;,1);<br /><br />tftRect(20,133,60,30,black);<br />tftPutsP(88,143,PSTR(&quot;T_cz1&quot;),black,white);<br /><br />tftRect(20,177,60,30,black);<br />tftPutsP(88,187,PSTR(&quot;T_cz2&quot;),black,white);<br /><br />drawButton(230,100,60,30,&quot;KONFIG.&quot;,1);<br />drawButton(230,140,60,30,&quot;GRAFIKA&quot;,1);<br /><br />setCurrentFont(&amp;CourierNew11pt_boldFontInfo);<br /><br />drawButton(230,180,60,30,&quot;STOP&quot;,0);<br />tftPutReal(23,100,sets.set&#91;3&#93;.intPart,sets.set&#91;3&#93;.fractPart,black,white);<br /><br />tftPutReal(23,55,cz3,0,white,white);<br />tftPutReal(23,143,cz1,0,white,white);<br />tftPutReal(23,187,cz2,0,white,white);<br /><br />tftPutReal(23,55,avrgTemp,0,black,white);<br />//tftPutReal(23,55,measRes.sensor&#91;2&#93;,0,black,white);<br />tftPutReal(23,143,measRes.sensor&#91;0&#93;,0,black,white);<br />tftPutReal(23,187,measRes.sensor&#91;1&#93;,0,black,white);<br /><br /><br />cz1 = measRes.sensor&#91;0&#93;;<br />cz2 = measRes.sensor&#91;1&#93;;<br />cz3 = measRes.sensor&#91;2&#93;;<br />}<br /><br />uint16_t measADC(uint8_t canal)<br />{<br />ADMUX = (ADMUX &amp; 0xE0) | canal;<br />ADCSRA |= (1&lt;&lt;ADSC);<br /><br />while (ADCSRA &amp; (1&lt;&lt;ADSC));<br />return ADCW;<br />}<br /><br /><br />uint16_t adc2temp(uint16_t adc)<br />{<br />adc /= 4;<br />adc -= 103;<br />return adc;<br />}<br /><br />bool cz123Changed()<br />{<br />bool isChange = false;<br /><br />static uint16_t cz1, cz2, cz3;<br /><br />if((cz1 != measRes.sensor&#91;0&#93;) || (cz2 != measRes.sensor&#91;1&#93;) || (cz3 != measRes.sensor&#91;2&#93;))<br />{<br />isChange = true;<br />}<br /><br />cz1 = measRes.sensor&#91;0&#93;;<br />cz2 = measRes.sensor&#91;1&#93;;<br />cz3 = measRes.sensor&#91;2&#93;;<br /><br />return isChange;<br />}[/syntax]<br /><br />MK_SSD1963.h<br />[syntax=c]#include &quot;TFT_GRAPH/tft_graph.h&quot;<br />#include &quot;TFT_TEXT/mk_text.h&quot;<br />#include &quot;TFT_FONT/mk_fonts.h&quot;<br /><br />#ifndef MK_SSD1963_H_<br />#define MK_SSD1963_H_<br /><br />//! konfiguracja pinów sterujących LCD TFT<br />#define IC_RST (1&lt;&lt;PC2)<br />#define IC_CS (1&lt;&lt;PC3)<br />#define IC_RD (1&lt;&lt;PC4)<br />#define IC_WR (1&lt;&lt;PC5)<br />#define IC_RS (1&lt;&lt;PC6)<br /><br />#define IC_BL_E (1&lt;&lt;PC7)<br /><br />#define DATA_PORT PORTB<br /><br />#define SCREEN_WIDTH 320<br />#define SCREEN_HEIGHT240<br /><br />#define SSDXBUF00<br />#define SSDXBUF1240<br />#define SSDXBUF2480<br />#define SSDXBUF3720<br />#define SSDXBUF4960<br /><br />extern int CX, CY;<br />extern int frame_ptr;<br /><br /><br />//! podstawowe funkcje do obsługi wyświetlaczy<br />inline void writeCmd(uint8_t command)<br />{<br />PORTC &amp;= ~IC_CS;<br />PORTC &amp;= ~IC_RS;<br />PORTC &amp;= ~IC_WR;<br />DATA_PORT = command;<br />PORTC |= IC_WR;<br />PORTC |= IC_RS;<br />PORTC |= IC_CS;<br />}<br /><br /><br />// zapis bajtu danych do wyświetlacza TFT ze sterownikiem SSD1963<br />inline void writeData(uint8_t data)<br />{<br />PORTC &amp;= ~IC_CS;<br />PORTC &amp;= ~IC_WR;<br />DATA_PORT = data;<br />PORTC |= IC_WR;<br />PORTC |= IC_CS;<br />}<br /><br />void tftInit(void);<br />void setFrameAdr(int nr);<br /><br />#endif /* MK_SSD1963_H_ */[/syntax]<br /><br />mk_stmpe811.h<br />[syntax=c]#ifndef MK_STMPE811_H_<br />#define MK_STMPE811_H_<br /><br />//------------------------------------------ konfiguracja użytkownika<br />// adres układu na magistrali I2C<br />#define _STMPE811_ADDR 0x88<br /><br />// wybór przerwania INTx oraz pinu przerwania<br />#define USE_IRQ_NR 0<br />#define IRQ_PORTPORTD<br />#define IRQ_DIRDDRD<br />#define IRQ_PIN (1&lt;&lt;PD2)<br />//------------------------------------------ koniec konfiguracji użytkownika<br /><br />#define TSC_WIDTH 320<br />#define TSC_HEIGHT240<br /><br /><br />extern volatile int tpX, tpY, tpZ;<br />extern volatile uint8_t fStmp811IntX;<br /><br /><br />uint16_t stmpe811Init();<br /><br />void stmpe811WriteReg( uint8_t adr, uint8_t val );<br />void stmpe811ReadBuf(uint8_t adr, uint8_t len, uint8_t *buf);<br /><br /><br />#endif /* MK_STMPE811_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 4 kwi 2013, o 17:30</p><hr />
]]></content>
</entry>
</feed>