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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-21T17:23:40+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=11769&amp;mode</id>
<entry>
<author><name><![CDATA[squelch]]></name></author>
<updated>2015-05-21T17:23:40+01:00</updated>
<published>2015-05-21T17:23:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129782#p129782</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129782#p129782"/>
<title type="html"><![CDATA[Re: LCD w C o co chodzi]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129782#p129782"><![CDATA[
No dobra skrobnołem coś na szybko ale jak zawsze niedziała czy wiecie gdzie jest błąd<br /><br />[syntax=c]#ifndef LCD_H_<br />#define LCD_H_<br /><br />//Załączenie plików bibliotecznych<br />#include&lt;avr/io.h&gt;<br />#include&lt;util/delay.h&gt;<br />#include&lt;avr/pgmspace.h&gt;<br />#include&lt;avr/eeprom.h&gt;<br /><br />//1-Pin RW sterowany z mikrokontrolera<br />//0-Pin RW zwarty do GND<br />#define RW_M 1<br /><br />//Definicje preprocesora ułatwiające dostęp do DDRx oraz PORTx i PINx<br />#define PORT(x) MPORT(x)<br />#define MPORT(x) PORT##x<br /><br />#define PIN(x) MPIN(x)<br />#define MPIN(x) PIN##x<br /><br />#define DDR(x) MDDR(x)<br />#define MDDR(x) DDR##x<br /><br />#define D4_PORT C<br />#define D4 0<br /><br />#define D5_PORT C<br />#define D5 1<br /><br />#define D6_PORT C<br />#define D6 2<br /><br />#define D7_PORT C<br />#define D7 3<br /><br />#define RS_PORT C<br />#define RS 4<br /><br />#if RW_M==1<br /><br />#define RW_PORT C<br />#define RW 5<br /><br />#endif<br /><br />#define E_PORT C<br />#define E 6<br /><br /><br />//Definicje upraszczające operacje na liniach sterujących<br />#define HIGH_RS PORT(RS_PORT)|=(1&lt;&lt;RS)<br />#define LOW_RS PORT(RS_PORT)&amp;=~(1&lt;&lt;RS)<br /><br />#if RW_M==1<br /><br />#define HIGH_RW PORT(RW_PORT)|=(1&lt;&lt;RW)<br />#define LOW_RW PORT(RW_PORT)&amp;=~(1&lt;&lt;RW)<br /><br />#endif<br /><br />#define HIGH_E PORT(E_PORT)|=(1&lt;&lt;E)<br />#define LOW_E PORT(E_PORT)&amp;=~(1&lt;&lt;E)<br /><br />//Definicje preprocesora dla poszczególnych adresów pierwszego znaku w lini<br />#define LINE_1 0x00<br />#define LINE_2 0x40<br /><br />//Definicje preprocesora na potrzeby nieużywania funkcji<br />#define TEXT_P 1<br />#define TEXT_E 0<br />#define SEND_10 1<br />#define SEND_16 1<br />#define CHARACTER 1<br />#define CHARACTER_P 1<br />#define CHARACTER_E 1<br />#define POSITION 1<br /><br />//Deklaracje funkcji<br />static void output_LCD(void);<br />#if RW_M==1<br />static void input_LCD(void);<br />#endif<br />static void send_nibble(uint8_t nibble);<br />static void send_byte(uint8_t byte);<br />static void send_command(uint8_t command);<br />#if RW_M==1<br />static uint8_t read_nibble(void);<br />static uint8_t read_byte(void);<br />static uint8_t busy_flag(void);<br />#endif<br /><br />void initialization(void);<br />void clean_LCD(void);<br />void text(uint8_t *text);<br />#if TEXT_P==1<br />void text_P(uint8_t *text);<br />#endif<br /><br />#if TEXT_E==1<br />void text_E(uint8_t *text);<br />#endif<br /><br />#if SEND_10==1<br />void send_10(uint8_t number);<br />#endif<br /><br />#if SEND_16==1<br />void send_16(uint8_t number);<br />#endif<br /><br />#if CHARACTER==1<br />void character(uint8_t address,uint8_t *buffer);<br />#endif<br /><br />#if CHARACTER_P==1<br />void character_P(uint8_t address,uint8_t *buffer);<br />#endif<br /><br />#if CHARACTER_E==1<br />void character_E(uint8_t address,uint8_t *buffer);<br />#endif<br /><br />#if POSITION==1<br />void position(uint8_t x,uint8_t y);<br />#endif<br /><br />#endif /* LCD_H_ */[/syntax]<br /><br />[syntax=c]//Załączenie pliku nagłówkowego<br />#include&quot;LCD.h&quot;<br /><br />//Funkcja ustawiająca linie danych LCD jako wyjścia<br />void output_LCD(void)<br />{<br />DDR(D4_PORT)|=(1&lt;&lt;D4);<br />DDR(D5_PORT)|=(1&lt;&lt;D5);<br />DDR(D6_PORT)|=(1&lt;&lt;D6);<br />DDR(D7_PORT)|=(1&lt;&lt;D7);<br />}<br /><br />//Funkcja ustawiająca linie danych LCD jako wejścia<br />void input_LCD(void)<br />{<br />DDR(D4_PORT)&amp;=~(1&lt;&lt;D4);<br />DDR(D5_PORT)&amp;=~(1&lt;&lt;D5);<br />DDR(D6_PORT)&amp;=~(1&lt;&lt;D6);<br />DDR(D7_PORT)&amp;=~(1&lt;&lt;D7);<br />}<br /><br />//Funkcja wysyłająca połowę bajtu<br />void send_nibble(uint8_t nibble)<br />{<br />if(nibble&amp;(1&lt;&lt;0)) PORT(D4_PORT)|=(1&lt;&lt;D4);<br />else PORT(D4_PORT)&amp;=~(1&lt;&lt;D4);<br /><br />if(nibble&amp;(1&lt;&lt;1)) PORT(D5_PORT)|=(1&lt;&lt;D5);<br />else PORT(D5_PORT)&amp;=~(1&lt;&lt;D5);<br /><br />if(nibble&amp;(1&lt;&lt;2)) PORT(D6_PORT)|=(1&lt;&lt;D6);<br />else PORT(D6_PORT)&amp;=~(1&lt;&lt;D6);<br /><br />if(nibble&amp;(1&lt;&lt;3)) PORT(D7_PORT)|=(1&lt;&lt;D7);<br />else PORT(D7_PORT)&amp;=~(1&lt;&lt;D7);<br />}<br /><br />//Funkcja wysyłająca cały bajt<br />void send_byte(uint8_t byte)<br />{<br />//Ustawienie lini danych jako wyjścia<br />output_LCD();<br /><br />#if RW_M==1<br />LOW_RW;<br />#endif<br /><br />//Wysłanie starszej części bajtu<br />HIGH_E;<br />send_nibble(byte&gt;&gt;4);<br />LOW_E;<br /><br />//Wysłanie młodszej części bajtu<br />HIGH_E;<br />send_nibble(byte);<br />LOW_E;<br /><br />#if RW_M==1<br />while(busy_flag());<br />#else<br />_delay_us(120);<br />#endif<br />}<br /><br />//Funkcja wysyłająca komende<br />void send_command(uint8_t command)<br />{<br />LOW_RS;<br />send_byte(command);<br />}<br /><br />//Funkcja wysyłające znaki<br />void send_character(uint8_t character)<br />{<br />HIGH_E;<br />send_byte(character);<br />}<br /><br />#if RW_M==1<br /><br />//Funkcja odczytująca połowę bajtu<br />uint8_t read_nibble(void)<br />{<br />uint8_t meter=0;<br />if(PIN(D4_PORT)&amp;(1&lt;&lt;0)) meter|=(1&lt;&lt;0);<br />if(PIN(D5_PORT)&amp;(1&lt;&lt;1)) meter|=(1&lt;&lt;1);<br />if(PIN(D6_PORT)&amp;(1&lt;&lt;2)) meter|=(1&lt;&lt;2);<br />if(PIN(D7_PORT)&amp;(1&lt;&lt;3)) meter|=(1&lt;&lt;3);<br /><br />//Zwrócenie sprawdzonej wartości<br />return meter;<br />}<br /><br />//Funkcja odczytująca bajt<br />uint8_t read_byte(void)<br />{<br />//Ustawienie lini danych jako wejścia<br />input_LCD();<br /><br />HIGH_RW;<br /><br />uint8_t read_byte=0;<br /><br />//Odczyt starszej części<br />HIGH_E;<br />read_byte|=read_nibble()&lt;&lt;4;<br />LOW_E;<br /><br />//Odczyt młodszej części<br />HIGH_E;<br />read_byte|=read_nibble();<br />LOW_E;<br /><br />//Zwrot odczytanego bajtu<br />return read_byte;<br />}<br /><br />//Funkcja sprawdzająca busy flag<br />uint8_t busy_flag(void)<br />{<br />LOW_RS;<br />return read_byte()&amp;(1&lt;&lt;7);<br />}<br /><br />#endif<br /><br />//Funkcja inicjalizacyjna LCD<br />void initialization(void)<br />{<br />//Ustawienie lini danych jako wyjście<br />output_LCD();<br /><br />//Ustawienie lini sterujących jako wyjście<br />DDR(RS_PORT)|=(1&lt;&lt;RS);<br />#if RW_M==1<br />DDR(RW_PORT)|=(1&lt;&lt;RW);<br />#endif<br />DDR(E_PORT)|=(1&lt;&lt;E);<br /><br />//Stan wysoki na liniach sterujących<br />HIGH_RS;<br />#if RW_M==1<br />HIGH_RW;<br />#endif<br />HIGH_E;<br /><br />_delay_ms(15);<br /><br />//Stan niski na liniach sterujących<br />LOW_RS;<br />#if RW_M==1<br />LOW_RW;<br />#endif<br />LOW_E;<br /><br />//Wysłanie 0x03<br />send_nibble(0x03);<br /><br />_delay_ms(5);<br /><br />//Wysłanie 0x03<br />send_nibble(0x03);<br /><br />_delay_us(100);<br /><br />//Wysłanie 0x03<br />send_nibble(0x03);<br /><br />_delay_us(100);<br /><br />//Function Set<br />send_command(1&lt;&lt;5);<br /><br />//Display On<br />send_command(1&lt;&lt;3|1&lt;&lt;1);<br /><br />//Display Off<br />send_command(1&lt;&lt;0);<br /><br />//Entry Mode Set<br />send_command(1&lt;&lt;2|1&lt;&lt;0|1&lt;&lt;1);<br /><br />//Czyszczenie LCD<br />clean_LCD();<br />}<br /><br />void clean_LCD(void)<br />{<br />send_command(1&lt;&lt;0);<br />#if RW_M==0<br />_delay_ms(2);<br />#endif<br />}<br /><br />//Funcka wysyłająca tekst<br />void text(uint8_t *text)<br />{<br />char zmienna;<br />while((zmienna=*(text++)))<br />{<br />send_byte((zmienna&gt;=0x80 &amp;&amp; zmienna&lt;=0x87)?zmienna&amp;0x07:zmienna);<br />}<br />}<br /><br />#if TEXT_P==1<br />//Funcka wysyłająca tekst z pamięci FLASH<br />void text_P(uint8_t *text)<br />{<br />uint8_t zmienna;<br />while((zmienna=pgm_read_byte(text++)))<br />{<br />send_byte((zmienna&gt;=0x80 &amp;&amp; zmienna&lt;=0x87)?zmienna&amp;0x07:zmienna);<br />}<br />}<br />#endif<br /><br />#if TEXT_E==1<br />//Funcka wysyłająca tekst z pamięci EEPROM<br />void text_E(uint8_t *text)<br />{<br />uint8_t zmienna;<br /><br />while(1)<br />{<br />zmienna=eeprom_read_byte((uint8_t*)zmienna++);<br />if(!zmienna || zmienna==0xFF) break;<br />send_byte((zmienna&gt;=0x80 &amp;&amp; zmienna&lt;=0x87)?zmienna&amp;0x07:zmienna);<br />}<br />}<br />#endif<br /><br />#if SEND_10==1<br />//Funkcja wysyłająca liczbę dziesiętną<br />void send_10(uint8_t number)<br />{<br />//powołanie bufora na potrzeby konwersji<br />char buffer&#91;17&#93;;<br /><br />text(itoa(number,buffer,10));<br />}<br />#endif<br /><br />#if SEND_16==1<br />//Funkcja wysyłająca liczbę szesnastkową<br />void send_16(uint8_t number)<br />{<br />//powołanie bufora na potrzeby konwersji<br />char buffer&#91;17&#93;;<br /><br />text(itoa(number,buffer,16));<br />}<br />#endif<br /><br />#if CHARACTER==1<br />//Funkcja zapisująca własny znak<br />void character(uint8_t address,uint8_t *buffer)<br />{<br />send_command(64+8*(address&amp;0x07));<br />uint8_t meter=8;<br />while(meter--)<br />{<br />send_byte(*(buffer++));<br />}<br />}<br />#endif<br /><br />#if CHARACTER_P==1<br />//Funkcja zapisująca własny znak z pamięci FLASH<br />void character_P(uint8_t address,uint8_t *buffer)<br />{<br />send_command(64+8*(address&amp;0x07));<br />uint8_t meter=8;<br />while(meter--)<br />{<br />send_byte(pgm_read_byte(buffer++));<br />}<br />}<br />#endif<br /><br />#if CHARACTER_E==1<br />//Funkcja zapisująca własny znak z pamięci EEPROM<br />void character_E(uint8_t address,uint8_t *buffer)<br />{<br />send_command(64+8*(address&amp;0x07));<br />uint8_t meter=8;<br />while(meter--)<br />{<br />send_byte(eeprom_read_byte(buffer++));<br />}<br />}<br />#endif<br /><br />#if POSITION==1<br />//Funkcja pozycjonująca kursor<br />void position(uint8_t x,uint8_t y)<br />{<br />switch(y)<br />{<br />case 0: y=LINE_1;break;<br />case 1: y=LINE_2;break;<br />}<br />//Wysłanie komendy<br />send_command(0x80+x+y);<br />}<br />#endif[/syntax]<br /><br />[syntax=c]//Załączenie pliku nagłówkowego<br />#include&quot;LCD/LCD.h&quot;<br /><br />int main(void)<br />{<br />//Wywołanie funkcji inicjalizacyjnej<br />initialization();<br /><br />//Wysłanie napisu do LCD<br />text_P(PSTR(&quot;napis&quot;));<br /><br />while(1)<br />{<br /><br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9939">squelch</a> — 21 maja 2015, o 17:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2015-05-21T14:58:34+01:00</updated>
<published>2015-05-21T14:58:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129773#p129773</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129773#p129773"/>
<title type="html"><![CDATA[Re: LCD w C o co chodzi]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129773#p129773"><![CDATA[
zobacz tu kolego <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic868.html" >topic868.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 21 maja 2015, o 14:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-21T10:29:03+01:00</updated>
<published>2015-05-21T10:29:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129764#p129764</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129764#p129764"/>
<title type="html"><![CDATA[Re: LCD w C o co chodzi]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129764#p129764"><![CDATA[
Hmm! Algorytm jest od producenta wyświetlacza i jest w wersji uproszczonej 6-bitowej, a DATA jest 8-bitowa. Co Ty na to?<br />Dodaj do rozważań zależności czasowe sygnałów sterujących(RS, RW, E) wraz z DATA. Pan Mirek, to praktyk - wie co robi!<br />Chcesz zrobić, to kopiuj. Chcesz poznać, to do producenta(DS). W BB jest to wyjaśnione jak działa LCD z pełną obsługą i 4bitową. Z korzystaniem z R/W  i zwartym do GND ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 21 maja 2015, o 10:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2015-05-21T09:46:06+01:00</updated>
<published>2015-05-21T09:46:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129763#p129763</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129763#p129763"/>
<title type="html"><![CDATA[Re: LCD w C o co chodzi]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129763#p129763"><![CDATA[
Tu masz opis:<br /><!-- m --><a class="postlink" href="http://elportal.pl/pdf/k09/25_10.pdf" >http://elportal.pl/pdf/k09/25_10.pdf</a><!-- m --><br />Rys 9.<br /><br /> A dlaczego tak się inicjalizuje wyświetlacz?<br />To pytanie musiałbyś chyba raczej zadać producentom<br /><br />Tu masz DS jakiegoś wyświetlacza.<br />Strona 46<br /><!-- m --><a class="postlink" href="https://www.sparkfun.com/datasheets/LCD/HD44780.pdf" >https://www.sparkfun.com/datasheets/LCD/HD44780.pdf</a><!-- m --><br />Dlaczego tak jest? No bo tak przewidział to producent,<br /><br />Mam nadzieję, że dobrze zrozumiałem Twoje pytanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 21 maja 2015, o 09:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[squelch]]></name></author>
<updated>2015-05-21T09:15:57+01:00</updated>
<published>2015-05-21T09:15:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129760#p129760</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129760#p129760"/>
<title type="html"><![CDATA[Re: LCD w C o co chodzi]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129760#p129760"><![CDATA[
ja nie mówie że nie działa tylko się pytam dlaczego nie jest zgodne z inicjalizacją<br /><br />Myślę że dobrze to widać jak się najedzie na to zdjęcie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9939">squelch</a> — 21 maja 2015, o 09:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xbary]]></name></author>
<updated>2015-05-21T09:07:10+01:00</updated>
<published>2015-05-21T09:07:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129757#p129757</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129757#p129757"/>
<title type="html"><![CDATA[Re: LCD w C o co chodzi]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129757#p129757"><![CDATA[
Nie wiem, nie widzę , nie mam tego przykładu, ale wszystkie &quot;dlaczego&quot; są po to żeby kod przykładowy zadziałał na różnych wyświetlaczach, tych zgodnych i trochę zgodnych z oryginałem. Druga kwestia to zegar uC ... czasem na 1Mhz  a czasem na 8Mhz  albo 16Mhz uruchomisz przykładowy kod i musi działać...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=447">xbary</a> — 21 maja 2015, o 09:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[squelch]]></name></author>
<updated>2015-05-21T07:26:54+01:00</updated>
<published>2015-05-21T07:26:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129750#p129750</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129750#p129750"/>
<title type="html"><![CDATA[LCD w C o co chodzi]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11769&amp;p=129750#p129750"><![CDATA[
Czesc nie rozumiem przykładu inicjalizacji z mirka książki poniżej jak wygląda inicjalizacja<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/9939/c77175953584187645530959fb92663f.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/9939/c77175953584187645530959fb92663f.png" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9939">squelch</a> — 21 maja 2015, o 07:26</p><hr />
]]></content>
</entry>
</feed>