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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-10-07T15:27:36+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=13143&amp;mode</id>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-07T15:27:36+01:00</updated>
<published>2015-10-07T15:27:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13143&amp;p=141719#p141719</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13143&amp;p=141719#p141719"/>
<title type="html"><![CDATA[Re: LCD - problem z funkcją wyświetlającą łańcuch tekstowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13143&amp;p=141719#p141719"><![CDATA[
Wielkie dzięki, nie pomyślałem o tym. Dzięki Twojej sugestii trochę przerobiłem fragment odpowiedzialny za wysyłanie tekstu, podzieliłem go na 2 funkcje:<br />[syntax=c]void lcd_disp (char * tekst1, char *tekst2)   //wyświetla tablice tekst1 (w pierwszym wierszu) i tekst2 (w drugim wierszu)<br />{<br />lcd_disp_1 (tekst1 , 1);  //I wiersz<br />lcd_disp_1 (tekst2 , 2);  //II wiersz<br />}<br /><br /><br />void lcd_disp_1 ( char *tekst , int linia)   //WYŚWIETLANIE JEDNEJ LINII (argumenty: tekst, numer linii)<br />{<br />int i = 0;<br />if (linia == 1)<br />lcd_write_cmd( LCDC_DDA | LCD_LINE1 );  //kursor w pierwszej linii<br />else<br />lcd_write_cmd( LCDC_DDA | LCD_LINE2 );  //kursor w drugiej linii<br /><br />while (i &lt; 16)             //USUWANIE 'CHIŃSKICH ZNACZKÓW'<br />{<br />if (*(tekst + i) == '\0')<br />*(tekst + i) = ' ';<br />lcd_write_data( *tekst++ );<br />i++;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 7 paź 2015, o 15:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-10-06T19:44:34+01:00</updated>
<published>2015-10-06T19:44:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13143&amp;p=141652#p141652</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13143&amp;p=141652#p141652"/>
<title type="html"><![CDATA[Re: LCD - problem z funkcją wyświetlającą łańcuch tekstowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13143&amp;p=141652#p141652"><![CDATA[
Nie ustawiasz kursora na początku.<br />Nie widzę sensu kopiowania do tego dużego bufora:<br />[syntax=c]#define LCD_LINE1 0x00<br />#define LCD_LINE2 0x40<br />void lcd_line1 (void)<br />{<br />        lcd_write_cmd( LCDC_DDA | LCD_LINE1 );<br />}<br /><br />void lcd_line2 (void)<br />{<br />        lcd_write_cmd( LCDC_DDA | LCD_LINE2 );<br />}<br /><br />void lcd_disp2 (char * tekst1, char *tekst2)   //wyświetla tablice tekst (w pierwszym wierszu) i tekst2 (w drugim wierszu)<br />{<br />        lcd_line1();<br />        while(*tekst1)<br />                lcd_write_data( *tekst1++ );<br />        lcd_line2();<br />        while(*tekst2)<br />                lcd_write_data( *tekst2++ );<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 6 paź 2015, o 19:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Loreno]]></name></author>
<updated>2015-10-06T19:45:04+01:00</updated>
<published>2015-10-06T18:33:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13143&amp;p=141649#p141649</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13143&amp;p=141649#p141649"/>
<title type="html"><![CDATA[LCD - problem z funkcją wyświetlającą łańcuch tekstowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13143&amp;p=141649#p141649"><![CDATA[
Dobry wieczór,<br /><br />Mam napisany sterownik LCD. W swoim programie tworzę 2 tablice 16 znakowe. jedna z nich przechowuje napis, który ma się wyświetlić w pierwszym wierszu wyświetlacza, natomiast druga przechowuje napis dla drugiego wiersza wyświetlacza (posiadam LCD 2x16). Adresy do tych dwóch tablic przekazuję do funkcji disp_tab2, która obie te tablice wkłada w jedną większą tablicę (72 znakową),  która to tablica jest później bajt po bajcie wysyłana na wyświetlacz.<br /><br />Wszystko jest w porządku gdy funkcję disp_tab2 wywołam raz i jest to koniec jej działania. Gorzej jest, gdy np. funkcję tą wywołuję w nieskończonej pętli - wtedy na wyświetlaczu 'latają' dziwne najprzeróżniejsze znaki. Próbowałem już wstawiać _delay_ms(1000); po każdym wywołaniu disp_tab2, ale wtedy dziwne znaczki zmieniają się po prostu co sekundę - nadal wyświetla sę nie to co potrzebuję. Co jest nie tak z moją funkcją?<br /><br />[syntax=c]void lcd_disp2 (char * tekst1, char *tekst2)   //wyświetla tablice tekst1 (w pierwszym wierszu) i tekst2 (w drugim wierszu)<br />{<br />int tekst&#91;72&#93;;    //nowa zmiena przechowująca połączone wiersze<br />int * w;          //wskaźnik do tej nowej zmiennej<br />w = tekst;<br />int i = 0;<br /><br />for (i = 0 ; i &lt; 16 ; i++)            //kopiowanie zawartości tekst2 do tekst<br />*(tekst + i) = *(tekst2 + i);<br /><br />i = 0;<br />while(i &lt; 16)     //przenosi znaki do 40 miejsca (czyli do drugiej linii)<br />{<br />*(tekst + 40 + i) = *(tekst + i);<br />*(tekst + i) = '\0';<br />i++;<br />}<br /><br />i = 0;<br />while (i &lt; 16)      //przenosi znaki z tekst do tekst2 (czyli na początek, bo 1 linia)<br />{<br />*(tekst + i) = *(tekst1 + i);<br />i++;<br />}<br /><br />i = 0;<br /><br />while (i &lt; 16)             //USUWANIE 'CHIŃSKICH ZNACZKÓW'<br />{<br />if (*(tekst + i) == '\0')        //pierwszy wiersz<br />*(tekst + i) = ' ';<br />if (*(tekst + 40 + i) == '\0')   //drugi wiersz<br />*(tekst + 40 + i) = ' ';<br />i++;<br />}<br /><br />for (i = 0 ; i &lt; 72 ; i++)              //po kolei przesyła bajty tablicy tekst<br />lcd_write_data( *w++ );<br />}[/syntax]<br /><br />Wstawię też cały swój sterownik LCD, gdyby był potrzebny do analizy kodu:<br />[syntax=c]//Przyjmę, że wyświetlacz jest podłączony do portu D (PD6 - PD0 : RS, RW, E, D7, D6, D5, D4)<br />//druga linia jest o 24 bajty w prawo od końca pierwszej linii, czyli 1 znak 2 wiersza zaczyna się po 40 bajtach<br />//zaczynamy od inicjalizacji LCD, czyli lcd_init(). Później tworzymy 2 tabele, w których wstawiamy tekst w 1 i w 2 linii.<br />//Następnie poleceniem lcd_disp2 (z argumentami w postaci nazw tabel) wyświetlamy napis.<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;lcd.h&quot;<br />#include &quot;klaw_7seg.h&quot;<br /><br />//MAKRODEFINICJE:<br />#define SET_RS PORTD |= (1 &lt;&lt; 6)<br />#define CLR_RS PORTD &amp;= ~(1 &lt;&lt; 6)<br />#define SET_RW PORTD |= (1 &lt;&lt; 5)<br />#define CLR_RW PORTD &amp;= ~(1 &lt;&lt; 5)<br />#define SET_E PORTD |= (1 &lt;&lt; 4)<br />#define CLR_E PORTD &amp;= ~(1 &lt;&lt; 4)<br />//END MAKRODEFINICJE<br /><br />//KOMENDY LCD (przesyłane poprzez lcd_write_cmd)<br />#define LCDC_CLS      0x01       //czyści wyświetlacz<br />#define LCDC_HOME      0x02      //kursor w pozycji początkowej<br />#define LCDC_ENTRY      0x04     //ustawia bit D2 w celu zmiany trybu Entry Mode Set (z tabeli LCD)<br />#define LCDC_ENTRYR      0x02    //przesuwanie kursora (lub okna) w prawo (wymaga LCDC_ENTRY)<br />#define LCDC_ENTRYL      0       //przesuwanie w lewo<br />#define LCDC_MODEMOVE   0x01     //kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_ENTRY)  -- to samo co LCDC_SHIFTDISP ?<br />#define LCDC_ON       0x08       //ustawia bit D3 w celu zmiany trybu Dispaly On/Off (z tabeli LCD)<br />#define LCDC_DISPLAYON   0x04    //włącza wyświetlacz (wymaga LCDC_ON)<br />#define LCDC_CURSORON   0x02     //włącza kursor (wymaga LCDC_ON)<br />#define LCDC_BLINKON   0x01      //włącza miganie kursora (wymaga LCDC_ON)<br />#define LCDC_SHIFT      0x10 //ustawia bit D4 w celu zmiany trybu Cursor/Display Shift (tabela LCD)<br />#define LCDC_SHIFTDISP   0x08    //kursor w miejscu, przesuwa się zawartośc okna (wymaga LCDC_SHIFT)  -- to samo co LCDC_MODEMOVE ?<br />#define LCDC_SHIFTR      0x04    //przesuwanie kursora w prawo (wymaga LCDC_SHIFT)<br />#define LCDC_SHIFTL      0       //przesuwanie kursora w lewo (wymaga LCDC_SHIFT)<br />#define LCDC_FUNC      0x20      //ustawia bit D5 w celu zmiany trybu Function Set (tabela LCD)<br />#define LCDC_FUNC8b      0x10 //ustawia 8-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC4b      0   //ustawia 4-bit w Function Set (wymaga LCDC_FUNC)<br />#define LCDC_FUNC2L      0x08    //ustawia tryb 2-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC1L      0       //ustawia tryb 1-wierszowy (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x10   0x4      //ustawia znaki 5x10 (wymaga LCDC_FUNC)<br />#define LCDC_FUNC5x7   0         //ustawia znaki 5x7 (wymaga LCDC_FUNC)<br />#define LCDC_CGA      0x40<br />#define LCDC_DDA      0x80<br />//KONIEC KOMEND<br /><br />//DEKLARACJE FUNKCJI<br />static inline void data_dir_out (void);<br />static inline void data_dir_in (void);<br />static inline void lcd_send_half (uint8_t _data);<br />void lcd_send_byte(char data);<br />static inline uint8_t lcd_read_half (void);<br />uint8_t lcd_read_byte (void);<br />uint8_t BF_busy (void);<br />void lcd_write_data (uint8_t data);<br />void lcd_write_cmd (uint8_t data);<br />void lcd_init (void);<br />void lcd_clr (void);<br />void lcd_disp (char * tekst);<br />void lcd_disp2 (char * tekst, char *tekst2);<br />void lcd_cursor_on (void);<br />void lcd_cursor_off (void);<br />void lcd_cursor_home (void);<br />void lcd_cursor_blink_on (void);<br />void lcd_cursor_blink_off (void);<br /><br />//****************MAIN**************************<br />//int main()<br />//{<br />//lcd_init();      //INICJALIZACJA LCD<br />////lcd_clr();<br />//char tab&#91;72&#93; = &quot;test&quot;;       //TEKST W 1 LINII<br />//char tab2&#91;72&#93; = &quot;test2&quot;;     //TEKST W 2 LINII<br />//lcd_disp2 (tab, tab2);   //WYŚWIETL PRZYKŁADOWY TEKST<br />//<br />//return 0;<br />//}<br />//****************END OF MAIN***********************<br /><br /><br />//**********FUNKCJE***************<br />void lcd_init (void)      //INICJALIZACJA LCD<br />{<br />DDRD |= 0b01111111;  //po co suma logiczna?<br /><br />SET_RS;<br />SET_E;<br />SET_RW;<br />_delay_ms(15);<br />CLR_E;<br />CLR_RS;<br />CLR_RW;<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_ms(4.1);<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br /><br />SET_E;<br />lcd_send_half(0x03);  //tryb 8-bit<br />CLR_E;<br />_delay_us(100);<br /><br />SET_E;<br />lcd_send_half(0x02);  //tryb 4-bit<br />CLR_E;<br />_delay_us(100);<br /><br />//USTAWIENIA LCD<br />//tryb 4-bit, 2 wiersze, znak 5x7:<br />lcd_write_cmd( LCDC_FUNC | LCDC_FUNC4b | LCDC_FUNC2L | LCDC_FUNC5x7 );<br />//wyłączenie wyświetlacza<br />lcd_write_cmd( LCDC_ON );  //po prostu nie aktywujemy LCDC_DISPLAYON<br />//włączenie wyświetlacza:<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON );<br />//przesuwanie kurosra w prawo bez przesuwania zawartości ekranu:<br />lcd_write_cmd( LCDC_ENTRY | LCDC_ENTRYR );<br />//czyszczenie ekranu:<br />lcd_clr();<br />}<br /><br />//***********USTAWIENIE IN/OUT<br /><br />void data_dir_out (void)  //ustawia piny D4-D7 jako wyjścia (aby przesłac dane do LCD)<br />{<br />DDRD |= 0x0F;<br />}<br /><br />void data_dir_in (void)   //ustawia piny D4-D7 jako wejścia (aby odczytac dane z LCD)<br />{<br />DDRD &amp;= ~(0x0F);<br />}<br /><br />//************ZAPIS**************<br />//*******************************<br /><br />static inline void lcd_send_half (uint8_t _data)   //PRZESYŁA 4BIT-Y do wyświetlacza<br />{<br />PORTD = (PORTD &amp; 0xF0) | (_data &amp; 0x0F);<br />}<br /><br />void lcd_send_byte(char data)        //PRZESYŁA CAŁY BAJT do wyświetlacza<br />{<br />data_dir_out();<br /><br />CLR_RW;  //0 na RW (czyli zapis)<br /><br />SET_E;<br />lcd_send_half(data &gt;&gt; 4);  //najpierw starsza częśc bajtu<br />CLR_E;<br /><br />SET_E;<br />lcd_send_half(data);  //później młodsza częśc bajtu<br />CLR_E;<br /><br />while ( BF_busy() );<br />}<br /><br />void lcd_write_data (uint8_t data)  //przeslanie danych<br />{<br />SET_RS;<br />lcd_send_byte(data);<br />}<br /><br />void lcd_write_cmd (uint8_t data)  //przeslanie komendy<br />{<br />CLR_RS;<br />lcd_send_byte(data);<br />}<br /><br /><br />//**********ODCZYT**************<br />//*******************************<br /><br />static inline uint8_t lcd_read_half (void)   //odczytuje 4 bity z 1 jednego bajt<br />{<br />//uint8_t _odczyt = (PIND &amp; 0x0F);<br />//return _odczyt;<br />uint8_t _odczyt = 0;<br />if(PIND &amp; 0x0F) _odczyt |= PIND;<br />return _odczyt;<br />}<br /><br />uint8_t lcd_read_byte (void)           //odczytuje cały bajt z wyświetlacza<br />{<br />uint8_t odczyt = 0;<br />data_dir_in();<br /><br />SET_RW;<br /><br />SET_E;<br />odczyt = (lcd_read_half() &lt;&lt; 4);  //odczyt starszej części bajtu<br />CLR_E;<br /><br />SET_E;<br />odczyt |= lcd_read_half();  //odczyt młodszej części bajtu (sterownik LCD wyśle ją &quot;na siłę&quot;, mimo że nie potrzebujemy tej części do odczytu BF)<br />CLR_E;<br /><br />return odczyt;<br />}<br /><br />//*************RESZTA FUNKCJI***************<br />//******************************************<br /><br />uint8_t BF_busy (void)      //zwraca stan BF<br />{<br />CLR_RS;<br />return ( lcd_read_byte() &amp; (1 &lt;&lt; 7) );  //sprawdzamy 7-my bit odcztanego bajtu (czyli BF)<br />}<br /><br />void lcd_clr (void)   //CZYSZCZENIE WYŚWIETLACZA<br />{<br />lcd_write_cmd( LCDC_CLS );<br />}<br /><br />//****************WYŚWIETLANIE*********************<br />//*************************************************<br /><br />void lcd_disp (char * tekst)    //wyświetla tablice tekst<br />{<br />while ( *tekst )<br />lcd_write_data( *tekst++ );<br />}<br /><br />void lcd_disp2 (char * tekst1, char *tekst2)   //wyświetla tablice tekst (w pierwszym wierszu) i tekst2 (w drugim wierszu)<br />{<br />int tekst&#91;72&#93;;    //nowa zmiena przechowująca połączone wiersze<br />int * w;          //wskaźnik do tej nowej zmiennej<br />w = tekst;<br />int i = 0;<br /><br />for (i = 0 ; i &lt; 16 ; i++)            //kopiowanie zawartości tekst2 do tekst<br />*(tekst + i) = *(tekst2 + i);<br /><br />i = 0;<br />while(i &lt; 16)     //przenosi znaki do 40 miejsca (czyli do drugiej linii)<br />{<br />*(tekst + 40 + i) = *(tekst + i);<br />*(tekst + i) = '\0';<br />i++;<br />}<br /><br />i = 0;<br />while (i &lt; 16)      //przenosi znaki z tekst do tekst2 (czyli na początek, bo 1 linia)<br />{<br />*(tekst + i) = *(tekst1 + i);<br />i++;<br />}<br /><br />i = 0;<br /><br />while (i &lt; 16)             //USUWANIE 'CHIŃSKICH ZNACZKÓW'<br />{<br />if (*(tekst + i) == '\0')        //pierwszy wiersz<br />*(tekst + i) = ' ';<br />if (*(tekst + 40 + i) == '\0')   //drugi wiersz<br />*(tekst + 40 + i) = ' ';<br />i++;<br />}<br /><br />for (i = 0 ; i &lt; 72 ; i++)              //po kolei przesyła bajty tablicy tekst2<br />lcd_write_data( *w++ );<br />}<br /><br />//*****************************************<br />//*****************************************<br /><br /><br />void lcd_cursor_on (void)  //włącza kursor (i wyświetlacz)<br />{<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON | LCDC_CURSORON );<br />}<br /><br />void lcd_cursor_off (void)  //włącza kursor (i wyświetlacz)<br />{<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON);  //po prostu nie aktywujemy bitu odpowiedzialnego za włączenie kursora<br />}<br /><br />void lcd_cursor_home (void)<br />{<br />lcd_write_cmd( LCDC_HOME );<br />}<br /><br />void lcd_cursor_blink_on (void)<br />{<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON | LCDC_CURSORON | LCDC_BLINKON );<br />}<br /><br />void lcd_cursor_blink_off (void)<br />{<br />lcd_write_cmd( LCDC_ON | LCDC_DISPLAYON | LCDC_CURSORON );<br />}[/syntax]<br /><br />A tutaj jest moja funkcja main():<br />[syntax=c]int main()<br />{<br />init_klaw();<br />lcd_init();      //INICJALIZACJA LCD<br />//lcd_clr();<br />char wiersz1&#91;16&#93; = &quot;                &quot;;      //TEKST W 1 LINII<br />char wiersz2&#91;16&#93; = &quot;                &quot;;    //TEKST W 2 LINII<br /><br />wiersz1&#91;2&#93; = 0xFF;<br />//tab2&#91;15&#93; = 'f';<br />lcd_disp2 (wiersz1, wiersz2);<br /><br />while (1)<br />{<br />lcd_disp2 (wiersz1, wiersz2);   //WYŚWIETL PRZYKŁADOWY TEKST<br />//_delay_ms(1000);<br />}<br /><br />return 0;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5188">Loreno</a> — 6 paź 2015, o 18:33</p><hr />
]]></content>
</entry>
</feed>