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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=814&amp;mode</id>
<entry>
<author><name><![CDATA[masterix]]></name></author>
<updated>2015-11-07T16:05:11+01:00</updated>
<published>2015-11-07T16:05:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=144712#p144712</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=144712#p144712"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=144712#p144712"><![CDATA[
Witam mam pytanie co do wykorzystania tego kodu w większych programach:) <br />Bawię się na ATmedze32 i fajnie kod działa ale jak sprawdzać ilość wyświetlanych cyfr? Bo powiedzmy że chce zczytać z klawiatury zmienna. jak tego dokonać?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9423">masterix</a> — 7 lis 2015, o 16:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RYSZARD M]]></name></author>
<updated>2014-05-18T12:38:47+01:00</updated>
<published>2014-05-18T12:38:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=81549#p81549</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=81549#p81549"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=81549#p81549"><![CDATA[
Pozdrawiam bywalców i jednocześnie INFORMUJĘ że jestem Początkującym w dziedzinie<br />programowania (typowy amator). Zakupiłem zestaw ATB SCORPIO i moje pytanie tyczy oprogramowania <br />tejże klawiaturki pod ten zestaw , czyli sterowanie LCD 4 bitowe oraz jak by wyglądało<br />wstawienie poprawki zasugerowanej przez pana Bambzo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3171">RYSZARD M</a> — 18 maja 2014, o 12:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lucas0091]]></name></author>
<updated>2014-03-23T20:30:37+01:00</updated>
<published>2014-03-23T20:30:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75467#p75467</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75467#p75467"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75467#p75467"><![CDATA[
Już to jarzę po troszeczku, dziękuje <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=3572">lucas0091</a> — 23 mar 2014, o 20:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mscichu]]></name></author>
<updated>2014-03-23T14:55:24+01:00</updated>
<published>2014-03-23T14:55:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75417#p75417</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75417#p75417"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75417#p75417"><![CDATA[
Powiększ sobie ten obrazek, może animacja da Ci lepsze zrozumienie:<br /><a href="http://forum.atnel.pl/_obrazki/o/853/93247a04039eea7ddebee04f059b99b2.gif"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/853/93247a04039eea7ddebee04f059b99b2.gif" alt="Obrazek" /></a><br /><br />Obrazek przelatuje 2x, najpierw pokazuje gdy żaden klawisz nie jest wciśnięty, następnie gdy wciśniemy klawisz nr 8.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=853">Mscichu</a> — 23 mar 2014, o 14:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lucas0091]]></name></author>
<updated>2014-03-23T07:28:18+01:00</updated>
<published>2014-03-23T07:28:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75383#p75383</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75383#p75383"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75383#p75383"><![CDATA[
Proszę nadal o pomoc<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3572">lucas0091</a> — 23 mar 2014, o 07:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lucas0091]]></name></author>
<updated>2014-03-22T21:57:31+01:00</updated>
<published>2014-03-22T21:57:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75358#p75358</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75358#p75358"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=75358#p75358"><![CDATA[
A ja nie mogę zrozumieć istoty działania tej klawiatury, może zrozumiem jutro jak się wyśpię, a może te HEXy mnie mylą <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jak ustawić, które porty i co sczytać. <br />Gdyby był pin 9 to było by prościej wszystkie 16 klawiszy są podpięte pod GND i sczytuje się które dwa piny dostały GND i po sprawie, a tu nie rozumiem..<br />Wiem, że to proste ale nie mogę zajarzyć<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3572">lucas0091</a> — 22 mar 2014, o 21:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wilu88]]></name></author>
<updated>2013-11-11T11:58:41+01:00</updated>
<published>2013-11-11T11:58:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=56335#p56335</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=56335#p56335"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=56335#p56335"><![CDATA[
Postanowiłem sam podejść do tematu klawiatury 4x3 stworzyłem mini mini biblioteke do jej obsługi ale neistety na wyświetlaczu cały czas widzę &quot;1&quot; a jak dotknę klawiatury to jakieś śmieci. Podejrzewam że problem dotyczy jakiś śmieci, ewentualnie przewód robi za antenę i zbiera wszystko.<br /><br /><strong>plik klaw4x4.h</strong><br />[syntax=c]#ifndef KLAW_H_<br />#define KLAW_H_<br /><br />#define pad PORTD<br />#define K_WY1 1<br />#define K_WY2 2<br />#define K_WY3 3<br />#define K_WY4 4<br /><br />#define K_WE1 5<br />#define K_WE2 6<br />#define K_WE3 7<br /><br />char klaw_read(void);<br />void klaw_init();<br /><br /><br />#endif /* KLAW_H_ */[/syntax]<br /><br /><strong>plik klaw4x4.c</strong><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;klaw.h&quot;<br /><br />uint8_t wiersz=1;<br /><br />void klaw_init() {<br /><br />//Ustawiani wejsc<br />DDRD &amp;=~(1&lt;&lt;K_WE1);<br />DDRD &amp;=~(1&lt;&lt;K_WE2);<br />DDRD &amp;=~(1&lt;&lt;K_WE3);<br /><br />//Ustawiani wyjsc<br /><br />DDRD |= (1&lt;&lt;K_WY1);<br />DDRD |= (1&lt;&lt;K_WY2);<br />DDRD |= (1&lt;&lt;K_WY3);<br />DDRD |= (1&lt;&lt;K_WY4);<br /><br />PORTD|= (1&lt;&lt;K_WE1);<br />PORTD|= (1&lt;&lt;K_WE2);<br />PORTD|= (1&lt;&lt;K_WE3);<br /><br />PORTD|=(1&lt;&lt;K_WY1);<br />PORTD|=(1&lt;&lt;K_WY2);<br />PORTD|=(1&lt;&lt;K_WY3);<br />PORTD|=(1&lt;&lt;K_WY4);<br />}<br /><br />char klaw_read(void){<br /><br /> for(wiersz=1; wiersz&lt;5;wiersz++){<br /> _delay_ms(1);<br /> pad &amp;= (0&lt;&lt;wiersz);<br /> if(wiersz==1){<br />  if(bit_is_clear(PIND,K_WE1))<br />return '1';<br />  else if(bit_is_clear(PIND,K_WE2))<br />return '2';<br />  else if(bit_is_clear(PIND,K_WE3))<br />    return '3';<br /> }<br /> else if(wiersz==2){<br />  if(bit_is_clear(PIND,K_WE1))<br />return '4';<br />  else if(bit_is_clear(PIND,K_WE2))<br />return '5';<br />  else if(bit_is_clear(PIND,K_WE3))<br />    return '6';<br /> }<br /> else if(wiersz==3){<br />  if(bit_is_clear(PIND,K_WE1))<br />return '7';<br />  else if(bit_is_clear(PIND,K_WE2))<br />return '8';<br />  else if(bit_is_clear(PIND,K_WE3))<br />    return '9';<br /> }<br /> else if(wiersz==4){<br />  if(bit_is_clear(PIND,K_WE1))<br />return '*';<br />  else if(bit_is_clear(PIND,K_WE2))<br />return '0';<br />  else if(bit_is_clear(PIND,K_WE3))<br />    return '#';<br /> }<br /><br /> }<br /> return 0;<br />}[/syntax]<br /><br /><strong>A oto testowy plik main:</strong><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 08-11-2013<br /> *      Author: Tomasz Wilk<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;klaw_4x4/klaw.h&quot;<br /><br /><br />int main(void)<br />{<br />lcd_init();/* inicjalizacja LCD */<br />klaw_init();<br />char przycisk;<br /><br />while(1){<br /><br />przycisk = klaw_read();<br /><br />lcd_locate(0,0);<br />lcd_char(przycisk);<br /><br /><br />}<br /><br /><br /><br /><br />}[/syntax]<br /><br /><br />P.S teraz zauważyłem że w funkcji klaw_read po przejściu przez wszystkie wiersze nie ustawiam zmiennej wiersz na 1 ale to pewnie nie to powoduje problemy z zakłóceniami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=743">Wilu88</a> — 11 lis 2013, o 11:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[betoven]]></name></author>
<updated>2013-02-02T22:42:46+01:00</updated>
<published>2013-02-02T22:42:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=26683#p26683</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=26683#p26683"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=26683#p26683"><![CDATA[
Dodaj tylko, że do mojej procedury muszę jeszcze jutro dodać blokowanie wykrywania wciśnięcia tego samego klawisza 2x w czasie mniejszym niż 100ms, bo mam klawiaturę z przerobionego kalkulatora, i klawisze mają bardzo płytkie wciśnięcie. Czasami wykrywa mi dwuklik <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=908">betoven</a> — 2 lut 2013, o 22:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jado]]></name></author>
<updated>2013-02-01T18:31:56+01:00</updated>
<published>2013-02-01T18:31:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=26545#p26545</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=26545#p26545"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=26545#p26545"><![CDATA[
Ja używam w tym przypadku maszyn stanów, które działają właśnie jak to kolega wyżej opisał.  Wówczas oczekiwanie na jakieś zdarzenie nie blokuje procesora - można to nazwać stanem &quot;dynamicznego zatrzymania&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> <br />Ale wymaga to zmiany filozofii programowania (przy całościowym podejściu do programu).<br />Natomiast mniejsze procedurki tego typu można wpleść w normalny kod bez większego wysiłku i sprawdzają się bardzo dobrze - ciężko je zawiesić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=852">Jado</a> — 1 lut 2013, o 18:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[betoven]]></name></author>
<updated>2013-02-01T16:46:35+01:00</updated>
<published>2013-02-01T16:46:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=26532#p26532</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=26532#p26532"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=26532#p26532"><![CDATA[
Można do tego dorzucić jeszcze wykrywanie wielu klawiszy i przytrzymanie klawisza. Tak jak to pierwsze właściwie nie ma praktycznego zastosowanie, tak wykrywanie długiego przytrzymania bardzo się przydaje... Oczywiście można tez się pokusić o napisanie procedury gdzie możemy zadeklarować dowolną ilość wierszy i kolumn (oczywiście w granicach jakiś stałych określających MAX). <br />Warto też zmienić podejście do programowania tego rodzaju procedur, bo wykrycie długiego przytrzymania nie może być realizowana kosztem zajętego procesora przez czas naciśnięcia klawisza. <br />Zatem trzeba napisać procedurę tak, jakby była to procedura przerwania, czyli: &quot;zrób najszybciej jak potrafisz i zakończ&quot;. W takim przypadku procedura musi zapisywać swój stan, aby mogła kontynuować swoją pracę przy kolejnym wywołaniu. Wywołania natomiast powinny być cykliczne co np. 10us. Dzięki temu procesor może przez resztę czasu zajmować się innymi &quot;rzeczami&quot; a my nie musimy używać funkcji _delay_xs().<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=908">betoven</a> — 1 lut 2013, o 16:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jado]]></name></author>
<updated>2013-01-27T00:31:59+01:00</updated>
<published>2013-01-27T00:31:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=25944#p25944</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=25944#p25944"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=25944#p25944"><![CDATA[
Dobry pomysł - właśnie u siebie dokonałem poprawki.<br />Działa bezproblemowo <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=852">Jado</a> — 27 sty 2013, o 00:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Bambzo]]></name></author>
<updated>2013-01-26T21:43:34+01:00</updated>
<published>2013-01-26T21:43:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=25935#p25935</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=25935#p25935"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=25935#p25935"><![CDATA[
To ja też dorzucę swoje 3 grosze.<br />      Otóż w przytoczonym przykładzie obsługi klawiatury matrycowej jest pewne niedopatrzenie, którego na pierwszy rzut oka nie widać, a które może doprowadzić do uszkodzenia portów procesora. Sytuacja taka może wystąpić w przypadku niechcącego (lub też zamierzonego w bardziej zaawansowanych programach obsługi klawiatury matrycowej) naciśnięcia więcej niż jednego klawisza. W programie piny wymuszające stany niskie na matrycy (PB0 - PB3) pracują jako wyjścia. W danym momencie na jednym z tych pinów wystawiony jest stan niski (np PB0), podczas gdy na pozostałych pinach wymuszających wystawiany jest w tym samym czasie stan wysoki (PB1, PB2 i PB3). Jeżeli teraz naciśniemy jednocześnie dwa klawisze (w opisywanym przypadku będą to klawisze C i 8) to nastąpi nic innego jak zwarcie VCC i GND poprzez dwa porty PB1 i PB0. Może to doprowadzić do uszkodzenia jednego z tranzystorów w którymś z tych portów.   <br />     Bardzo łatwo jest poprawić ten program, tak by wyeliminować ten problem. Wystarczy przy wymuszaniu stanu niskiego na pinach PB0-PB3 sterować nie portem PORTB lecz DDRB czyli sterować kierunkiem portu (oczywiście wcześniej należy do portu PORTB na piny PB0-PB3 wpisać stan 0). Teraz przy wymuszaniu stanu niskiego na matrycy ustawiamy dany pin na wyjściowy (np PB0). W tym samym czasie pozostałe piny PB1-PB3 pracują jako wejściowe czyli sa ustawione w stan wysokiej impedancji HiZ i wszytko jest bezpieczne. Możemy naciskać dowolnie wiele klawiszy i nic nam się nie uszkodzi. <br />      Reasumując - podczas skanowania matrycy w danym momencie tylko jeden pin jest ustawiony jako wyjściowy, a pozostałych 7 jako wejściowe (3 są w stanie HiZ a 4 mają wewnętrzne podciągania do VCC). Notabene można program uprościć ustawiając wszystkie porty wejściowe w HiZ, ale wymaga to dodania 4 zewnętrznych rezystorów podciągających an pinach odczytujących stan matrycy. <br />   Wiem, że opisany przeze mnie przypadek jest przypadkiem szczególnym, ale lepiej gdy program jest on odporny na różne sytuacje. Tym bardziej, że poprawka jest banalna.<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=882">Bambzo</a> — 26 sty 2013, o 21:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[repro]]></name></author>
<updated>2012-10-24T21:07:45+01:00</updated>
<published>2012-10-24T21:07:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=17551#p17551</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=17551#p17551"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=17551#p17551"><![CDATA[
Witam, <br />krótko o sobie napiszę, że bawić się mikroprockami AVR zacząłem dość niedawno ok 2 lat temu tzn. książkę przeczytałem całą &quot;Podstawy programowania&quot; w maju 2011 i trochę sobie poćwiczyłem, ale od tamtej pory nie robiłem nic. W sumie zrobiłem sobie przerwę od programowania trochę dłuższą niż rok. Niedawno zmotywowany do działania zacząłem sobie powtarzać materiał ( wczoraj dokładnie  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> ), a dziś się wziąłem za obsługę klawiatury matrycowej 4x4. Rozumiem, że dla bardziej zaawansowanych jest zbędna, ale niestety moja praca dyplomowa jej wymaga. Prosiłbym więc, by mnie traktować jak nowicjusza. Przeanalizowałem kod powyżej i nasuwają się pytania, które umieściłem w komentarzach poniżej zamieszczonego fragmentu kodu, który dotyczy głownie obsługi klawiatury:<br />[syntax=c]while(1)<br />   {<br />        upperNibble = 0xff;<br /> <br />                for(i=0; i&lt;4; i++)<br />            {<br />                 _delay_ms(1);<br />                 KB_PORT_OUT = ~(0x01 &lt;&lt; i);   // KOMENTARZ: rozumiem, ze tu zeruje poszczegolne bity naszych kolumn, albo kolumn w zaleznosci od posiadanej klawiatury <br />                 _delay_ms(1);                                            //Opóźnienie<br />                 upperNibble = KB_PORT_IN | 0x0f;<br /> <br />                 if (upperNibble != 0xff)<br />                 {<br />                   _delay_ms(20);                                //Opóźnienie  dla niwelacji drgań<br />               upperNibble = KB_PORT_IN | 0x0f; // PYTANIE1:czemu powtarzamy przypisanie wartosci do zmiennej, skoro zostalo to zrobione powyzej?<br />                   if(upperNibble == 0xff) goto OUT;<br /> <br />                   keyCode = (upperNibble &amp; 0xf0) | (0x0f &amp; ~(0x01 &lt;&lt; i)); //PYTANIE2: czemu tutaj pojawi sie taki zapis, a nie KB_PORT_OUT? ( chyba, ze chodzi o latwiejsze zrozumienie tematu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> )<br /> <br />                   while (upperNibble != 0xff) // PYTANIE3: czy ta petla jest konieczna?<br />                     upperNibble = KB_PORT_IN | 0x0f; //<br /> <br />                   _delay_ms(20);                          //opóźnienie dla niwelacji drgań<br /> <br />                   switch (keyCode)                        //Znaki wyświetlane na LCD<br />                   {<br />                        case (0xee): keyPressed = '0';<br />                                                 break;<br />                        case (0xed): keyPressed = '1';<br />                                                 break;<br />                        case (0xeb): keyPressed = '2';<br />                                                 break;<br />                        case (0xe7): keyPressed = '3';<br />                                                 break;<br />                        case (0xde): keyPressed = '4';<br />                                                 break;<br />                        case (0xdd): keyPressed = '5';<br />                                                 break;<br />                        case (0xdb): keyPressed = '6';<br />                                                 break;<br />                        case (0xd7): keyPressed = '7';<br />                                                 break;<br />                        case (0xbe): keyPressed = '8';<br />                                                 break;<br />                        case (0xbd): keyPressed = '9';<br />                                                 break;<br />                        case (0xbb): keyPressed = 'A';<br />                                                 break;<br />                        case (0xb7): keyPressed = 'B';<br />                                                 break;<br />                        case (0x7e): keyPressed = 'C';<br />                                                 break;<br />                        case (0x7d): keyPressed = 'D';<br />                                                 break;<br />                        case (0x7b): keyPressed = 'E';<br />                                                 break;<br />                        case (0x77): keyPressed = 'F';<br />                                                 break;<br />                        default    : keyPressed = 'X';<br />                                                 break;<br />                    }//Koniec klawiszy --<br /> <br />                        LCD_WriteData(keyPressed);<br /> <br />                   OUT:;<br />                  }//koniec if-a -jakby ktoś szukał<br />                }//koniec for-ki  - tak to tutaj<br />        }//koniec while1 -- no wreszcie<br /> <br />        return 0;<br />}//a tu się kończy main()[/syntax]<br />Nie chcę by moje pytania zostały odebrane jako atak. Staram się wnikliwe analizować, po co i na co programista zastosował niektóre sztuczki. Mogę się domyślać po co, ale wyznaję zasadę, że lepiej zapytać i upewnić się. <br />Program działa w następujący sposób, że przy moim założeniu zmieniam bity na kolumnach. Na każdą kolumnę po kolei jest wystawiane 0, a w momencie naciśnięcia dowolnego przycisku robimy zworę między wierszem i kolumną, a na nasz wiersz trafia sygnał z kolumny. Odczytujemy to przy pomocy zmiennej pomocniczej(jako warunek) i następnie z czytujemy wartość(PINx) z portu do kolejnej zmiennej, która znajdzie się w którymś Case w instrukcji Switch. Niżej wklejam kod przerobiony przeze mnie i dostosowany do mojego układu. Kod działa poprawnie na moim układzie uruchomieniowym:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define KEYPORT PORTC //port switchow<br />#define KEYDDRDDRC //linia kierunkowa switchow<br />#define KEY_READPINC          //czytaj stan z portu c(swtichow)<br />#define LEDPORTPORTA//port ledow<br />#define LEDDDRDDRA         //kierunek ledow<br /><br />//deklracja klaiwszy// W - wiersz, K kolumna<br />#define SW00b11101110 // 1W - 1K<br />#define SW10b11101101 // 1W - 2K<br />#define SW20b11101011// 1W - 3K<br />#define SW30b11100111// 1W - 4K<br />#define SW40b11011110// 2W - 1K<br />#define SW50b11011101// 2W - 2K<br />#define SW60b11011011// 2W - 3K<br />#define SW70b11010111// 2W - 4K<br />#define SW80b10111110// 3W - 1K<br />#define SW90b10111101// 3W - 2K<br />#define SW10        0b10111011// 3W - 3K<br />#define SW11        0b10110111// 3W - 4K<br />#define SW12        0b01111110// 4W - 1K<br />#define SW13        0b01111101// 4W - 2K<br />#define SW14        0b01111011// 4W - 3K<br />#define SW15        0b01110111// 4W - 4K<br /><br />//deklaracja funkcji<br />void Init_Keypad(void);<br />void Init_LED(void);<br /><br />//zmienne<br />uint8_t i, KeyPress, temp;<br /><br />volatile uint8_t flaga_przerwania;<br /><br />int main(void){<br /><br />Init_LED();<br />Init_Keypad();<br /><br />sei();<br />while(1){<br /><br />if(flaga_przerwania == 1)<br />{<br />temp = 0xFF;<br />KeyPress = 0;<br />for( i = 0; i &lt; 4; i++)<br />{<br />_delay_us(1);<br /><br />KEYPORT = ~( 1&lt;&lt; i ); // ZEROWANIE PORTC W ZAKRESIE OD 0 DO 3 BITU<br /><br />_delay_us(1);<br />temp = (KEY_READ&amp;0xF0);<br /><br />if(temp != 0xF0)<br />{<br />_delay_us(1);<br /><br />KeyPress = KEY_READ;<br /><br />_delay_ms(20); // opoźnienie dla eliminacji drgan<br /><br />switch(KeyPress)//klawisze<br />{<br /><br />case(SW0): LEDPORT = SW0;break;<br />case(SW1): LEDPORT = SW1;break;<br />case(SW2): LEDPORT = SW2;break;<br />case(SW3): LEDPORT = SW3;break;<br />case(SW4): LEDPORT = SW4;break;<br />case(SW5): LEDPORT = SW5;break;<br />case(SW6): LEDPORT = SW6;break;<br />case(SW7): LEDPORT = SW7;break;<br />case(SW8): LEDPORT = SW8;break;<br />case(SW9): LEDPORT = SW9;break;<br />case(SW10): LEDPORT = SW10;break;<br />case(SW11): LEDPORT = SW11;break;<br />case(SW12): LEDPORT = SW12;break;<br />case(SW13)        : LEDPORT = SW13;break;<br />case(SW14): LEDPORT = SW14;break;<br />case(SW15): LEDPORT = SW15;break;<br /><br />}//koniec klawiszy<br /><br />}//koniec ifa<br /><br />}//koniec fora<br /><br />}//koniec ifa<br /><br />}//koniec whila<br /><br />}<br /><br />//definicja funkcji<br />void Init_Keypad(void)<br />{<br />KEYDDR = (1&lt;&lt;0)|(1&lt;&lt;1)|(1&lt;&lt;2)|(1&lt;&lt;3); // ustawienie portu klawiatury 0 - wejście, 1 - wyjście<br />KEYPORT = 0xFF; // ustawienie portu na stan wysoki<br />TCCR0 = (1&lt;&lt;CS00); //preskaler 8<br />TIMSK = (1&lt;&lt;TOIE0); // zezwolenie na przerwanie przy przepelnieniu licznika<br />}<br /><br />void Init_LED(void)<br />{<br />LEDDDR = 0xFF; // jako wyjscie<br />LEDPORT = 0xFF; // zapalamy wszystkie ledy<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />flaga_przerwania = 1;<br />}<br /><br /><br />[/syntax]<br />Czy dobrze zrozumiałem zasadę działa programu ?<br />Dziękuję za odpowiedzi i 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=613">repro</a> — 24 paź 2012, o 21:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kierlan]]></name></author>
<updated>2012-02-04T18:32:08+01:00</updated>
<published>2012-02-04T18:32:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2303#p2303</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2303#p2303"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2303#p2303"><![CDATA[
Ja osobiście lubię te klawiaturkę <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=84">kierlan</a> — 4 lut 2012, o 18:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-02-04T18:10:46+01:00</updated>
<published>2012-02-04T18:10:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2302#p2302</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2302#p2302"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2302#p2302"><![CDATA[
temu zapodałem żeby ktoś co mu się takie coś widzi mógł sobie rozwinąć <br />to założenie u używać do swoich niecnych celów <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=58">SunRiver</a> — 4 lut 2012, o 18:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elsat1]]></name></author>
<updated>2012-02-04T18:06:42+01:00</updated>
<published>2012-02-04T18:06:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2300#p2300</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2300#p2300"/>
<title type="html"><![CDATA[Re: Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2300#p2300"><![CDATA[
A miałem przypadek ...naście lat temu zaprogramować (w asemblerze) taką właśnie klawiaturkę by uzdrowić jakąś austriacką kuchenkę mikrofalową.<br />Twój program może się komuś przydać ....może np. wspomóc nasze ' zabytkowe pioniery '  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Wiem, zabytki powinny pozostać zabytkami .... ale jakby ktoś chciał, to czemu nie  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=151">elsat1</a> — 4 lut 2012, o 18:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-02-03T23:33:51+01:00</updated>
<published>2012-02-03T23:33:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2286#p2286</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2286#p2286"/>
<title type="html"><![CDATA[Obsługa klawiatury matrycowej 4x4 --&gt; ECLIPSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=814&amp;p=2286#p2286"><![CDATA[
Kilku już się podpytywało o takie coś więc postanowiłem<br />skrobnąć taki prosty mały programik do obsługi <br />klawiaturki matrycowej 4x4 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Czyli całkowicie zmarnotrawić miejsce na takie ustrojstwo <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Tym razem programik jest w AVRgcc, pod eclipse <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Testowo użyta została ATMEGA 16   popędzona na 16Mhz  kwarcu.<br /><br />Jedziemy:  <br /><br />Jak wiadomo klawiatura matrycowa to do niczego nieprzydatne i zajmujące dużo miejsca <br />ustrojstwo które wcześniej czy później każdy chce umieć obsłużyć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jest to naprawdę nic trudnego:)<br /><br />Typowa klawiatura 4x4  wygląda tak:<br /><br />Nie no bez jaj każdy chyba wie jak wygląda nie mówiąc już o układzie połączeń<br />mamy 16 klawiszy podzielonych na 4wiersze i 4 kolumny no to chyba jest jasne <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Chociaż ...  a niech będzie <br />Jak wiec mówiłem klawiatura 4x4 wygląda tak:<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/471/8ebb5cf23951cd7b99ff42020b93b12d.jpg" alt="Obrazek" /><br /><br />a schemat połączeń jest następujący:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/471/2338aef0c427b98c5a4ec6b3c623084c.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/471/2338aef0c427b98c5a4ec6b3c623084c.jpg" alt="Obrazek" /></a><br /><br /><br />No teraz chyba jasne <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ale bez przesady i nie pisać mi tu  że moja ma inne wyprowadzenia <br />bo są setki producentów głównie w chinach i pretensje o układ pinów do nich <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Zasada jest podobna jak w przypadku multiplexowania wyświetlaczy z tym ze tu czytamy <br />piny , a nie wysyłamy na piny <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Program jest bardzo prosty i nie powinien nikomu sprawić problemu <br />dodałem taka sobie prostą obsługę LCD żeby każdy mógł sobie sprawdzić jak to działa<br />myślę że po przeczytaniu książki kolegi MIRKA oraz komentarzy w programie <br />wszystko jest jasne ... <br /><br />Nie będę się tu rozpisywał więc specjalnie bo niema potrzeby , a już wielu uważa ze piszę <br />przydługawe epopeje więc nie będziemy z tak prostej sprawy robić 2 części Wojny i Pokoju <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />hehehe <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /> <br />void Oto_kod_zrodlowy()<br />{<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 03-02-2012<br /> *      Author: SunRiver<br /> */<br />//******** Interfrejs klawiatury matrycowej 4x4 **********<br /><br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />//****** Obsługa LCD ******** //<br /><br />void LCD_init(void);<br />void LCD_WriteCommand (unsigned char Command);<br />void LCD_WriteData (unsigned char Data);<br /><br />void LCD_DisplayString (char row, char column, char *string);<br />void LCD_Cursor(char row, char column);<br /><br />#define ENABLE_LCD                 PORTD |= 0x80<br />#define DISABLE_LCD           PORTD &amp;= ~0x80<br />#define SET_LCD_DATA          PORTD |= 0x20<br />#define SET_LCD_CMD           PORTD &amp;= ~0x20<br />#define KB_PORT_OUT             PORTB<br />#define KB_PORT_IN            PINB<br /><br />//*********************************************************<br /><br />void port_init(void)<br />{<br /> DDRA  = 0x00;<br /> PORTA = 0x00;<br /> DDRB  = 0x0f;//Port klawiatury - stan niski wyjście , wysoki wejście<br /> PORTB = 0xff;//właczenie pul-up<br /> DDRC  = 0xff;<br /> PORTC = 0x00;<br /> DDRD  = 0xf0;<br /> PORTD = 0x00;<br />}<br /><br /><br />//Procedura inicjalizacji peryferi<br />void init_devices(void)<br />{<br /> port_init();<br /> LCD_init();<br /><br /> MCUCR = 0x00;<br /> TIMSK = 0x00; //Timer - generowanie przerwania<br /> }<br /><br />//****************** Pętla główna  *******************<br /><br /> int main(void)<br />{<br />   unsigned char upperNibble, keyCode, keyPressed, i;<br />   init_devices();<br /><br />   LCD_DisplayString (1,1,&quot;   WITAM!    &quot;);<br />   LCD_WriteCommand(0xc0);   // wykopanie kursora do drugiego wiersza<br /><br />   while(1)<br />   {<br />        upperNibble = 0xff;<br /><br />for(i=0; i&lt;4; i++)<br />    {<br /> _delay_ms(1);<br /> KB_PORT_OUT = ~(0x01 &lt;&lt; i);<br /> _delay_ms(1);       //Opóźnienie<br /> upperNibble = KB_PORT_IN | 0x0f;<br /><br /> if (upperNibble != 0xff)<br /> {<br />   _delay_ms(20);    //Opóźnienie  dla niwelacji drgań<br />       upperNibble = KB_PORT_IN | 0x0f;<br />   if(upperNibble == 0xff) goto OUT;<br /><br />   keyCode = (upperNibble &amp; 0xf0) | (0x0f &amp; ~(0x01 &lt;&lt; i));<br /><br />   while (upperNibble != 0xff)<br />     upperNibble = KB_PORT_IN | 0x0f;<br /><br />   _delay_ms(20);      //opóźnienie dla niwelacji drgań<br /><br />   switch (keyCode)   //Znaki wyświetlane na LCD<br />   {<br />   case (0xee): keyPressed = '0';<br />  break;<br />case (0xed): keyPressed = '1';<br />  break;<br />case (0xeb): keyPressed = '2';<br />    break;<br />case (0xe7): keyPressed = '3';<br />  break;<br />case (0xde): keyPressed = '4';<br />  break;<br />case (0xdd): keyPressed = '5';<br />  break;<br />case (0xdb): keyPressed = '6';<br />  break;<br />case (0xd7): keyPressed = '7';<br />  break;<br />case (0xbe): keyPressed = '8';<br />  break;<br />case (0xbd): keyPressed = '9';<br />  break;<br />case (0xbb): keyPressed = 'A';<br />  break;<br />case (0xb7): keyPressed = 'B';<br />  break;<br />case (0x7e): keyPressed = 'C';<br />  break;<br />case (0x7d): keyPressed = 'D';<br />  break;<br />case (0x7b): keyPressed = 'E';<br />  break;<br />case (0x77): keyPressed = 'F';<br />  break;<br />default   : keyPressed = 'X';<br />                         break;<br />    }//Koniec klawiszy --<br /><br />LCD_WriteData(keyPressed);<br /><br />   OUT:;<br />  }//koniec if-a -jakby ktoś szukał<br />}//koniec for-ki  - tak to tutaj<br />}//koniec while1 -- no wreszcie<br /><br />return 0;<br />}//a tu się kończy main()<br /><br /><br />//********************************************************************<br />//***********************   LCD Funkcje  *****************************<br />//********************************************************************<br /><br />// *************************<br />// *** Inicjalizacja LCD ***<br />// *************************<br />void LCD_init(void)<br />{<br />_delay_ms(100); // czekaj 100ms<br /><br />//SET_LCD_WRITE ;// Ustawia LCD w tryb Zapisu -- niepotrzebne  narazie<br /><br />LCD_WriteCommand (0x38); // 8 lini danych -- tak a co :)<br />LCD_WriteCommand (0x08); // wyłaczenie wyswietlania<br />LCD_WriteCommand (0x01); // czyszczenie pamieci LCD<br />_delay_ms (10);  // 10ms dla kasowania LCD<br />LCD_WriteCommand (0x06); // ustawienie kursora<br />LCD_WriteCommand (0x0f); // właczenie wyswietlacza<br />}<br /><br /><br />// ****************************<br />// *** Zapisywanie do LCD   ***<br />// ****************************<br />void LCD_WriteCommand (unsigned char Command)<br />{<br /><br />SET_LCD_CMD;// Ustawienie LCD w tryb komend<br /><br />PORTC = Command;// ładowanie danych na port<br /><br />ENABLE_LCD;   // zapis do LCD<br /><br />asm(&quot;nop&quot;);        // a to po to zeby was podenerwować<br />asm(&quot;nop&quot;);<br /><br />DISABLE_LCD;   // Wyłaczenie LCD<br /><br />_delay_ms(1);// czekamy 1ms<br />}<br /><br /><br />// **********************************<br />// *** Zapis jednego bajta do LCD ***<br />// **********************************<br />void LCD_WriteData (unsigned char Data)<br />{<br />SET_LCD_DATA;<br />PORTC = Data;<br /><br />ENABLE_LCD;<br /><br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);                  // hehehe<br /><br />DISABLE_LCD;<br /><br />_delay_ms(1);<br />}<br /><br /><br />// ***********************************************************************************<br />// *** Wyświetlanie ciągu znaków w określonym wierszu i kolumnie, z pamięci Flash ****<br />// ***********************************************************************************<br />void LCD_DisplayString (char row, char column, char *string)<br />{<br />LCD_Cursor (row, column);<br />while (*string)<br />LCD_WriteData(*string++);<br />}<br /><br /><br />// *************************************************<br />// *** Ustalanie pozycji kursora na wyświetlaczu ***<br />// *************************************************<br />void LCD_Cursor (char row, char column)<br />{<br />switch (row)<br />{<br />case 1: LCD_WriteCommand (0x80 + column - 1); break;<br />case 2: LCD_WriteCommand (0xc0 + column - 1); break;<br />default: break;<br />}<br />}<br /><br />// I to by było na tyle[/syntax]<br /><br />}<br /><br />hihihi   ...   miłej zabawy z tym idiotycznym i zbędnym urządzeniem jakim jest klawiatura matrycowa.<br /><br />No tak a najważniejsze to gdzie zaraz malkontenci zaczną płakać jak to podłączyć ...<br />w sumie mogę być złośliwy i napisać przecież wszystko jest w kodzie -- prawda ??<br /><br />Ale tak nie zrobię ... dlaczego ??<br />dlatego że jest tu dla was coś nowego mianowicie postanowiłem być bardzo rozrzutny<br />i LCD sobie obsługuję w trybie 8bitowym  a nie jak zazwyczaj oszczędnie i prosto robimy to <br />na 4bitach <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Tak więc podłączamy wszystko zgodnie ze schematem:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/471/b19a01d65a8125f7e5b8989616b0c294.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/471/b19a01d65a8125f7e5b8989616b0c294.jpg" alt="Obrazek" /></a><br /><br />Tak to sobie wygląda dlaczego mega16 bo się walała poza tym większość posiada <br />płytkę ATB Mirka więc procek na miejscu  --- nie wiem tylko czy czasem Mirek nie <br />okroił LCD na płytce z 4 bitów <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 3 lut 2012, o 23:33</p><hr />
]]></content>
</entry>
</feed>