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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-03-07T10:39:07+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=10957&amp;mode</id>
<entry>
<author><name><![CDATA[Pixello]]></name></author>
<updated>2015-03-07T10:39:07+01:00</updated>
<published>2015-03-07T10:39:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10957&amp;p=122346#p122346</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10957&amp;p=122346#p122346"/>
<title type="html"><![CDATA[Biblioteka do obsługi przycisków]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10957&amp;p=122346#p122346"><![CDATA[
Witam,<br />naskrobałem pewną prostą bibliotekę do obsługi klawiszy przyłączonych do jednego portu z debouncingiem i alternatywnym zachowaniem klawiszy przy ich dłuższym przytrzymaniu.<br /><br />Konstruktywna krytyka mile widziana <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />.<br />Komenty po angielsku i funkcja w większości także, ponieważ próbuję się przyzwyczaiać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />pin_unbounc_time_inc() dobrze jest umieścić w przerwaniu timera. U mnie jest wywoływana przez timer0 preskaler 1024.<br />pin_scan(); trzeba wywołać gdy chce sie skanowac klawiature,<br />pin_scan(); zwraca wskaźnik do 0. elementu tablicy zawierającego przyciski krótko naciśnięte, 1. element tablicy zwraca długie naciśnięcie.<br />pin_initialize(a,b) ustala wartość dla a - krótkiego naciśnięcia b - długiego (ile wywołań pin_unbounc_time_inc() musi być do uznania to za przyciśnięcie, a nie coś innego)<br /><br /><br />[syntax=c]/***************************************************************************/<br />/*PIXkeys.h*/<br />/*Mateusz Popielarz&quot;PIXEL&quot;2015 - 02 - 20*/<br />/***************************************************************************/<br />#define MINIMAL_CLICK_TIME 1<br />#define MINIMAL_HOLD_TIME 1000<br />#include &quot;PixKeys.c&quot;<br />#include &lt;avr/io.h&gt;<br />//Declaration of function<br /><br />void pin_initialize(char Value_of_click_time, uint16_t Value_of_hold_time);<br />char * pin_scan(char PIN_of_the_buttons_name_eg_PINA, char Mask_of_the_buttons_affects_on_output_data);<br />void pin_unbounc_time_inc(void);<br /><br />//END<br />//TEMPLATE OF RECIVER FUNCTION<br />// void button_effects_array(char *n) //przyk³adowe dzia³anie klawiszy, skopiuj do swojego programu i nadaj wlasne<br />// {<br />// switch (*n)<br />// {<br />// case 1:<br />// <br />// break;<br />// case 2:<br />// <br />// break;<br />// case 4:<br />// <br />// break;<br />// case 8:<br />// <br />// break;<br />// case 16:<br />// <br />// break;<br />// case 32:<br />// <br />// break;<br />// case 64:<br />// <br />// break;<br />// case 128:<br />// <br />// break;<br />// }<br />// <br />// <br />// switch (*(n+1))<br />// {<br />// case 1:<br />// break;<br />// case 2:<br />// break;<br />// case 4:// <br />// break;<br />// case 8:<br />// break;<br />// case 16:<br />//<br />// break;<br />// case 32:<br />//<br />// break;<br />// case 64:<br />//<br />// break;<br />// case 128:<br />//<br />// ////////////////////////////[/syntax]<br /><br />[syntax=c]/***************************************************************************/<br />/* PIXKEYS*/<br />/*Mateusz Popielarz&quot;PIXEL&quot;2015 - 02 - 20*/<br />/***************************************************************************/<br /><br /><br />volatile uint16_t unbounce_time;<br />char unbounce_flag,//Flag of timer start counting<br /> pin_state&#91;2&#93; = {0,0}; // pin_state&#91;n&#93; - n == 0 -&gt;&gt; Click     // n == 1 -&gt;&gt;Hold0  AT memory of uc<br />char *pin_state_pointer = &amp;pin_state&#91;0&#93;;//Pointer to first array element<br />char pin_now;<br />//IF U WANT TO SAVE MEMORY CHANGE IT NOW<br />#define MINIMAL_CLICK_TIME 1<br />#define MINIMAL_HOLD_TIME 1000<br />//Else<br /><br /><br />char * pin_scan(char PINX, char KEY_MASK)<br />{<br /><br />if((PINX &amp; KEY_MASK) &lt; KEY_MASK) //When 1 or more button of mask is pushed down (to GND) this is true<br />{<br />unbounce_flag = 1; //Start counting when pin_unbounc_time_inc() is  <br />pin_now |= (~PINX &amp; KEY_MASK);<br />}<br />else<br />{<br />if ((unbounce_time &gt; MINIMAL_CLICK_TIME) &amp; ((PINX &amp; KEY_MASK) == KEY_MASK))<br />{<br />if ((unbounce_time &gt; MINIMAL_HOLD_TIME) &amp; ((PINX &amp; KEY_MASK) == KEY_MASK))<br />{<br />pin_state&#91;1&#93; = pin_now;<br />goto perv_if_jump; //Jump -&gt;<br />}<br /><br /><br />pin_state&#91;0&#93; = pin_now;<br />perv_if_jump: //-&gt;Jump<br />unbounce_time = 0;<br />pin_now = 0;<br />}<br />}<br />return pin_state_pointer; //Array&#91;2&#93; pointer<br />}<br /><br />void pin_unbounc_time_inc(void) //Procedure - incrementing unbounce_time <br />{<br />if (unbounce_flag == 1)<br />{<br />++unbounce_time;<br />}<br />}<br /><br />void pin_initialize(char a, uint16_t b)<br />{<br />#ifdef MINIMAL_CLICK_TIME<br />#undef MINIMAL_CLICK_TIME<br />#endif<br />#ifdef MINIMAL_HOLD_TIME<br />#undef MINIMAL_HOLD_TIME<br />#endif<br />char MINIMAL_CLICK_TIME = a;<br />uint16_t MINIMAL_HOLD_TIME = b;<br />}<br /><br />//END<br />//OF<br />//LIB[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5672">Pixello</a> — 7 mar 2015, o 10:39</p><hr />
]]></content>
</entry>
</feed>