Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 30 kwi 2025, o 06:14


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 33 ]  Przejdź na stronę 1, 2  Następna strona
    Autor Wiadomość
    PostNapisane: 4 cze 2012, o 22:25 
    Offline
    Użytkownik

    Dołączył(a): 01 cze 2012
    Posty: 72
    Lokalizacja: Gdańsk
    Pomógł: 2

    Witam.

    Dla osób, które mają problemy ze zrozumieniem jak działa wyświetlacz LCD w standardzie HD44780, napisałem program.
    Ja właśnie należe do tych osób i w jakiś sposób sobie musiałem poradzić. Jak widze co się wysyła do wyświetlacza i w jaki sposób, odrazu łatwiej mi zrozumieć jak to działa.
    Sam kod programu jest bardzo prosty i każdy, nawet początkujący, jest wstanie coś takiego sobie stworzyć.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Korzystam z zestawu uruchomieniowego ATB. W opisie kodu zostało opisane gdzie co połączyć. Jeżeli będą jakieś niejasności, prosze o info.
    Żeby było wszystko klarownie zrozumiałe, nagrałem filmik jak się z tym ustrojstwem obchodzić (bądźcie wyrozumiali, to mój pierwszy tutorial :) ).
    http://youtu.be/tOLnAFhUVjw

    A i mam prośbe do bardziej zaawansowanych programistów. Jeżeli kod jest napiisyny w "złym stylu", to proszę o szybką informacje, żeby ktoś nie powielał moich błędów.
    Sam się dopiero ucze.

    Pozdrawiam.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2012, o 23:24 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    Przyglądam się już trzeci raz temu filmikowi .... i przyznam że jestem w SZOKU ;) .... ale mam na myśli totalnie pozytywne zaskoczenie. Powiem szczerze, że podziwiam kolegę za przygotowanie takiej pomysłowej wizualizacji .... jak pierwszy raz oglądałem początek to sobie myślę - nie, no nic z tego nie wyjdzie ;) ... a jak wyszło - to zacząłem oglądać kolejne razy ;)

    Rzeczywiście to trzeba polecać każdemu kto chce zrozumieć LCD - ja wiem jedno - ty NA PEWNO to zrozumiałeś ... No coś pięknego - ta wizualizacja.

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 cze 2012, o 06:56 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    No no no ładne cacko z tym uczeniem się chyba kolega zalewa lekko :)

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 cze 2012, o 07:33 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lis 2011
    Posty: 534
    Lokalizacja: Mierzyn
    Pomógł: 9

    No calkiem fajny tutek wyszedl brawo . Oby wiecej takich :)

    _________________
    pozdrawiam
    Jachu



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 cze 2012, o 20:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 paź 2011
    Posty: 581
    Pomógł: 17

    No rewelacja:) naprawde fajne



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2012, o 14:39 
    Offline
    Nowy

    Dołączył(a): 28 kwi 2012
    Posty: 19
    Lokalizacja: Wrocław
    Pomógł: 0

    Poradnik wyszedł naprawdę dobrze.
    Czekamy na następne ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2012, o 15:16 
    Offline
    Użytkownik

    Dołączył(a): 01 cze 2012
    Posty: 72
    Lokalizacja: Gdańsk
    Pomógł: 2

    Dzięki chłopaki za dobre słowa, bardzo to motywuje do dalszej pracy.

    Kolego SunRiver, język C jak ukorntrolery AVR ucze się od tygodnia (tyle czasu posiadam książke).
    Jeżeli chodzi o "zalewanie", to lubię sobie w trakcie nauki otworzyć czasem piwko ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2012, o 15:27 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    bartool napisał(a):
    ..... to lubię sobie w trakcie nauki otworzyć czasem piwko ;)


    mniam ;) ja też

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2012, o 15:38 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    a kto nie lubi :0 zwłaszcza jak ci się SQL kaszani :)

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 lip 2012, o 20:47 
    Offline
    Nowy

    Dołączył(a): 09 lip 2012
    Posty: 5
    Pomógł: 0

    Cześć, takie pytanie do czy jeśli logiczna jedynka na wyjście zapala diodę to ten kod funkcji void toggle_led (void) można zamienić na :
    LED_PORT ^= MaskPin;
    LCD_PORT ^= MaskPin; ?
    przepraszam z góry jeśli to pytanie wydaje się być banalne (dopiero raczkuje w temacie C i uC).



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 lip 2012, o 21:12 
    Offline
    Użytkownik

    Dołączył(a): 01 cze 2012
    Posty: 72
    Lokalizacja: Gdańsk
    Pomógł: 2

    cs3 napisał(a):
    Cześć, takie pytanie do czy jeśli logiczna jedynka na wyjście zapala diodę to ten kod funkcji void toggle_led (void) można zamienić na :
    LED_PORT ^= MaskPin;
    LCD_PORT ^= MaskPin; ?
    przepraszam z góry jeśli to pytanie wydaje się być banalne (dopiero raczkuje w temacie C i uC).

    Nic nie stoi na przeszkodzie, aby zapisać tak jak Ty to pokazałeś. Ba! Nawet będzie lepiej, mniejszy kod, szybciej będzie się wykonywać program. :D

    I nie przepraszaj, po to tu jesteśmy, aby sobie pomagać. Myślisz, że wszyscy tu jesteśmy starymi wyjadaczami ukontrolerów? ;) (ja też jestem na etapie przedszkola)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 lip 2012, o 18:08 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 758
    Pomógł: 9

    Super wyszło, w ten weekend będę się bawił LCD więc pewnie się przyda i chciałbym sam coś takiego zrobić, na fajny pomysł wpadłeś. Graty

    _________________
    ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 16:26 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 758
    Pomógł: 9

    Można wiedzieć, skąd wziąłeś swoją "ściągę"? Tabelka z książki Mirka? Ona jest chyba dość toporna, korzystałeś z niej czy z innego źródła?

    _________________
    ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 16:36 
    Offline
    Użytkownik

    Dołączył(a): 01 cze 2012
    Posty: 72
    Lokalizacja: Gdańsk
    Pomógł: 2

    HEHE Ściąga to lista komend wyświetlacza LCD (tak, z książki Mirka) i lista znaków w kodzie ASCII. Która tabela jest dla Ciebie toporna (komendy czy ASCII)? Napisz co dla Ciebie jest nie jasne. Postaram Ci się jakoś pomóc.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 16:40 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 758
    Pomógł: 9

    No chociażby w tabelce w książce Mirka występuje kilka razy ten sam symbol (a dokładniej D) w różnych znaczeniach - jak to rozróżnić? I dlaczego w filmiku przy ustawieniu pracy wyświetlacza jako 4-bitowego przesyłasz tylko starszą połówkę bajtu?

    _________________
    ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 17:06 
    Offline
    Użytkownik

    Dołączył(a): 01 cze 2012
    Posty: 72
    Lokalizacja: Gdańsk
    Pomógł: 2

    Ledes napisał(a):
    No chociażby w tabelce w książce Mirka występuje kilka razy ten sam symbol (a dokładniej D) w różnych znaczeniach - jak to rozróżnić?

    Jest to mała niescisłość, ale zaraz to wszystko wyjaśnimy. W tabelce, przy rozkazie "Display On/Off" literka "D" oznacza:
    1 - włączony wyświetlacz
    0 - wyłącząny wyświetlacz

    Przy rozkazie "Function set" literka "D" oznacza:
    1 - interfejs 8-bitowy
    0 - interfejs 4-bitowy
    Ledes napisał(a):
    I dlaczego w filmiku przy ustawieniu pracy wyświetlacza jako 4-bitowego przesyłasz tylko starszą połówkę bajtu?

    Słuchaj, to działa tak. Po załączeniu zasialania wyświetlacz pracuje w trybie 8-bitowym. W takiej postaći komendy są odbierane na wszystkich liniach danych (D0-D7). My nadajemy tylko na "starszym półbajcie", ale wyświetlacz tego nie wie :P i każde kolejne opadające zbocze lini E interpretuję jak jeden pełen bajt (nasze cztery linie D4-D7 i kompletnie nam nie znane stany na liniach D0-D3). I teraz my ustawiamy na liniach D4-D7 warośc komendy trybu 4-bitowego (0010) i dopiero po opadającym zboczu wyświetlacz przestawia się w tryb 4-bitowy. Dopiero od tego momentu wyświetlacz wie, że nadajemy połówkami bajtów. Czy to Ci troche rozjaśniło sytuacje?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 18:06 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 758
    Pomógł: 9

    Rozjaśniło, dzięki. ;)

    ------------------------ [ Dodano po: 50 minutach ]

    Nie da się przyciskami ustawić trybu dwuwierszowego, zgadza się?

    _________________
    ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 18:12 
    Offline
    Użytkownik

    Dołączył(a): 01 cze 2012
    Posty: 72
    Lokalizacja: Gdańsk
    Pomógł: 2

    Ledes napisał(a):
    Nie da się przyciskami ustawić trybu dwuwierszowego, zgadza się?

    Chyba masz na myśli trybu 8-bitowego. Nie da się z jednego powodu (jeżeli korzystasz z płytki Mirka), ponieważ fizycznie linie D0-D3 nie są podłączone. Jak sobie sam podłączysz wyświetlacz wszystkimi liniami, to nic nie stoi na przeszkodzie. reszta to kwestia programowa.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 18:13 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 758
    Pomógł: 9

    Chodzi mi o to, żeby za pomocą twojego projektu tylko za pomocą microswitchy zapisać coś w drugiej linii.

    ------------------------ [ Dodano po: 1 minucie ]

    Po zapisaniu jednej linii kursor gdzieś znika...

    _________________
    ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 18:30 
    Offline
    Użytkownik

    Dołączył(a): 01 cze 2012
    Posty: 72
    Lokalizacja: Gdańsk
    Pomógł: 2

    Nie dokońca chyba rozumiem co masz na myśli. Wydaje mi się, że wysyłasz znaki w kodzie ASCII do wyświetlacza i zapełniasz pierwszą linijke i chcesz przejść do drugiej? Jeżeli o to Ci chodzi, to pogroże Ci teraz palcem, ponieważ chyba nie przeczytałeś całego rozdziału w książce Mirka. Wpisując zanaki wewnętrzny rejestr wyświetlacza inkrementuje się po każdym wyświelonym znakiem. Co to oznacza? zajrzyj do ksiązki. Tam jest bardzo ładnie wszystko opisane. Podpowiem Ci, że każde pole wyświetlacza, które wydzisz, ma swój adres. Na stronie 207 masz definicje preprocesor, w ostatniej "grupie" (tam gdzie jest LCD_LINE) możesz wydedukować o co chodzi z tymi adresami.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 18:34 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 758
    Pomógł: 9

    No tak, nie skojarzyłem tego. Czyli po pierwszej linijce trzeba wklepać 64-16=48 znaki, które są jakby poza wyświetlaczem (trzecia linijka m.in.) i dopiero od 0x40 zaczyna się druga linijka, czyli znak 64 będzie pierwszym w drugim wierszu.

    _________________
    ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 18:56 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 24 cze 2012
    Posty: 414
    Lokalizacja: Oborniki
    Pomógł: 5

    Masz przeciez funkcje LCD_locate(), jesli policzysz, ze masz w pierwszej linii 16 znakow, to mozesz sobie przejsc na druga linie:)

    _________________
    Pozdrawiam:
    Mikołaj



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2012, o 19:24 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    mikandrzej napisał(a):
    Masz przeciez funkcje LCD_locate(), jesli policzysz, ze masz w pierwszej linii 16 znakow, to mozesz sobie przejsc na druga linie:)


    Nie nie - tzn nie zawsze tak jest. Wyświetlacze LCD tzn standard HD44780 przewiduje, że zawsze jest zapas bajtów na linię - po co? po to żeby wyświetlacz mógł robić sobie sprzętowy scrolling, dlatego spójrzcie panowie na mapy adresów początków każdej linii w różnych wyświetlaczach - nie ma tak że kolejne adresy w wyświetlaczu nawet 16x2 to

    0
    16

    tylko - zaglądamy do pliku nagłówkowego lcd44780.h i tam co widać? albo tak:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    albo tak:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    więc sami widzicie że to nie tak w nich liniowo a co ciekawe zdarzają się wyświetlacze które mają jeszcze inaczej i trzeba sobie po prostu samemu "namacać" adresy początków linii - łatwo to zrobić - ja np robiłem tak:

    że na wyświetlaczu LED albo na terminal wysyłałem licznik od 0 do powiedzmy 100

    i kolejno po CLS wysyłałem znaki do LCD co sekundę ;)

    i patrzyłem sobie gdy już zniknęły za końcem pierwszej linii kiedy się pokażą i od której linii się zaczną - wtedy wystarczyło spojrzeć na licznik na LED albo w terminalu i już mamy adres kolejnej linii - i czekamy aż się zaczną pojawiać w kolejnej i tak dalej ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 wrz 2012, o 20:10 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 02 wrz 2012
    Posty: 73
    Pomógł: 2

    Dzięki Twojemu poradnikowi chciało mi się zrozumieć działanie HD44780 od zera, dzięki bardzo ;)
    Biore się za pisanie własnej obsługi, ale:

    Nie wiem dlaczego jak już nawiązuję z nim "komunikajszyn" to wyświetlacz działa tylko po pierwszym wgraniu programu do MCU, po resecie jest zapalona pierwsza linia wyświetlacza, zachowuje się jakby były podłączone tylko piny zasilania i kontrastu.

    Co oznacza w tabeli X?

    Z jakiej biblioteki Wy korzystacie? Z kursu XYZ czy jeszcze jakaś inna?

    Tutaj jest ta tabela
    http://radzio.dxp.pl/hd44780/hd44780_podstawy.htm

    Jeszcze raz chciałem podziękować ;)

    Zdraviam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 wrz 2012, o 21:29 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 02 wrz 2012
    Posty: 73
    Pomógł: 2

    Mam na myśli poprawienie kodu, wgranie nowego wsadu do procka i wtedy wyswietlacz nie działa już jak powinien, pomimo nie znaczących na początku kodu zmian. Wtedy pomaga tylko odłączenie zasilacza i MCU na 3-4 s i z powrotem działa dobrze.

    Źle to po prostu napisałem wyżej :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 wrz 2012, o 22:17 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 02 wrz 2012
    Posty: 73
    Pomógł: 2

    Kod jest w takich powijakach, że wstyd byłoby wklejanie go tutaj, uwierz... :D
    Jeszcze zoptymalizowanie kodu przede mną dopiero :D

    Już mi nie gaśnie po resecie ;) ten model wyświetlacza ma długi przewód myślowy po prostu :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2012, o 12:11 
    Offline
    Użytkownik

    Dołączył(a): 24 sty 2012
    Posty: 1469
    Pomógł: 56

    hmmm... skoro nie chcesz pokazać kodu to czego właściwie oczekujesz od tych którzy chcą Ci pomóc?
    Mają iść do wróżki? Popatrzeć w gwiazdy i zgadnąć co robisz źle?

    Schemat Panie Kolego i kod to podstawa pomocy :!: Inaczej nikt nie zgadnie co spłodziłeś. Gdzie np. pominąłeś średnik a gdzie brakuje przecinka...

    _________________
    Jestem początkujący i moje porady mogą być błędne



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 maja 2015, o 09:33 
    Offline
    Użytkownik

    Dołączył(a): 09 kwi 2015
    Posty: 44
    Pomógł: 0

    Witam mam pewien problem z ogarnięciem wyświetlacza.. A chodzi o to że nić nie mogę na niego wysłać. Kumpel napisał program w bascomie i wyświetlił napis. Ja potem podłączyłem do siebie nic nie zmieniając załadowałem mój program i zaczął świrować i pisał ciągle literki. odłączyłem programator podłączyłem i znowu na nic nie reaguje.. ma ktoś jakiś pomysł ?

    Kod:
    plik H
    #include <avr/io.h>
    #include <util/delay.h>


    //-------------------------------------------------------------------------------------------------
    //
    // Konfiguracja sygnałów sterujących wyświetlaczem.
    // Można zmienić stosownie do potrzeb.
    //
    //-------------------------------------------------------------------------------------------------
    #define LCD_RS_DIR      DDRC
    #define LCD_RS_PORT    PORTC
    #define LCD_RS         (1 << PC3)

    #define LCD_E_DIR      DDRC
    #define LCD_E_PORT      PORTC
    #define LCD_E         (1 << PC4)

    #define LCD_DB4_DIR      DDRA
    #define LCD_DB4_PORT   PORTA
    #define LCD_DB4         (1 << PA0)

    #define LCD_DB5_DIR      DDRA
    #define LCD_DB5_PORT   PORTA
    #define LCD_DB5         (1 << PA1)

    #define LCD_DB6_DIR      DDRA
    #define LCD_DB6_PORT   PORTA
    #define LCD_DB6         (1 << PA2)

    #define LCD_DB7_DIR      DDRA
    #define LCD_DB7_PORT   PORTA
    #define LCD_DB7         (1 << PA3)

    //-------------------------------------------------------------------------------------------------
    //
    // Instrukcje kontrolera Hitachi HD44780
    //
    //-------------------------------------------------------------------------------------------------

    #define CLEAR                     0x01

    #define HOME                     0x02

    #define ENTRY_MODE                  0x04
       #define EM_SHIFT_CURSOR            0
       #define EM_SHIFT_DISPLAY         1
       #define EM_LEWO                  0
       #define EM_PRAWO               2

    #define DISPLAY_ONOFF               0x08
       #define DISPLAY_OFF               0
       #define DISPLAY_ON               4
       #define CURSOR_OFF               0
       #define CURSOR_ON               2
       #define CURSOR_NOBLINK            0
       #define CURSOR_BLINK            1

    #define DISPLAY_CURSOR_SHIFT         0x10
       #define SHIFT_CURSOR            0
       #define SHIFT_DISPLAY            8
       #define SHIFT_LEWO               0
       #define SHIFT_PRAWO               4

    #define FUNCTION_SET               0x20
       #define FONT5x7                  0
       #define FONT5x10               4
       #define ONE_LINE               0
       #define TWO_LINE               8
       #define LCD4_BIT               0
       #define LCD8_BIT               16

    #define CGRAM_SET                  0x40

    #define DDRAM_SET                  0x80

    //-------------------------------------------------------------------------------------------------
    //
    // Deklaracje funkcji
    //
    //-------------------------------------------------------------------------------------------------

    void LCD_WriteCommand(unsigned char);
    void LCD_WriteData(unsigned char);
    void LCD_WriteText(char *);
    void LCD_GoTo(unsigned char, unsigned char);
    void LCD_Clear(void);
    void LCD_Home(void);
    void LCD_Init(void);

    //-------------------------------------------------------------------------------------------------
    //
    // Koniec pliku HD44780.h



    plik C
    #include "HD44780.h"
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wystawiająca półbajt na magistralę danych
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_h_bajt(unsigned char h_bajt)
    {
    if(h_bajt & 0x01)
       LCD_DB4_PORT |= LCD_DB4;
    else
       LCD_DB4_PORT  &= ~LCD_DB4;

    if(h_bajt & 0x02)
       LCD_DB5_PORT |= LCD_DB5;
    else
       LCD_DB5_PORT  &= ~LCD_DB5;

    if(h_bajt & 0x04)
       LCD_DB6_PORT |= LCD_DB6;
    else
       LCD_DB6_PORT  &= ~LCD_DB6;

    if(h_bajt & 0x08)
       LCD_DB7_PORT |= LCD_DB7;
    else
       LCD_DB7_PORT  &= ~LCD_DB7;
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_Write(unsigned char dataToWrite)
    {
    LCD_E_PORT |= LCD_E;
    _LCD_h_bajt(dataToWrite >> 4);
    LCD_E_PORT &= ~LCD_E;
    LCD_E_PORT |= LCD_E;
    _LCD_h_bajt(dataToWrite);
    LCD_E_PORT &= ~LCD_E;
    _delay_us(50);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu rozkazu do wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteCommand(unsigned char commandToWrite)
    {
    LCD_RS_PORT &= ~LCD_RS;
    _LCD_Write(commandToWrite);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu danych do pamięci wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteData(unsigned char dataToWrite)
    {
    LCD_RS_PORT |= LCD_RS;
    _LCD_Write(dataToWrite);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wyświetlenia napisu na wyswietlaczu.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteText(char * text)
    {
    while(*text)
      LCD_WriteData(*text++);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja ustawienia współrzędnych ekranowych
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_GoTo(unsigned char x, unsigned char y)
    {
    LCD_WriteCommand(DDRAM_SET | (x + (0x40 * y)));
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja czyszczenia ekranu wyświetlacza.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Clear(void)
    {
    LCD_WriteCommand(CLEAR);
    _delay_ms(2);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Home(void)
    {
    LCD_WriteCommand(HOME);
    _delay_ms(2);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Procedura inicjalizacji kontrolera HD44780.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Init(void)
    {
    unsigned char i;
    LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
    LCD_DB5_DIR |= LCD_DB5; //
    LCD_DB6_DIR |= LCD_DB6; //
    LCD_DB7_DIR |= LCD_DB7; //
    LCD_E_DIR    |= LCD_E;   //
    LCD_RS_DIR    |= LCD_RS;  //
    _delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
    LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
    LCD_E_PORT &= ~LCD_E;  // wyzerowanie linii E

    for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
      {
      LCD_E_PORT |= LCD_E; //  E = 1
      _LCD_h_bajt(0x03); // tryb 8-bitowy
      LCD_E_PORT &= ~LCD_E; // E = 0
      _delay_ms(5); // czekaj 5ms
      }

    LCD_E_PORT |= LCD_E; // E = 1
    _LCD_h_bajt(0x02); // tryb 4-bitowy
    LCD_E_PORT &= ~LCD_E; // E = 0

    _delay_ms(1); // czekaj 1ms
    LCD_WriteCommand(FUNCTION_SET | FONT5x7 | TWO_LINE | LCD4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
    LCD_WriteCommand(DISPLAY_ONOFF | DISPLAY_OFF); // wyłączenie wyswietlacza
    LCD_WriteCommand(CLEAR); // czyszczenie zawartosći pamieci DDRAM
    _delay_ms(2);
    LCD_WriteCommand(ENTRY_MODE | EM_SHIFT_CURSOR | EM_PRAWO);// inkrementaja adresu i przesuwanie kursora
    LCD_WriteCommand(DISPLAY_ONOFF | DISPLAY_ON | CURSOR_OFF | CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
    LCD_WriteCommand(CLEAR);
    }

    //-------------------------------------------------------------------------------------------------
    //
    // Koniec pliku HD44780.c
    //
    //-------------------------------------------------------------------------------------------------

    i main

    #include <avr/io.h>
    #include <util/delay.h>

    #include "HD44780.h"

    int main(void)
    {
       LCD_Init();

       DDRD |= (1<<PD6);
       while(1)
       {
       
       LCD_WriteText("WITAM  ");
       _delay_ms(1000);
       }
    }

    //


    oczywiście wszystko się kompiluje bez problemu.
    Pomoże ktoś ? Mam nadzieje że to dobre miejsce:)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 maja 2015, o 10:27 
    Offline
    Użytkownik

    Dołączył(a): 22 sty 2014
    Posty: 1806
    Zbananowany użytkownik

    Pomógł: 168

    Źle wstawiony listing kodu, zapoznaj się z tym:

    topic7402.html



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 lip 2017, o 18:52 
    Offline
    Nowy

    Dołączył(a): 17 lip 2017
    Posty: 2
    Pomógł: 0

    Witam, jestem początkujący i w programowaniu i w nC, wiem, że temat stary i w ogóle, ale może ktoś zaspokoi moją ciekawość i rodzącą się wściekłość na LCD. Korzystam ze środowiska atmel studio i książki "AVR, ARM7. Programowanie mikrokontrolerów dla każdego" i stamtąd wziąłem kod na testy który się nie kompiluje. Problemem jest to miejsce:

    char napis[15] = "Witaj. Kotlecie";
    WlaczLCD();
    WyswietlLCD(napis, 15);

    Jakkolwiek bym nie podstawiał zawsze ilość znaków które przypiszę do zmiennej tablicowej napis jest za duża dla podanej przeze mnie. Czemu nawet jeśli dam dwie literki np char napis[2] = "AB"; pojawia się błąd "initializer-string for array of chars is too long [-fpermissive]".
    Poza tym wszystkie przykłady jakie oglądam w internecie nie mają przy bibliotece util/delay.h zdefiniowanego parametru F_CPU i nie rozumiem czemu skoro mi bez tego się nie kompiluje.
    Po wprowadzeniu zmian umożliwiających skompilowanie programu wgranie go powoduje tylko wyświetlenie wszystkich pixeli górnego wiersza wyświetlacza, żadnych liter. Proszę o pomoc bo już jestem zdesperowany.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 33 ]  Przejdź na stronę 1, 2  Następna strona

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO