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



Teraz jest 29 mar 2024, o 08:30


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 ]
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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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
Avatar użytkownika

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

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

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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: 18
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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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
Avatar użytkownika

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

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

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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 0 gości


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