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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-12-28T15:37:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=22&amp;t=23494&amp;mode</id>
<entry>
<author><name><![CDATA[Makowka]]></name></author>
<updated>2020-12-28T15:37:32+01:00</updated>
<published>2020-12-28T15:37:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230336#p230336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230336#p230336"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230336#p230336"><![CDATA[
<div class="quotetitle">Tom92 napisał(a):</div><div class="quotecontent"><br />Projekt bardzo fajny gratuluję, fajnie że pokazałeś tak rozbudowany kod bo jest sie z czego uczyć<br /></div><br /><br />Dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Sam również nie jestem doświadczony i na pewno wiele rzeczy możnaby zrobić dużo lepiej. Chociaż prawda jest taka, że po prawidłowym ustawieniu rejestrów i przewertowaniu noty wszystko staje się proste i pozostaje skupić się głównie na warstwie abstarkcyjnej programu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />I tak jak wyżej wspomniałem, najbardziej aktualną wesję kodu uploaduję na githuba (faktycznie łatwiej przeglądać, zklonować do własnego workspace'u). Ja działam w STM32CubeIDE, więc program powinien się w nim skompilować bez żadnych modyfikacji pod STM32G071CBxx.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10748">Makowka</a> — 28 gru 2020, o 15:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2020-12-27T13:43:59+01:00</updated>
<published>2020-12-27T13:43:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230316#p230316</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230316#p230316"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230316#p230316"><![CDATA[
Projekt bardzo fajny gratuluję, fajnie że pokazałeś tak rozbudowany kod bo jest sie z czego uczyć  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  dopiero zaczynam raczkować w stm32<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 27 gru 2020, o 13:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Makowka]]></name></author>
<updated>2020-12-27T00:53:50+01:00</updated>
<published>2020-12-27T00:53:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230312#p230312</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230312#p230312"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230312#p230312"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Widzę, że masz też bardzo fajną stronkę - programowaniem embeded zajmujesz się zawodowo w jakiejś firmie?<br /></div><br /><br />A dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> W tej chwili studiuję elektronikę, a hobbystycznie to od 6-7 lat coś tam próbuję porobić w wolnym czasie. Sama strona ma raczej funkcję takiego portfolio <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><div class="quotetitle">michal1210 napisał(a):</div><div class="quotecontent"><br />Gratuluję projektu! Kawał dobrej roboty<br /></div><br />Dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10748">Makowka</a> — 27 gru 2020, o 00:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[landrynek]]></name></author>
<updated>2020-12-27T00:02:09+01:00</updated>
<published>2020-12-27T00:02:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230311#p230311</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230311#p230311"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230311#p230311"><![CDATA[
Widzę, że masz też bardzo fajną stronkę - programowaniem embeded zajmujesz się zawodowo w jakiejś firmie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21329">landrynek</a> — 27 gru 2020, o 00:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michal1210]]></name></author>
<updated>2020-12-26T23:28:00+01:00</updated>
<published>2020-12-26T23:28:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230310#p230310</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230310#p230310"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230310#p230310"><![CDATA[
Gratuluję projektu! Kawał dobrej roboty <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=998">michal1210</a> — 26 gru 2020, o 23:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Makowka]]></name></author>
<updated>2020-12-26T22:34:50+01:00</updated>
<published>2020-12-26T22:34:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230309#p230309</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230309#p230309"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230309#p230309"><![CDATA[
<div class="quotetitle">landrynek napisał(a):</div><div class="quotecontent"><br />Bo przeglądanie tego na forum jest średnie<br /></div><br />Faktycznie, jest tego trochę. Wrzucam zatem link do nowo założonego githuba:<br /><br /><a href="https://github.com/MichalMakowka/CelClock_2021.git"  class="postlink">https://github.com/MichalMakowka/CelClock_2021.git</a><br /><br />Skompresowany projekt udostępnię gdy tylko wprowadzę wszystkie poprawki <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=10748">Makowka</a> — 26 gru 2020, o 22:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[landrynek]]></name></author>
<updated>2020-12-26T19:44:22+01:00</updated>
<published>2020-12-26T19:44:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230308#p230308</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230308#p230308"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230308#p230308"><![CDATA[
To mógłbyś dodać też spakowane źródła/projekt? Bo przeglądanie tego na forum jest średnie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21329">landrynek</a> — 26 gru 2020, o 19:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Makowka]]></name></author>
<updated>2020-12-26T19:30:21+01:00</updated>
<published>2020-12-26T19:30:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230307#p230307</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230307#p230307"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230307#p230307"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />ŁAŁ ! bardzo ładny projekcik ! ... pomysłowo zrobiona płyta ... widać mnóstwo włożonej pracy ... jest na czym oko zawiesić  Naprawdę śliczne wykonanie ! Aż miło się patrzy i czyta.<br /></div><br /><div class="quotetitle">landrynek napisał(a):</div><div class="quotecontent"><br />super projekt!<br /></div><br /><br />Dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle">landrynek napisał(a):</div><div class="quotecontent"><br />Masz może jakiegoś githuba z tym kodem?<br /></div><br />Nie mam, nigdy nie korzystałem. Ale może najwyższy czas założyć konto <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=10748">Makowka</a> — 26 gru 2020, o 19:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[landrynek]]></name></author>
<updated>2020-12-26T18:05:21+01:00</updated>
<published>2020-12-26T18:05:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230306#p230306</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230306#p230306"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230306#p230306"><![CDATA[
super projekt!<br /><br />Masz może jakiegoś githuba z tym kodem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21329">landrynek</a> — 26 gru 2020, o 18:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2020-12-26T17:06:34+01:00</updated>
<published>2020-12-26T17:06:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230305#p230305</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230305#p230305"/>
<title type="html"><![CDATA[Re: STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230305#p230305"><![CDATA[
ŁAŁ ! bardzo ładny projekcik ! ... pomysłowo zrobiona płyta ... widać mnóstwo włożonej pracy ... jest na czym oko zawiesić <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Naprawdę śliczne wykonanie ! Aż miło się patrzy i czyta.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 26 gru 2020, o 17:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Makowka]]></name></author>
<updated>2020-12-26T16:36:16+01:00</updated>
<published>2020-12-26T16:36:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230304#p230304</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230304#p230304"/>
<title type="html"><![CDATA[STM32-WS-RGB Clock 2021]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23494&amp;p=230304#p230304"><![CDATA[
Witam,<br /><br />Widzę, że chyba wszystkim udziela się ostatnio magia świąt, co widać po wzroście zainteresowań wszelkimi inteligentnymi diodami RGB. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  Ja zatem nie pozostaję gorszy i prezentuję projekt zegarka-prezentu dla dziewczyny opartego o miktokontroler STM32 z nowej rodziny G0, nad którym pracuję od listopada. Działa on w 99%  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  Pozostało mi do ukończenia dosłownie kilka funkcji narzędziowych, które nie są jakoś specjalnie istotne. Mam nadzieję, że wielu osobom, które tak jak ja przesiadają się na 32-bitowce, uda mi się przy okazji pokazać jak ja podchodzę do wykorzystania ich możliwości, a jak wiadomo wbudowanych peryferiów mają one masę! Dodam tylko na wstępie, że program napisany został bezpośrednio &quot;na rejestrach&quot;, także zwolennicy CMSIS powinni być zadowoleni  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />   Do dzieła!<br /><br /><strong>Założenia sprzętowe:</strong><br />- Zasilanie za pomocą 12VDC (zastosowałem dwie przetwornice: A8498 oraz LDO1117 3.3V),<br />- Wyświetlanie godziny, minuty, aktualnej daty za pomocą WS2812, wyświetlacza multiplexowanego LED,<br />- Powitalne wiadomości na dolnym wyświetlaczu,<br />- Możliwość konfiguracji za pomocą USART (w przyszłości umożliwiona rozbudowa o moduł WiFi - serwer NTP i takie bajery  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ), oraz trzech przycisków tact-switch,<br />- Dostosowanie kolorów do odpowiedniej pory dnia (rano żółty, po południu ciepła zieleń, wieczem pomarańcz i fiolet, a w nocy ciemny niebieski),<br />- Płynna regulacja jasności w zależności od oświetlenia w pokoju,<br />- Możliwość zapisywania danych do zewnętrznej pamięci EEPROM 2kB,<br />- Wsparcie Battery Backup Domain za pomocą superkondensatora sterowanego mosfetem,<br />- Buzzer (jako funkcja alarmu i nie tylko <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />),<br />- Status LED.<br /><br /><strong>Założenia programowe:</strong><br />- Stworzenie pełnej biblioteki wspierającej WS2812 i ładującej wszystkie dane do jednego bufora (w ten sposób łatwo wzbogacić program o użycie DMA),<br />- Stworzenie biblioteki do wyświetlania cyfr i znaków (wraz ze scrollowaniem) na alfanumerycznym wyświetlaczu 16-segmentowym,<br />- Wykorzystanie wewnętrznego zegara RTC oraz możliwość jego ŁATWEJ kalibracji,<br />- Uniwersalne funkcje do konfiguracji czasu i daty w rejestrach RTC,<br />- Proste menu konfiguracyjne (wymaga jeszcze dopracowania)<br /><br /><br /><strong>Schemat i model 3D płytki PCB:</strong><br />Znajduje się w pliku załączonym pod postem.<br /><br /><strong>Zdjęcia:</strong><br /><br /><br /><a href="https://obrazkiforum.atnel.pl/10748/16edd8f3676a1d6aebdcef2a385a12be.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/16edd8f3676a1d6aebdcef2a385a12be.JPG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10748/042b99a4746a18cf2db2613fb5f45c31.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/042b99a4746a18cf2db2613fb5f45c31.JPG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10748/06ef034b87915b8f29028a161cc737b3.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/06ef034b87915b8f29028a161cc737b3.JPG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10748/c3ff40cf3c9280e8fd06325c7fb3c73f.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/c3ff40cf3c9280e8fd06325c7fb3c73f.JPG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10748/4a8dc517104a990f9d6b25db87171c32.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/4a8dc517104a990f9d6b25db87171c32.JPG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10748/33adf013fc38e31726cd67954358b29c.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/33adf013fc38e31726cd67954358b29c.JPG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10748/78f21cad0ad2674f52fc25e15bb28c9e.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/78f21cad0ad2674f52fc25e15bb28c9e.JPG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10748/7f560cc1e5f81a307c7bdd8a778db34f.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/7f560cc1e5f81a307c7bdd8a778db34f.JPG" alt="Obrazek" /></a><br /><br /><br /><strong>Pliki źródłowe (z komentarzami) i biblioteki:</strong><br /><br />main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: Dec 15, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#include &quot;stm32g071xx.h&quot;<br />#include &quot;config.h&quot;<br />#include &quot;ws_lib.h&quot;<br />#include &quot;segment_dsp.h&quot;<br />#include &quot;clock.h&quot;<br />#include &quot;clk_menu.h&quot;<br /><br /><br />int main(void) {<br /><br />uint8_t red, green, blue;// Digit colour channel values<br /><br />TMENU menu_strct;<br /><br />SystemCFG();// Configure uC registers<br /><br /><br /><br />// Clear LCD Display (display SPACEs)<br />LEDClr();<br /><br />// Clear WS2812B Display<br />FillLEDArray(LED_buf, 0, 0, 0);<br />SPI_SEND_WSBUF(LED_buf, sizeof(LED_buf));<br /><br />// Scroll welcome message<br />ScrollLed(&quot;hi celine&quot;, medium, sizeof(&quot;hi celine&quot;));<br /><br /><br />// Register menu executive functions<br />menu_strct.configuration = (void*)displayConfig;<br />menu_strct.alarm = (void*)displayAlarm;<br />menu_strct.study = (void*)displayStudy;<br /><br />button_flag&#91;B_UP&#93;=0;<br />button_flag&#91;B_DOWN&#93;=0;<br />button_flag&#91;B_SET&#93;=0;<br /><br /><br />dot_enable&#91;1&#93;++; dot_enable&#91;3&#93;++;// Enable LED dots (for displaying the date)<br /><br /><br />while (1) {<br /><br />// IF ADC idle, start conversion<br />if ((ADC1-&gt;CR &amp; ADC_CR_ADSTART) == 0) {<br />ADC1-&gt;CR |= ADC_CR_ADSTART;// Start ADC conversion<br />}<br /><br /><br />// Display current date<br />DisplayNumberSet(day_t, day_u, month_t, month_u, year_t, year_u);<br /><br />// Assign current color values<br />assignColour(hour_t, hour_u, &amp;red, &amp;green, &amp;blue);<br />// Display the current date<br /><br /><br />// Display the current time<br />FillLEDArray(LED_buf, 0, 0, 0);<br />FillLEDNumber(LED_buf, 0, hour_t, red, green, blue);<br />FillLEDNumber(LED_buf, 1, hour_u, red, green, blue);<br />FillLEDNumber(LED_buf, 2, minute_t, red, green, blue);<br />FillLEDNumber(LED_buf, 3, minute_u, red, green, blue);<br />SPI_SEND_WSBUF(LED_buf, sizeof(LED_buf));<br />delay_ms(990);<br />FillLEDSegment(LED_buf, 26, 27, 0x0f, 0x03, 0);<br />SPI_SEND_WSBUF(LED_buf, sizeof(LED_buf));<br />delay_ms(990);<br /><br />if (button_flag&#91;B_SET&#93;) {<br />button_flag&#91;B_SET&#93;=0;<br />dot_enable&#91;1&#93;=0; dot_enable&#91;3&#93;=0;<br />displayMenu(&amp;menu_strct);<br />dot_enable&#91;1&#93;=1; dot_enable&#91;3&#93;=1;<br />}<br /><br /><br />}<br /><br />}[/syntax]<br /><br /><em>Biblioteka WS2812</em><br />ws_lib.h<br />[syntax=c]/*<br /> * ws_lib.h<br /> *<br /> *  Created on: Dec 20, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#ifndef INC_WS_LIB_H_<br />#define INC_WS_LIB_H_<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &quot;stm32g071xx.h&quot;<br />#include &quot;segment_dsp.h&quot;<br />#include &quot;clock.h&quot;<br /><br /><br />#define WS_NUMBER 54// Number of ALL WS2812B LEDs<br /><br /><br />uint8_t LED_buf&#91;WS_NUMBER*24&#93;;// (WS_NUMBER * 3 colors * 8 bytes/color)<br /><br /><br />#define SPI_zero 0b11000000// HEX: 0xC0<br />#define SPI_one 0b11111000// HEX: 0xF8<br />#define SPI_reset 0b00000000// HEX: 0x00<br /><br /><br />void FillLEDArray(volatile uint8_t * array, uint8_t green, uint8_t red, uint8_t blue);<br />void FillLEDSegment(volatile uint8_t * array, uint8_t start_idx, uint8_t end_idx, uint8_t red, uint8_t green, uint8_t blue);<br />void FillLEDNumber(volatile uint8_t * array, uint8_t pos, uint8_t nbr, uint8_t red, uint8_t green, uint8_t blue);<br />void getBaseColour(uint8_t col_val);<br />void getBaseLed(uint8_t green, uint8_t red, uint8_t blue);<br /><br />void SPI_SEND_WSBUF(uint8_t * buf, uint16_t size);<br />void SpiLed_Send(uint8_t data);<br /><br />void assignColour(uint8_t ht, uint8_t hu, uint8_t * r, uint8_t * g, uint8_t * b);<br /><br /><br />#endif /* INC_WS_LIB_H_ */[/syntax]<br /><br />ws_lib.c<br />[syntax=c]/*<br /> * ws_lib.c<br /> *<br /> *  Created on: Dec 20, 2020<br /> *      Author: Michal Makowka<br /> */<br />#include &quot;ws_lib.h&quot;<br /><br />// Auxiliary arrays to fill the SPI LED buffer<br />uint8_t b_colour&#91;8&#93;;<br />uint8_t b_led&#91;24&#93;;<br /><br />volatile uint8_t brg_div = 18;<br /><br />volatile uint16_t ADC_result;// ADC result for the DEBUG purpose<br /><br />// This function updates LED data array (first argument) with a number &quot;nbr&quot; on a given position 0 &lt;= &quot;pos&quot; &lt;= 3<br />void FillLEDNumber(volatile uint8_t * array, uint8_t pos, uint8_t nbr, uint8_t red, uint8_t green, uint8_t blue) {<br /><br />uint8_t shift;<br /><br />if (pos&gt;1) shift = ((pos*13)+2);<br />else shift = (pos*13);<br /><br />switch(nbr) {<br />case 0:<br />FillLEDSegment(array, (0+shift), (11+shift), red, green, blue);<br />break;<br />case 1:<br />FillLEDSegment(array, (2+shift), (6+shift), red, green, blue);<br />break;<br />case 2:<br />FillLEDSegment(array, (0+shift), (4+shift), red, green, blue);<br />FillLEDSegment(array, (6+shift), (10+shift), red, green, blue);<br />FillLEDSegment(array, (12+shift), (12+shift), red, green, blue);<br />break;<br />case 3:<br />FillLEDSegment(array, (0+shift), (8+shift), red, green, blue);<br />FillLEDSegment(array, (10+shift), (10+shift), red, green, blue);<br />FillLEDSegment(array, (12+shift), (12+shift), red, green, blue);<br />break;<br />case 4:<br />FillLEDSegment(array, (0+shift), (0+shift), red, green, blue);<br />FillLEDSegment(array, (2+shift), (6+shift), red, green, blue);<br />FillLEDSegment(array, (10+shift), (12+shift), red, green, blue);<br />break;<br />case 5:<br />FillLEDSegment(array, (0+shift), (2+shift), red, green, blue);<br />FillLEDSegment(array, (4+shift), (8+shift), red, green, blue);<br />FillLEDSegment(array, (10+shift), (12+shift), red, green, blue);<br />break;<br />case 6:<br />FillLEDSegment(array, (0+shift), (2+shift), red, green, blue);<br />FillLEDSegment(array, (4+shift), (12+shift), red, green, blue);<br />break;<br />case 7:<br />FillLEDSegment(array, (0+shift), (6+shift), red, green, blue);<br />break;<br />case 8:<br />FillLEDSegment(array, (0+shift), (12+shift), red, green, blue);<br />break;<br />case 9:<br />FillLEDSegment(array, (0+shift), (8+shift), red, green, blue);<br />FillLEDSegment(array, (10+shift), (12+shift), red, green, blue);<br />break;<br />default:<br />break;<br />}<br />}<br /><br /><br /><br />// This function updates the entire LED data buffer (first argument)<br />void FillLEDArray(volatile uint8_t * array, uint8_t red, uint8_t green, uint8_t blue) {// * array is the array to be entirely filled with LED data<br />uint16_t a, b, c;<br />b=0;<br />for (a=0; a&lt;(WS_NUMBER*24); a++) {<br />getBaseLed(green, red, blue);<br />c=0;<br />while(c&lt;23) {<br />array&#91;a&#93; = b_led&#91;b&#93;; a++; b++;<br />c++;<br />}<br />array&#91;a&#93; = b_led&#91;b&#93;; b++;<br />b=0;<br />}<br />}<br />// This function updates LED data array (first argument) within specified indexes: start_idx and end_idx<br />void FillLEDSegment(volatile uint8_t * array, uint8_t start_idx, uint8_t end_idx, uint8_t red, uint8_t green, uint8_t blue) {<br />uint16_t a, b, c;<br />b=0;<br />for (a=(start_idx*24); a&lt;=(end_idx*24); a++) {<br />getBaseLed(green, red, blue);<br />c=0;<br />while(c&lt;23) {<br />array&#91;a&#93; = b_led&#91;b&#93;; a++; b++;<br />c++;<br />}<br />array&#91;a&#93; = b_led&#91;b&#93;;   b++;<br />b=0;<br />}<br />}<br /><br />// This function updates b_led&#91;24&#93; array<br />void getBaseLed(uint8_t green, uint8_t red, uint8_t blue) {// *bld is the array to be updated<br />uint8_t k, i;<br /><br />getBaseColour(green);<br />i=7;<br />for (k=0; k&lt;8; k++) {<br />b_led&#91;k&#93; = b_colour&#91;i&#93;;<br />i--;<br />}<br />getBaseColour(red);<br />i=7;<br />for (k=8; k&lt;16; k++) {<br />b_led&#91;k&#93; = b_colour&#91;i&#93;;<br />i--;<br />}<br />getBaseColour(blue);<br />i=7;<br />for (k=16; k&lt;24; k++) {<br />b_led&#91;k&#93; = b_colour&#91;i&#93;;<br />i--;<br />}<br />}<br /><br />// This function updates b_colour&#91;8&#93; array (one colour out of three/led)<br />void getBaseColour(uint8_t col_val) {// *bcl is the array to be updated<br /><br />uint8_t temp;<br />for (uint8_t j=0; j&lt;8; j++) {<br />temp = (col_val&gt;&gt;j);<br />if ((temp%2) == 0) b_colour&#91;j&#93; = SPI_zero;<br />else b_colour&#91;j&#93; = SPI_one;<br />}<br />}<br /><br />void SPI_SEND_WSBUF(uint8_t * buf, uint16_t size) {<br />for(uint16_t i = 0; i&lt;(WS_NUMBER*24); i++) {<br />SpiLed_Send(LED_buf&#91;i&#93;);<br />}<br />}<br /><br />void SpiLed_Send(uint8_t data) {<br />while( !(SPI1-&gt;SR &amp; SPI_SR_TXE) );<br />SPI1-&gt;DR = data;<br />}<br /><br />// Update colour variable passed depending on a time (#define in clock.h file)<br />void assignColour(uint8_t ht, uint8_t hu, uint8_t * r, uint8_t * g, uint8_t * b) {<br />uint8_t hr = 10*(ht) + hu;// Hour in decimal format<br />*r=0; *g=0; *b=0;<br />if (hr &gt;= 6 &amp;&amp; hr &lt; 12) *r = (R_T1/brg_div);<br />else if (hr &gt;= 12 &amp;&amp; hr &lt; 18) *r = (R_T2/brg_div);<br />else if (hr &gt;= 18 &amp;&amp; hr &lt; 21) *r = (R_T3/brg_div);<br />else if (hr &gt;= 21 &amp;&amp; hr &lt; 23) *r = (R_T4/brg_div);<br />else if (hr &gt;= 23 &amp;&amp; hr &lt; 5) *r = (R_T5/brg_div);<br />else if (hr &gt;= 5 &amp;&amp; hr &lt; 6) *r = (R_T6/brg_div);<br /><br />if (hr &gt;= 6 &amp;&amp; hr &lt; 12) *g = (G_T1/brg_div);<br />else if (hr &gt;= 12 &amp;&amp; hr &lt; 18) *g = (G_T2/brg_div);<br />else if (hr &gt;= 18 &amp;&amp; hr &lt; 21) *g = (G_T3/brg_div);<br />else if (hr &gt;= 21 &amp;&amp; hr &lt; 23) *g = (G_T4/brg_div);<br />else if (hr &gt;= 23 &amp;&amp; hr &lt; 5) *g = (G_T5/brg_div);<br />else if (hr &gt;= 5 &amp;&amp; hr &lt; 6) *g = (G_T6/brg_div);<br /><br />if (hr &gt;= 6 &amp;&amp; hr &lt; 12) *b = (B_T1/brg_div);<br />else if (hr &gt;= 12 &amp;&amp; hr &lt; 18) *b = (B_T2/brg_div);<br />else if (hr &gt;= 18 &amp;&amp; hr &lt; 21) *b = (B_T3/brg_div);<br />else if (hr &gt;= 21 &amp;&amp; hr &lt; 23) *b = (B_T4/brg_div);<br />else if (hr &gt;= 23 || hr &lt; 5) *b = (B_T5/brg_div);<br />else if (hr &gt;= 5 &amp;&amp; hr &lt; 6) *b = (B_T6/brg_div);<br />}<br /><br />uint8_t ADCCompress (uint16_t adc) {<br /><br />if (adc &gt; 0 &amp;&amp; adc &lt; 1801) return 2;// Much light<br />if (adc &gt; 1800 &amp;&amp; adc &lt; 2101) return 3;<br />if (adc &gt; 2100 &amp;&amp; adc &lt; 2401) return 5;<br />if (adc &gt; 2400 &amp;&amp; adc &lt; 2701) return 7;<br />if (adc &gt; 2700 &amp;&amp; adc &lt; 3001) return 8;<br />if (adc &gt; 3000 &amp;&amp; adc &lt; 3301) return 10;<br />if (adc &gt; 3300 &amp;&amp; adc &lt; 3601) return 12;<br />if (adc &gt; 3600 &amp;&amp; adc &lt; 3901) return 14;<br />if (adc &gt; 3900 &amp;&amp; adc &lt; 4201) return 20;// No light<br />if (adc &gt; 4200) return 22;<br /><br />return 16;// If LDR malfunction, return default (16)<br />}<br /><br /><br />__attribute__((interrupt)) void ADC1_COMP_IRQHandler(void){<br />ADC1-&gt;ISR |= ADC_ISR_EOC;// Clear end of conversion flag<br />ADC_result = ADC1-&gt;DR;<br />brg_div = ADCCompress(ADC_result);<br /><br />}[/syntax]<br /><br /><em>Pliki konfiguracyjne (ustawienia rejestrów STM32)</em><br />config.h<br />[syntax=c]/*<br /> * config.h<br /> *<br /> *  Created on: Dec 15, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#ifndef INC_CONFIG_H_<br />#define INC_CONFIG_H_<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &quot;stm32g071xx.h&quot;<br /><br />// RTC Calibration values<br />// By default, the value of PREDIV_A = 127, PREDIV_S = 255, CALP = 0, CALM = 0<br />#define PREDIV_A 127// &#91;val: 0-127&#93;<br />#define PREDIV_S 251// &#91;val: 0-32767&#93;<br />#define CALP 0// &#91;val: 0-1&#93;<br />#define CALM 511// &#91;val: 0-511&#93;<br />/*<br /> * Set RTC_OSC_CALIB_OUTPUT_EN to 1 if RTC_OUT clk signal<br /> * needs to be available on the PA4 (RTC_OUT2 - 1Hz); otherwise, set to 0.<br /> * This feature is useful to sample the RTC clk source by a logic analyser.<br /> * Set PREDIV_S, CALP, and CALM bits, so that the F_RTC_OUT2 = 1.000Hz<br />*/<br />#define RTC_OSC_CALIB_OUTPUT_EN 0<br /><br /><br />uint8_t d_flag;// Delay flag<br /><br />volatile uint8_t button_flag&#91;3&#93;;<br /><br />enum{B_SET, B_DOWN, B_UP};// Intexes for the button_flag&#91;3&#93; array<br /><br />void SystemCFG (void);<br />void delay_ms (uint16_t ms);[/syntax]<br /><br />config.c<br />[syntax=c]/*<br /> * config.c<br /> *<br /> *  Created on: Dec 15, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#include &quot;config.h&quot;<br />#include &quot;ws_lib.h&quot;<br /><br /><br /><br />void SystemCFG (void){<br /><br />// *** Configure System Clock (48MHz for each system BUS) ***<br />RCC-&gt;PLLCFGR &amp;= ~RCC_PLLCFGR_PLLN_4;// Clear (as it's 1 by default)<br />RCC-&gt;PLLCFGR |= RCC_PLLCFGR_PLLN_2 | RCC_PLLCFGR_PLLN_3;// Set PLLN Mult. for 12 (0000 1100)<br />RCC-&gt;PLLCFGR |= RCC_PLLCFGR_PLLR_0;// Set PLLR Div. for 2 (001)<br />RCC-&gt;PLLCFGR |= RCC_PLLCFGR_PLLSRC_0 | RCC_PLLCFGR_PLLSRC_1;// Fpllin = HSE<br />RCC-&gt;PLLCFGR |= RCC_PLLCFGR_PLLREN;// Enable output of the PLL<br />RCC-&gt;CFGR |= RCC_CFGR_SW_1;// PLLRCLK for SYSCLK<br />RCC-&gt;PLLCFGR |= RCC_PLLCFGR_PLLPEN;<br />FLASH-&gt;ACR |= FLASH_ACR_LATENCY_1;<br />RCC-&gt;CR |= RCC_CR_HSEON;// HSE ON<br />while (!(RCC-&gt;CR &amp; RCC_CR_HSERDY)); // Wait for HSE ON<br />RCC-&gt;CR |= RCC_CR_PLLON;// PLL ON<br />while ((RCC-&gt;CR &amp; RCC_CR_PLLRDY)); // Check if PLL not locked<br />while ((RCC-&gt;CFGR &amp; RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);// Check for a correct source set<br />RCC-&gt;CR &amp;= ~RCC_CR_HSION;// 16MHz HSI OFF<br />// *********************************<br /><br /><br />// *** Configure GPIO: Techled, LED Display, BUZZ ***<br />RCC-&gt;IOPENR |= RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN | RCC_IOPENR_GPIOCEN | RCC_IOPENR_GPIODEN | RCC_IOPENR_GPIOFEN;// GPIO: ABCDF<br /><br />GPIOB-&gt;MODER = GPIO_MODER_MODE0_0 | GPIO_MODER_MODE1_0 | GPIO_MODER_MODE2_0 | GPIO_MODER_MODE3_0 |<br />GPIO_MODER_MODE4_0 | GPIO_MODER_MODE5_0 | GPIO_MODER_MODE6_0 | GPIO_MODER_MODE7_0 |<br />GPIO_MODER_MODE8_0 | GPIO_MODER_MODE9_0 | GPIO_MODER_MODE10_0 | GPIO_MODER_MODE11_0 |<br />GPIO_MODER_MODE12_0 | GPIO_MODER_MODE13_0 | GPIO_MODER_MODE14_0;// PB0-PB14: Output<br /><br />// LED Cathodes<br />GPIOC-&gt;ODR |= (GPIO_ODR_OD6 | GPIO_ODR_OD7);<br />GPIOC-&gt;MODER &amp;= ~(GPIO_MODER_MODE6_1 | GPIO_MODER_MODE7_1);// PC6-PC7: Output<br />GPIOD-&gt;ODR |= (GPIO_ODR_OD0 | GPIO_ODR_OD1 | GPIO_ODR_OD2 | GPIO_ODR_OD3);<br />GPIOD-&gt;MODER &amp;= ~(GPIO_MODER_MODE0_1 | GPIO_MODER_MODE1_1 | GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1);// PD0-PD3: Output<br />// Techled, BUZZ<br />GPIOA-&gt;MODER &amp;= ~(GPIO_MODER_MODE6_1 | GPIO_MODER_MODE7_1);// PA6-PA7: Output<br />// *********************************<br /><br /><br /><br />// *** Configure TIM14 for delay subroutine ***<br />NVIC_EnableIRQ(TIM14_IRQn);<br />RCC-&gt;APBENR2 |= RCC_APBENR2_TIM14EN;// Enable TIM14 clock<br />TIM14-&gt;CCMR1 |= TIM_CCMR1_OC2M_0;// Set channel 1 to active level on match<br />TIM14-&gt;DIER |= TIM_DIER_CC1IE;<br />TIM14-&gt;PSC = 47999;/// 1000 Hz(psc = 47999), F_CPU = 48MHz<br />// *********************************<br /><br /><br />// *** Configure TIM15 for Segment Multiplexing ***<br />NVIC_EnableIRQ(TIM15_IRQn);<br />RCC-&gt;APBENR2 |= RCC_APBENR2_TIM15EN;// Enable TIM15 clock<br />TIM15-&gt;CCMR1 |= TIM_CCMR1_OC2M_0;// Set channel 1 to active level on match<br />TIM15-&gt;DIER |= TIM_DIER_CC1IE;<br />TIM15-&gt;PSC = 1;/// 1000 Hz(psc = 47999), F_CPU = 48MHz<br />TIM15-&gt;CR1 |= TIM_CR1_CEN;// Counter enable<br />// *********************************<br /><br /><br />// *** Configure RTC Clock ***<br />RCC-&gt;APBENR1 |= RCC_APBENR1_RTCAPBEN | RCC_APBENR1_PWREN;<br />PWR-&gt;CR1 |= PWR_CR1_DBP;// Disable RTC write protection<br />RCC-&gt;BDCR |= RCC_BDCR_LSEON;// LSE eabled<br />while(!(RCC-&gt;BDCR &amp; RCC_BDCR_LSERDY));// Wait for LSE ready<br />RCC-&gt;BDCR |= RCC_BDCR_RTCSEL_0 | RCC_BDCR_RTCEN;// LSE for the RTC, RTC enable<br /><br /><br />// RTC CALIBRATION PROCESS<br />// Update RTC_PRER register<br />uint32_t tmp_prer = RTC-&gt;PRER;<br />tmp_prer &amp;= ~(0x7f7fff);// Set zeros to the tmp_pres Prediv_A and Prediv_S register<br />tmp_prer |= (PREDIV_A&lt;&lt;16);// SET PREDIV_A &#91;val: 0-127&#93;<br />tmp_prer |= PREDIV_S;// SET PREDIV_S &#91;val: 0-32767&#93;<br />RTC-&gt;WPR = 0xca;<br />RTC-&gt;WPR = 0x53;// Write protection disabled<br />// Enter clock init mode<br />RTC-&gt;ICSR |= RTC_ICSR_INIT;<br />while ((RTC-&gt;ICSR &amp; RTC_ICSR_INITF) == 0);// Wait until ready to update<br />RTC-&gt;PRER = tmp_prer;// Update PRER register<br />RTC-&gt;ICSR &amp;= ~RTC_ICSR_INIT;// Disable RTC init mode<br /><br />// Update RTC_CALR register<br />uint32_t tmp_calr = RTC-&gt;CALR;<br />tmp_calr &amp;= ~(0x81ff);// CALP and CALM mask (setting to zero)<br />tmp_calr |= (CALP&lt;&lt;15);// SET CALP &#91;val: 0-1&#93;<br />tmp_calr |= (CALM);// SET CALM &#91;val: 0-511&#93;<br />RTC-&gt;WPR = 0xca;<br />RTC-&gt;WPR = 0x53;// Write protection disabled<br />RTC-&gt;CALR = tmp_calr;// Update CALR resgister<br /><br />#if (RTC_OSC_CALIB_OUTPUT_EN)<br />// Map the RTC clock on the PA4 pin (RTC_OUT2)<br />RTC-&gt;CR |= RTC_CR_COE;// Calibration output enabled<br />RTC-&gt;CR |= RTC_CR_COSEL;// F_calibration = 1Hz<br />GPIOA-&gt;MODER &amp;= ~GPIO_MODER_MODE4_1;<br />RTC-&gt;CR |= RTC_CR_OUT2EN;// RTC clock available on PA4 - RTC_OUT2<br />#endif<br />#if (!RTC_OSC_CALIB_OUTPUT_EN)<br />RTC-&gt;CR &amp;= ~RTC_CR_COE;// Calibration output disbled<br />RTC-&gt;CR &amp;= ~RTC_CR_COSEL;// F_calibration 1Hz disabled<br />GPIOA-&gt;MODER |= GPIO_MODER_MODE4_1;<br />RTC-&gt;CR &amp;= ~RTC_CR_OUT2EN;// RTC clock disabled on PA4 - RTC_OUT2<br />#endif<br />// END OF RTC CALIBRATION PROCESS<br />// *********************************<br /><br /><br />// *** Configure TIM16 for RTC clock data update ***<br />NVIC_EnableIRQ(TIM16_IRQn);<br />RCC-&gt;APBENR2 |= RCC_APBENR2_TIM16EN;// Enable TIM16 clock<br />TIM16-&gt;PSC = 47999;<br />TIM16-&gt;CCR1 = 250;<br />TIM16-&gt;DIER |= TIM_DIER_CC1IE;// CaptureCompare1 Interrupt Enable(2Hz)<br />TIM16-&gt;CR1 |= TIM_CR1_CEN;// Counter enable<br />// *********************************<br /><br /><br />// *** Configure SPI ***<br />NVIC_EnableIRQ(SPI1_IRQn);<br />GPIOA-&gt;MODER &amp;= ~GPIO_MODER_MODE2_0;// MODER: 10 - Alternative function<br />// GPIOA-&gt;AFR&#91;0&#93; // AFDEL set to 0000 automatically (SPI1_MOSI)<br />SPI1-&gt;CR1 |= SPI_CR1_BR_1;// SPI psc (010) : (8), 48/8 = 6Mhz set<br />SPI1-&gt;CR1 |= (SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI);// Set as Master (also, enable software slave management)<br />SPI1-&gt;CR1 |= SPI_CR1_CPHA;// The second clock transition is the first data capture edge (as a result, first LED will always be active)<br />// 8-bit data length set initially by the hardware<br />SPI1-&gt;CR1 |= SPI_CR1_SPE;// SPI enable<br />// *********************************<br /><br /><br />// *** Configure ADC ***<br />NVIC_EnableIRQ(ADC1_COMP_IRQn);<br />RCC-&gt;APBENR2 |= RCC_APBENR2_ADCEN;<br />ADC1-&gt;IER |= ADC_IER_EOCIE;// End of conversion interrupt enable<br />ADC1-&gt;CR |= ADC_CR_ADVREGEN;// ADC voltage regulator enable<br />ADC1-&gt;CFGR1 |= ADC_CFGR1_DISCEN;// ADC discontinuous mode enabled<br />ADC1-&gt;CFGR1 |= ADC_CFGR1_OVRMOD;// Overwire with the last conversion result<br />ADC1-&gt;CHSELR |= ADC_CHSELR_CHSEL5;// Channel 5 selected for conversion<br /><br />ADC1-&gt;CR |= ADC_CR_ADEN;// Start ADC<br />while((ADC1-&gt;ISR &amp; ADC_ISR_ADRDY) == 0);<br />ADC1-&gt;ISR |= ADC_ISR_ADRDY;// Clear flag<br />// *********************************<br /><br />// *** Configure USART1 ***<br />GPIOA-&gt;MODER &amp;= ~(GPIO_MODER_MODE9_1 | GPIO_MODER_MODE10_1);// GPIO Output mode<br />// *********************************<br /><br />// *** Configure EXTI (switches) ***<br />// SW2 (SET) - PA11 | SW3 (DOWN) - PA12 | SW4 (UP) - PB15<br />GPIOA-&gt;MODER &amp;= ~(GPIO_MODER_MODE11_0 | GPIO_MODER_MODE11_1);<br />GPIOA-&gt;MODER &amp;= ~(GPIO_MODER_MODE12_0 | GPIO_MODER_MODE12_1);<br />GPIOB-&gt;MODER &amp;= ~(GPIO_MODER_MODE15_0 | GPIO_MODER_MODE15_1);<br />GPIOA-&gt;PUPDR |= GPIO_PUPDR_PUPD11_0;<br />GPIOA-&gt;PUPDR |= GPIO_PUPDR_PUPD12_0;<br />GPIOB-&gt;PUPDR |= GPIO_PUPDR_PUPD15_0;<br /><br />NVIC_EnableIRQ(EXTI4_15_IRQn);<br />EXTI-&gt;EXTICR&#91;2&#93; |= ((0x00)&lt;&lt;24);// Set PA11<br />EXTI-&gt;EXTICR&#91;3&#93; |= ((0x00)&lt;&lt;0);// Set PA12<br />EXTI-&gt;EXTICR&#91;3&#93; |= ((0x01)&lt;&lt;24);// Set PB15<br />EXTI-&gt;FTSR1 |= EXTI_FTSR1_FT11 | EXTI_FTSR1_FT12 | EXTI_FTSR1_FT15;// Falling edge event<br />EXTI-&gt;IMR1 |= EXTI_IMR1_IM11 | EXTI_IMR1_IM12 | EXTI_IMR1_IM15;<br />// *********************************<br /><br /><br />}<br /><br /><br />void delay_ms (uint16_t ms){<br />d_flag = 0;<br />TIM14-&gt;CCR1 = ms;<br />TIM14-&gt;CR1 |= TIM_CR1_CEN;// Counter enable<br />while(!d_flag);<br />}<br /><br /><br /><br /><br />__attribute__((interrupt)) void TIM14_IRQHandler(void){<br />if (TIM14-&gt;SR &amp; TIM_SR_CC1IF){<br />TIM14-&gt;SR &amp;= ~TIM_SR_CC1IF;// Clear flag<br />TIM14-&gt;CR1 &amp;= ~TIM_CR1_CEN;// Counter disabled<br />TIM14-&gt;EGR |= TIM_EGR_UG;// Reinitialise the counter<br />d_flag = 1;<br />}<br />}<br /><br /><br />__attribute__((interrupt)) void EXTI4_15_IRQHandler(void){<br />if ((EXTI-&gt;FPR1 &amp; EXTI_FPR1_FPIF11)){// SET button<br />EXTI-&gt;FPR1 |= EXTI_FPR1_FPIF11;<br />button_flag&#91;B_SET&#93; = 1;<br />}<br /><br />if ((EXTI-&gt;FPR1 &amp; EXTI_FPR1_FPIF12)){// DOWN button<br />EXTI-&gt;FPR1 |= EXTI_FPR1_FPIF12;<br />button_flag&#91;B_DOWN&#93; = 1;<br />}<br /><br />if ((EXTI-&gt;FPR1 &amp; EXTI_FPR1_FPIF15)){// UP button<br />EXTI-&gt;FPR1 |= EXTI_FPR1_FPIF15;<br />button_flag&#91;B_UP&#93; = 1;<br />}<br />}[/syntax]<br /><br /><em>Biblioteka do obsługi wyświetlacza 16-seg</em><br />segment_dsp.h<br />[syntax=c]/*<br /> * segment_dsp.h<br /> *<br /> *  Created on: Dec 21, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#ifndef INC_SEGMENT_DSP_H_<br />#define INC_SEGMENT_DSP_H_<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &quot;stm32g071xx.h&quot;<br /><br />#include &quot;config.h&quot;<br /><br /><br />volatile uint8_t dot_enable&#91;6&#93;;<br />volatile uint16_t led_dsp&#91;6&#93;;// Array holding the LED display value<br /><br /><br />enum {slow = 350, medium = 200, fast = 100};// LED display scroll speed<br />enum {OFF, ON};// LCD dot enabled, disabled<br /><br /><br />void ScrollLed(char * data, uint16_t speed, uint8_t len);<br />void DisplayNumberSet(uint8_t n0, uint8_t n1, uint8_t n2, uint8_t n3, uint8_t n4, uint8_t n5);<br />void DisplayLEDStr(char * str);<br />void displayChar(char c, uint8_t pos);<br />void setDigit (uint8_t digit);<br /><br />void LEDClr(void);<br /><br /><br />#endif /* INC_SEGMENT_DSP_H_ */[/syntax]<br /><br />segment_dsp.c<br />[syntax=c]/*<br /> * segment_dsp.c<br /> *<br /> *  Created on: Dec 21, 2020<br /> *      Author: Michal Makowka<br /> */<br />#include &quot;segment_dsp.h&quot;<br /><br /><br />#define D0_SET GPIOC-&gt;BSRR = GPIO_BSRR_BR6<br />#define D1_SET GPIOC-&gt;BSRR = GPIO_BSRR_BR7<br />#define D2_SET GPIOD-&gt;BSRR = GPIO_BSRR_BR0<br />#define D3_SET GPIOD-&gt;BSRR = GPIO_BSRR_BR1<br />#define D4_SET GPIOD-&gt;BSRR = GPIO_BSRR_BR2<br />#define D5_SET GPIOD-&gt;BSRR = GPIO_BSRR_BR3<br /><br />#define D0_CLR GPIOC-&gt;BSRR = GPIO_BSRR_BS6<br />#define D1_CLR GPIOC-&gt;BSRR = GPIO_BSRR_BS7<br />#define D2_CLR GPIOD-&gt;BSRR = GPIO_BSRR_BS0<br />#define D3_CLR GPIOD-&gt;BSRR = GPIO_BSRR_BS1<br />#define D4_CLR GPIOD-&gt;BSRR = GPIO_BSRR_BS2<br />#define D5_CLR GPIOD-&gt;BSRR = GPIO_BSRR_BS3<br /><br /><br /><br />// *** Symbol values representation to be written to the GPIOB ODR register ***<br />const uint16_t ZERO = 32704;<br />const uint16_t ONE = 32761;<br />const uint16_t TWO = 28388;<br />const uint16_t THREE = 28400;<br />const uint16_t FOUR = 28377;<br />const uint16_t FIVE = 28370;<br />const uint16_t SIX = 28354;<br />const uint16_t SEVEN = 32760;<br />const uint16_t EIGHT = 28352;<br />const uint16_t NINE = 28368;<br /><br />const uint16_t SPACE = 32767;<br /><br />const uint16_t A = 28360;<br />const uint16_t B = 31408;<br />const uint16_t C = 32710;<br />const uint16_t D = 31664;<br />const uint16_t E = 28358;<br />const uint16_t F = 28366;<br />const uint16_t G = 32450;<br />const uint16_t H = 28361;<br />const uint16_t I = 31679;<br />const uint16_t J = 32737;<br />const uint16_t K = 27983;<br />const uint16_t L = 32711;<br />const uint16_t M = 16201;<br />const uint16_t N = 15817;<br />const uint16_t O = 32704;<br />const uint16_t P = 28364;<br />const uint16_t Q = 32192;<br />const uint16_t R = 27852;<br />const uint16_t S = 28370;<br />const uint16_t T = 31678;<br />const uint16_t U = 32705;<br />const uint16_t W = 30153;<br />const uint16_t V = 30543;<br />const uint16_t X = 13695;<br />const uint16_t Y = 15231;<br />const uint16_t Z = 63350;<br /><br />// ******** ******** ******** ********<br /><br />// Select for which DOT should be enabled<br />volatile uint8_t dot_enable&#91;6&#93; = {OFF, OFF, OFF, OFF, OFF, OFF};<br /><br /><br />void DisplayNumberSet(uint8_t n0, uint8_t n1, uint8_t n2, uint8_t n3, uint8_t n4, uint8_t n5) {<br />displayChar((n0+48), 0);<br />displayChar((n1+48), 1);<br />displayChar((n2+48), 2);<br />displayChar((n3+48), 3);<br />displayChar((n4+48), 4);<br />displayChar((n5+48), 5);<br />// 48 must be added to reach the number char value from the ASCII table<br />}<br /><br />void DisplayLEDStr(char * str) {<br />uint8_t i;<br />LEDClr();<br />for (i=0; i&lt;6; i++) {<br />displayChar(str&#91;i&#93;, i);<br />}<br />}<br /><br />void ScrollLed(char * data, uint16_t speed, uint8_t len) {<br />uint8_t j=0;<br />uint8_t k=0;<br />char temp_buf&#91;len+12&#93;;<br />memset(temp_buf, 32, (len+12));<br />for (j=6; j&lt;(5+len); j++) {<br />temp_buf&#91;j&#93; = data&#91;k&#93;;<br />k++;<br />}<br />k=0;<br />for (j=0; j&lt;=(6+len); j++) {<br />displayChar(temp_buf&#91;k+j&#93;, 0); k++;<br />displayChar(temp_buf&#91;k+j&#93;, 1); k++;<br />displayChar(temp_buf&#91;k+j&#93;, 2); k++;<br />displayChar(temp_buf&#91;k+j&#93;, 3); k++;<br />displayChar(temp_buf&#91;k+j&#93;, 4); k++;<br />displayChar(temp_buf&#91;k+j&#93;, 5); k=0;<br />delay_ms(speed);<br />}<br />}<br /><br />void displayChar(char c, uint8_t pos) {<br />if (pos&lt;0 &amp;&amp; pos&gt;5) return;<br />if ((c&gt;47 &amp;&amp; c&lt;58) || (c&gt;96 &amp;&amp; c&lt;123) || (c==32)) {<br />if (c=='0') {led_dsp&#91;pos&#93; = ZERO; return;}<br />if (c=='1') {led_dsp&#91;pos&#93; = ONE; return;}<br />if (c=='2') {led_dsp&#91;pos&#93; = TWO; return;}<br />if (c=='3') {led_dsp&#91;pos&#93; = THREE; return;}<br />if (c=='4') {led_dsp&#91;pos&#93; = FOUR; return;}<br />if (c=='5') {led_dsp&#91;pos&#93; = FIVE; return;}<br />if (c=='6') {led_dsp&#91;pos&#93; = SIX; return;}<br />if (c=='7') {led_dsp&#91;pos&#93; = SEVEN; return;}<br />if (c=='8') {led_dsp&#91;pos&#93; = EIGHT; return;}<br />if (c=='9') {led_dsp&#91;pos&#93; = NINE; return;}<br /><br />if (c==' ') {led_dsp&#91;pos&#93; = SPACE; return;}<br /><br />if (c=='a') {led_dsp&#91;pos&#93; = A; return;}<br />if (c=='b') {led_dsp&#91;pos&#93; = B; return;}<br />if (c=='c') {led_dsp&#91;pos&#93; = C; return;}<br />if (c=='d') {led_dsp&#91;pos&#93; = D; return;}<br />if (c=='e') {led_dsp&#91;pos&#93; = E; return;}<br />if (c=='f') {led_dsp&#91;pos&#93; = F; return;}<br />if (c=='g') {led_dsp&#91;pos&#93; = G; return;}<br />if (c=='h') {led_dsp&#91;pos&#93; = H; return;}<br />if (c=='i') {led_dsp&#91;pos&#93; = I; return;}<br />if (c=='j') {led_dsp&#91;pos&#93; = J; return;}<br />if (c=='k') {led_dsp&#91;pos&#93; = K; return;}<br />if (c=='l') {led_dsp&#91;pos&#93; = L; return;}<br />if (c=='m') {led_dsp&#91;pos&#93; = M; return;}<br />if (c=='n') {led_dsp&#91;pos&#93; = N; return;}<br />if (c=='o') {led_dsp&#91;pos&#93; = O; return;}<br />if (c=='p') {led_dsp&#91;pos&#93; = P; return;}<br />if (c=='q') {led_dsp&#91;pos&#93; = Q; return;}<br />if (c=='r') {led_dsp&#91;pos&#93; = R; return;}<br />if (c=='s') {led_dsp&#91;pos&#93; = S; return;}<br />if (c=='t') {led_dsp&#91;pos&#93; = T; return;}<br />if (c=='u') {led_dsp&#91;pos&#93; = U; return;}<br />if (c=='w') {led_dsp&#91;pos&#93; = W; return;}<br />if (c=='v') {led_dsp&#91;pos&#93; = V; return;}<br />if (c=='x') {led_dsp&#91;pos&#93; = X; return;}<br />if (c=='y') {led_dsp&#91;pos&#93; = Y; return;}<br />if (c=='z') {led_dsp&#91;pos&#93; = Z; return;}<br />}<br />}<br /><br /><br />void setDigit(uint8_t digit) {<br />switch(digit) {<br />case 0:<br />D0_SET;<br />D1_CLR;<br />D2_CLR;<br />D3_CLR;<br />D4_CLR;<br />D5_CLR;<br />break;<br />case 1:<br />D0_CLR;<br />D1_SET;<br />D2_CLR;<br />D3_CLR;<br />D4_CLR;<br />D5_CLR;<br />break;<br />case 2:<br />D0_CLR;<br />D1_CLR;<br />D2_SET;<br />D3_CLR;<br />D4_CLR;<br />D5_CLR;<br />break;<br />case 3:<br />D0_CLR;<br />D1_CLR;<br />D2_CLR;<br />D3_SET;<br />D4_CLR;<br />D5_CLR;<br />break;<br />case 4:<br />D0_CLR;<br />D1_CLR;<br />D2_CLR;<br />D3_CLR;<br />D4_SET;<br />D5_CLR;<br />break;<br />case 5:<br />D0_CLR;<br />D1_CLR;<br />D2_CLR;<br />D3_CLR;<br />D4_CLR;<br />D5_SET;<br />break;<br />}<br />}<br /><br />void LEDClr(void) {<br />displayChar(' ', 0);<br />displayChar(' ', 1);<br />displayChar(' ', 2);<br />displayChar(' ', 3);<br />displayChar(' ', 4);<br />displayChar(' ', 5);<br />}<br /><br />// LED display multiplexing<br />__attribute__((interrupt)) void TIM15_IRQHandler(void){<br />if (TIM15-&gt;SR &amp; TIM_SR_CC1IF){<br />TIM15-&gt;SR &amp;= ~TIM_SR_CC1IF;// Clear flag<br />static uint8_t pos = 0;<br />if (pos&gt;5) pos = 0;<br />if (dot_enable&#91;pos&#93; == 1) led_dsp&#91;pos&#93; -= 8192;// Subtract (ENABLE) the bit value responsible for DOT display (note: active low)<br />GPIOB-&gt;ODR = ((0x7FFF) &amp; led_dsp&#91;pos&#93;);// 0x7FFF masks the button value on PB15<br />if (dot_enable&#91;pos&#93; == 1) led_dsp&#91;pos&#93; += 8192;// Add (DISABLE) the bit value responsible for DOT display (note: active low)<br />setDigit(pos);<br />pos++;<br /><br />}<br />}[/syntax]<br /><br /><em>Biblioteka do obsługi RTC/konfiguracji/aktualizacji danych czasu:</em><br />clock.h<br />[syntax=c]/*<br /> * clock.h<br /> *<br /> *  Created on: Dec 22, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#ifndef INC_CLOCK_H_<br />#define INC_CLOCK_H_<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &quot;stm32g071xx.h&quot;<br /><br /><br />volatile uint8_t hour_t;<br />volatile uint8_t hour_u;<br />volatile uint8_t minute_t;<br />volatile uint8_t minute_u;<br /><br />volatile uint8_t year_t;<br />volatile uint8_t year_u;<br />volatile uint8_t month_t;<br />volatile uint8_t month_u;<br />volatile uint8_t day_t;<br />volatile uint8_t day_u;<br /><br />// *** COLOUR DEFINITIONS ***<br />// Each time of the day has a corresponding colour of the clock.<br />// The sum of all three channels per T(X) should add up to 255! Otherwise, auto-brightness will be slightly disturbed!<br />// T1: 6:00 - 12:00<br />#define R_T1 160<br />#define G_T1 95<br />#define B_T1 0<br />// T2: 12:00 - 18:00<br />#define R_T2 100<br />#define G_T2 155<br />#define B_T2 0<br />// T3: 18:00 - 21:00<br />#define R_T3 170<br />#define G_T3 50<br />#define B_T3 35<br />// T4: 21:00 - 23:00<br />#define R_T4 155<br />#define G_T4 0<br />#define B_T4 100<br />// T5: 23:00 - 5:00<br />#define R_T5 0<br />#define G_T5 0<br />#define B_T5 220<br />// T6: 5:00 - 6:00<br />#define R_T6 0<br />#define G_T6 0<br />#define B_T6 220<br />// **************************<br /><br /><br />void setTime(uint8_t t_hour, uint8_t u_hour, uint8_t t_minute, uint8_t u_minute);<br />void setDate(uint8_t t_day, uint8_t u_day, uint8_t t_month, uint8_t u_month, uint8_t t_year, uint8_t u_year);<br /><br /><br />#endif /* INC_CLOCK_H_ */[/syntax]<br /><br />clock.c<br />[syntax=c]/*<br /> * clock.c<br /> *<br /> *  Created on: Dec 22, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#include &quot;clock.h&quot;<br />#include &quot;ws_lib.h&quot;<br /><br />#define TEMP_TR_MASK 0x7f7f7f<br />#define TEMP_DR_MASK 0xffff3f<br /><br /><br />void setTime(uint8_t t_hour, uint8_t u_hour, uint8_t t_minute, uint8_t u_minute) {<br />if(t_hour &gt; 2 || u_hour &gt; 9 || t_minute &gt; 5 || u_minute &gt; 9) return;// Verify the input<br /><br />uint32_t TR_TEMP = 0;// Temporary RTC TR register<br /><br /><br />// Load appropriate values to the temporary time register (TR)<br />TR_TEMP |= (t_hour&lt;&lt;20);<br />TR_TEMP |= (u_hour&lt;&lt;16);<br />TR_TEMP |= (t_minute&lt;&lt;12);<br />TR_TEMP |= (u_minute&lt;&lt;8);<br /><br />// RTC write protection keyes<br />RTC-&gt;WPR = 0xca;<br />RTC-&gt;WPR = 0x53;<br /><br />// Enter clock init mode<br />RTC-&gt;ICSR |= RTC_ICSR_INIT;<br />while ((RTC-&gt;ICSR &amp; RTC_ICSR_INITF) == 0);// Wait until ready to update<br /><br />RTC-&gt;TR = (TR_TEMP &amp; TEMP_TR_MASK);// Update clock registers<br /><br />RTC-&gt;ICSR &amp;= ~RTC_ICSR_INIT;// Disable RTC init mode<br /><br />}<br /><br /><br /><br /><br />void setDate(uint8_t t_day, uint8_t u_day, uint8_t t_month, uint8_t u_month, uint8_t t_year, uint8_t u_year) {<br />if(t_day &gt; 3 || u_day &gt; 9 || t_month &gt; 1 || u_month &gt; 9 || t_year&gt;9 || u_year&gt;9) return;// Verify input<br /><br />uint32_t DR_TEMP = 0;// Temporary RTC DR register<br /><br />// Load appropriate values to the temporary data register (DR)<br />DR_TEMP |= (t_day&lt;&lt;4);<br />DR_TEMP |= (u_day&lt;&lt;0);<br />DR_TEMP |= (t_month&lt;&lt;12);<br />DR_TEMP |= (u_month&lt;&lt;8);<br />DR_TEMP |= (t_year&lt;&lt;20);<br />DR_TEMP |= (u_year&lt;&lt;16);<br /><br />// RTC write protection keyes<br />RTC-&gt;WPR = 0xca;<br />RTC-&gt;WPR = 0x53;<br /><br />// Enter clock init mode<br />RTC-&gt;ICSR |= RTC_ICSR_INIT;<br />while ((RTC-&gt;ICSR &amp; RTC_ICSR_INITF) == 0);// Wait until ready to update<br /><br />RTC-&gt;DR = (DR_TEMP &amp; TEMP_DR_MASK);// Update clock registers<br /><br />RTC-&gt;ICSR &amp;= ~RTC_ICSR_INIT;// Disable RTC init mode<br /><br />}<br /><br /><br /><br /><br />__attribute__((interrupt)) void TIM16_IRQHandler(void){<br />if (TIM16-&gt;SR &amp; TIM_SR_CC1IF){<br />TIM16-&gt;SR &amp;= ~TIM_SR_CC1IF;// Clear flag<br />TIM16-&gt;EGR |= TIM_EGR_UG;// Reinitialise the counter<br /><br />while((RTC-&gt;ICSR &amp; RTC_ICSR_RSF)==0);// See if the data was updated by the RTC<br />hour_t = ((RTC-&gt;TR &amp; RTC_TR_HT)&gt;&gt;20);<br />hour_u = ((RTC-&gt;TR &amp; RTC_TR_HU)&gt;&gt;16);<br />minute_t = ((RTC-&gt;TR &amp; RTC_TR_MNT)&gt;&gt;12);<br />minute_u = ((RTC-&gt;TR &amp; RTC_TR_MNU)&gt;&gt;8);<br /><br /><br />year_t = ((RTC-&gt;DR &amp; RTC_DR_YT)&gt;&gt;20);<br />year_u = ((RTC-&gt;DR &amp; RTC_DR_YU)&gt;&gt;16);<br />month_t = ((RTC-&gt;DR &amp; RTC_DR_MT)&gt;&gt;12);<br />month_u = ((RTC-&gt;DR &amp; RTC_DR_MU)&gt;&gt;8);<br />day_t = ((RTC-&gt;DR &amp; RTC_DR_DT)&gt;&gt;4);<br />day_u = ((RTC-&gt;DR &amp; RTC_DR_DU)&gt;&gt;0);<br /><br />RTC-&gt;ICSR &amp;= ~RTC_ICSR_RSF;// Clear the SR update bit<br /><br /><br />}<br />}[/syntax]<br /><br /><em>Biblioteka menu (zrobiona na szybko i wymaga jeszcze pracy, także proszę się nie przerażać <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> )</em><br />clk_menu.h<br />[syntax=c]/*<br /> * clk_menu.h<br /> *<br /> *  Created on: Dec 25, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#ifndef INC_CLK_MENU_H_<br />#define INC_CLK_MENU_H_<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &quot;stm32g071xx.h&quot;<br />#include &quot;ws_lib.h&quot;<br />#include &quot;segment_dsp.h&quot;<br />#include &quot;config.h&quot;<br /><br /><br /><br />typedef struct menu {<br />// Menu variables<br />uint8_t menu_pos;<br />uint8_t nxt_level;<br />uint8_t back;<br /><br />// Executive functions<br />void (*configuration)(void * wsk);<br />void (*study)(void);<br />void (*alarm)(void);<br /><br />} TMENU;<br /><br /><br />// Menu options: position order<br />enum{p_main_config, p_main_alarm, p_main_study, p_main_back};// Main menu<br />enum{p_conf_time, p_conf_back};// Config menu<br />enum{p_al_time, p_al_enable, p_al_back};// Alarm menu<br />enum{p_std_studytime, p_std_breaktime, p_std_enable, p_std_back};// Study menu<br /><br />// Menu options: position char (max. 6 characters)<br />char * main_options&#91;4&#93;;<br />char * config_options&#91;2&#93;;<br />char * alarm_options&#91;3&#93;;<br />char * study_options&#91;4&#93;;<br /><br /><br /><br />void displayMenu (TMENU * str_wsk);<br />void displayConfig (TMENU * str_wsk);<br />void displayAlarm (TMENU * str_wsk);<br />void displayStudy (TMENU * str_wsk);<br /><br />uint8_t decToBcd(uint8_t val);<br /><br />#endif /* INC_CLK_MENU_H_ */[/syntax]<br /><br />clk_menu.c<br />[syntax=c]/*<br /> * clk_menu.c<br /> *<br /> *  Created on: Dec 25, 2020<br /> *      Author: Michal Makowka<br /> */<br /><br />#include &quot;clk_menu.h&quot;<br /><br /><br />char * main_options&#91;4&#93; = {&quot;config&quot;, &quot;alarm&quot;, &quot;study&quot;, &quot;back&quot;};<br />char * config_options&#91;2&#93; = {&quot;time&quot;, &quot;back&quot;};<br />char * alarm_options&#91;3&#93; = {&quot;config&quot;, &quot;enable&quot;, &quot;back&quot;};<br />char * study_options&#91;4&#93; = {&quot;study&quot;, &quot;break&quot;, &quot;enable&quot;, &quot;back&quot;};<br /><br /><br />typedef struct menuInput {<br />uint8_t temp_val_ten;<br />uint8_t temp_val_units;<br />uint8_t idx;<br />uint8_t idx_default_ten;<br />uint8_t idx_default_units;<br />uint8_t idx_max;<br />uint8_t idx_min;<br />char display&#91;4&#93;;<br />} TINPUT;<br /><br /><br /><br />void menuInputService (TINPUT * in_wsk) {<br /><br />// Display which variable is being configured<br />DisplayLEDStr(in_wsk-&gt;display);<br />displayChar(((in_wsk-&gt;idx_default_ten + 48)), 4);// Display initial values in line with the current idx<br />displayChar(((in_wsk-&gt;idx_default_units + 48)), 5);<br /><br />in_wsk-&gt;temp_val_ten = in_wsk-&gt;idx_default_ten;<br />in_wsk-&gt;temp_val_units = in_wsk-&gt;idx_default_units;<br />in_wsk-&gt;idx = (in_wsk-&gt;idx_default_ten * 10) + in_wsk-&gt;idx_default_units;<br /><br />while(!button_flag&#91;B_SET&#93;) {<br />if (button_flag&#91;B_UP&#93;) {<br />button_flag&#91;B_UP&#93;=0;<br />(in_wsk-&gt;idx)++;<br />if (in_wsk-&gt;idx &gt; (in_wsk-&gt;idx_max)) in_wsk-&gt;idx = in_wsk-&gt;idx_min;<br />in_wsk-&gt;temp_val_ten = (decToBcd(in_wsk-&gt;idx)&gt;&gt;4);<br />in_wsk-&gt;temp_val_units = (decToBcd(in_wsk-&gt;idx) &amp; 0x0F);<br />displayChar(((in_wsk-&gt;temp_val_ten)+48), 4);<br />displayChar(((in_wsk-&gt;temp_val_units)+48), 5);<br />}<br />if (button_flag&#91;B_DOWN&#93;) {<br />button_flag&#91;B_DOWN&#93;=0;<br />(in_wsk-&gt;idx)--;<br />if (in_wsk-&gt;idx &gt; 250 || in_wsk-&gt;idx &lt; in_wsk-&gt;idx_min) in_wsk-&gt;idx = in_wsk-&gt;idx_max;<br />in_wsk-&gt;temp_val_ten=(decToBcd(in_wsk-&gt;idx)&gt;&gt;4);<br />in_wsk-&gt;temp_val_units = (decToBcd(in_wsk-&gt;idx) &amp; 0x0F);<br />displayChar(((in_wsk-&gt;temp_val_ten)+48), 4);<br />displayChar(((in_wsk-&gt;temp_val_units)+48), 5);<br />}<br /><br />delay_ms(250);<br />}<br />button_flag&#91;B_SET&#93;=0;<br />}<br /><br /><br /><br /><br />void selectTime(void) {<br /><br />uint8_t temp_t_hour, temp_u_hour, temp_t_minute, temp_u_minute,<br />temp_t_day, temp_u_day, temp_t_month, temp_u_month, temp_t_year, temp_u_year;<br /><br /><br />TINPUT input;<br /><br />// Input hour<br />input.display&#91;0&#93;='h'; input.display&#91;1&#93;='r';<br />input.idx_max=23;<br />input.idx_min=0;<br />input.idx_default_ten = 0;<br />input.idx_default_units = 0;<br />menuInputService(&amp;input);<br />temp_t_hour = input.temp_val_ten;<br />temp_u_hour = input.temp_val_units;<br /><br />// Input minute<br />input.display&#91;0&#93;='m'; input.display&#91;1&#93;='i'; input.display&#91;2&#93;='n';<br />input.idx_max=59;<br />input.idx_min=0;<br />input.idx_default_ten = 0;<br />input.idx_default_units = 0;<br />menuInputService(&amp;input);<br />temp_t_minute = input.temp_val_ten;<br />temp_u_minute = input.temp_val_units;<br /><br />setTime(temp_t_hour, temp_u_hour, temp_t_minute, temp_u_minute);<br /><br />// Input day<br />input.display&#91;0&#93;='d'; input.display&#91;1&#93;='a'; input.display&#91;2&#93;='y';<br />input.idx_max=31;<br />input.idx_min=1;<br />input.idx_default_ten = 0;<br />input.idx_default_units = 1;<br />menuInputService(&amp;input);<br />temp_t_day = input.temp_val_ten;<br />temp_u_day = input.temp_val_units;<br /><br />// Input month<br />input.display&#91;0&#93;='m'; input.display&#91;1&#93;='o'; input.display&#91;2&#93;='n';<br />input.idx_max=12;<br />input.idx_min=1;<br />input.idx_default_ten = 0;<br />input.idx_default_units = 1;<br />menuInputService(&amp;input);<br />temp_t_month = input.temp_val_ten;<br />temp_u_month = input.temp_val_units;<br /><br />// Input year<br />input.display&#91;0&#93;='y'; input.display&#91;1&#93;='e'; input.display&#91;2&#93;='a'; input.display&#91;3&#93;='r';<br />input.idx_max=99;<br />input.idx_min=0;<br />input.idx_default_ten = 1;<br />input.idx_default_units = 8;<br />menuInputService(&amp;input);<br />temp_t_year = input.temp_val_ten;<br />temp_u_year = input.temp_val_units;<br /><br />setDate(temp_t_day, temp_u_day, temp_t_month, temp_u_month, temp_t_year, temp_u_year);<br /><br />}<br /><br /><br /><br /><br />void displayMenu (TMENU * str_wsk) {<br />LEDClr();<br /><br />FillLEDArray(LED_buf, 0, 0, 0);<br />SPI_SEND_WSBUF(LED_buf, sizeof(LED_buf));<br /><br />button_flag&#91;B_UP&#93;=0;<br />button_flag&#91;B_DOWN&#93;=0;<br />button_flag&#91;B_SET&#93;=0;<br /><br />str_wsk-&gt;nxt_level = 0;<br />str_wsk-&gt;menu_pos = 0;<br />str_wsk-&gt;nxt_level = 0;<br />str_wsk-&gt;back = 0;<br /><br />uint8_t temp_pos;<br /><br />while(!str_wsk-&gt;back) {<br /><br />if (button_flag&#91;B_UP&#93;) {<br />button_flag&#91;B_UP&#93;=0;<br />str_wsk-&gt;menu_pos++;<br />if(str_wsk-&gt;menu_pos&gt;3) str_wsk-&gt;menu_pos=0;<br />}<br /><br />if (button_flag&#91;B_DOWN&#93;) {<br />button_flag&#91;B_DOWN&#93;=0;<br />str_wsk-&gt;menu_pos--;<br />if(str_wsk-&gt;menu_pos&gt;250) str_wsk-&gt;menu_pos=3;<br />}<br /><br /><br />if (button_flag&#91;B_SET&#93;) {<br />button_flag&#91;B_SET&#93;=0;<br />str_wsk-&gt;nxt_level=1;<br />}<br /><br />if (temp_pos != str_wsk-&gt;menu_pos) {<br />DisplayLEDStr(main_options&#91;str_wsk-&gt;menu_pos&#93;);<br />temp_pos = str_wsk-&gt;menu_pos;<br />}<br /><br /><br />if(str_wsk-&gt;nxt_level) {<br />if (str_wsk-&gt;menu_pos == p_main_back) return;<br />if ((str_wsk-&gt;configuration) &amp;&amp; (str_wsk-&gt;menu_pos == p_main_config)) str_wsk-&gt;configuration(str_wsk);<br />if ((str_wsk-&gt;alarm) &amp;&amp; (str_wsk-&gt;menu_pos == p_main_alarm)) str_wsk-&gt;alarm();<br />if ((str_wsk-&gt;study) &amp;&amp; (str_wsk-&gt;menu_pos == p_main_study)) str_wsk-&gt;study();<br />}<br />delay_ms(250);<br />}<br />}<br /><br /><br />void displayConfig (TMENU * str_wsk) {<br />LEDClr();<br /><br />FillLEDArray(LED_buf, 0, 0, 0);<br />SPI_SEND_WSBUF(LED_buf, sizeof(LED_buf));<br /><br />DisplayLEDStr(config_options&#91;str_wsk-&gt;menu_pos&#93;);<br /><br />button_flag&#91;B_UP&#93;=0;<br />button_flag&#91;B_DOWN&#93;=0;<br />button_flag&#91;B_SET&#93;=0;<br /><br />str_wsk-&gt;nxt_level = 0;<br />str_wsk-&gt;menu_pos = 0;<br />str_wsk-&gt;nxt_level = 0;<br />str_wsk-&gt;back = 0;<br /><br />uint8_t temp_pos;<br /><br />while(!str_wsk-&gt;back) {<br /><br />if (button_flag&#91;B_UP&#93;) {<br />delay_ms(80);<br />button_flag&#91;B_UP&#93;=0;<br />str_wsk-&gt;menu_pos++;<br />if(str_wsk-&gt;menu_pos&gt;1) str_wsk-&gt;menu_pos=0;<br />}<br /><br />if (button_flag&#91;B_DOWN&#93;) {<br />delay_ms(80);<br />button_flag&#91;B_DOWN&#93;=0;<br />str_wsk-&gt;menu_pos--;<br />if(str_wsk-&gt;menu_pos&gt;250) str_wsk-&gt;menu_pos=1;<br />}<br /><br /><br />if (button_flag&#91;B_SET&#93;) {<br />delay_ms(80);<br />button_flag&#91;B_SET&#93;=0;<br />str_wsk-&gt;nxt_level=1;<br />}<br /><br />if (temp_pos != str_wsk-&gt;menu_pos) {<br />DisplayLEDStr(config_options&#91;str_wsk-&gt;menu_pos&#93;);<br />temp_pos = str_wsk-&gt;menu_pos;<br />}<br /><br /><br />if(str_wsk-&gt;nxt_level) {<br />if (str_wsk-&gt;menu_pos == p_conf_back) return;<br />if (str_wsk-&gt;menu_pos == p_conf_time) {selectTime(); str_wsk-&gt;back=1;}<br /><br />}<br />delay_ms(250);<br />}<br />}<br /><br /><br /><br /><br />void displayAlarm (TMENU * str_wsk) {<br /><br />// To be done<br /><br />}<br /><br />void displayStudy (TMENU * str_wsk) {<br /><br />// To be done<br /><br />}<br /><br /><br />uint8_t decToBcd(uint8_t val) {<br />  return ((val/10*16) + (val%10));<br />}[/syntax]<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=10748">Makowka</a> — 26 gru 2020, o 16:36</p><hr />
]]></content>
</entry>
</feed>