Skocz do zawartości

Kurs STM32 F1 HAL - #10 - wyświetlacz graficzny na SPI


Pomocna odpowiedź

html_mig_img
W poprzedniej części kursu poznaliśmy działanie interfejsu SPI. W praktyce wykorzystaliśmy go do komunikacji z ekspanderem portów MCP23S08.Teraz zajmiemy się ciekawszym tematem, czyli wyświetlaczem graficznym z telefonu Nokia 5110. Jest to tani i popularny moduł, który może ułatwić interakcję z budowanym urządzeniem.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Link to post
Share on other sites

Dzień doberek (a raczej wieczór). Mam pytanie odnośnie funkcji lcd_clear(). Ponieważ jest ona wywołana w głównej pętli programu bez dodatkowego polecenia lcd_copy():

 lcd_setup();
 
 lcd_draw_bitmap(forbot_logo);
 lcd_copy();
 delay_ms(1000);
 
 lcd_clear();
 for (i = 0; i < 5; i++)
 lcd_draw_text(i, i * 8, "Forbot!");
 lcd_copy();

Powoduje to fakt, że zostanie wyczyszczony tylko bufor w pamięci ram Nucleo, ale nie w LCD (na dobrą sprawę nie trzeba czyścić bufora w wyświetlaczu i ta wersja jest bardziej optymalna, ale w przypadku gdy np. chcemy wyczyścić ekran, to trzeba pamiętać za każdym razem o skopiowaniu bufora do wyświetlacza). Ja dla uproszczenia do każdego polecenia które wysyłane dane do wyświetlacza, dopisałem lcd_copy(), dzięki czemu nie muszę wywoływać nigdzie jawnie funkcji lcd_copy() w programie głównym.

  • Lubię! 1
Link to post
Share on other sites

Dzięki!

Jak tylko wymyślę jak sterować głośnikiem (obsługa DAC) to dodam loop z Dr Dre - "The Next Episode" do zwycięskiej planszy 🙂
Przy kodowaniu PCM 8bit/8kHz dla 5s wyjdzie jakieś dodatkowe 40kB.

Link to post
Share on other sites

Ustawilem narazie BL na GPIO_output i tak jak w kursie ustawilem na stan wysoki, czyli napiecie 3V. Obrazek jednak nadal jest tak niewyrazny ze trudno bylo mi go dostrzec. Rozumiem ze za pomocą PWM mozna tylko zmniejszyc jasnosc ustawiajac na nizsze napiecie. Czy jest wiec jakas mozliwosc poprawienia obrazu?

Edytowano przez danielbr3
Link to post
Share on other sites
6 godzin temu, danielbr3 napisał:

Ustawilem narazie BL na GPIO_output i tak jak w kursie ustawilem na stan wysoki, czyli napiecie 3V. Obrazek jednak nadal jest tak niewyrazny ze trudno bylo mi go dostrzec. Rozumiem ze za pomocą PWM mozna tylko zmniejszyc jasnosc ustawiajac na nizsze napiecie. Czy jest wiec jakas mozliwosc poprawienia obrazu?

Wyrazistość obrazu nie zależy od siły podświetlania. Poeksperymentuj z kontrastem.

Poszukaj linijki:

lcd_cmd(0x80 | 0x2f); //Ustawienie kontrastu

i zmień 0x2f na inna wartość, np:

lcd_cmd(0x80 | 0x3f); //Ustawienia kontrastu

Pozdrawiam,
Marek

  • Lubię! 1
  • Pomogłeś! 1
Link to post
Share on other sites

Witam

Chciałbym wyświetlić na LCD wartość zmiennej, a nie tekst. Dokładnie chodzi mi o pomiar temperatury z czujnika. Zmienna przechowująca wartość temperatury ma typ float.

Jak to zrobić?

Funkcja draw_text() oczekuje jako argumentu nr 3 typu const char*.

Będę wdzięczny za pomoc.

Link to post
Share on other sites

Musisz zamienić wartość zmiennej na tekst, np. używając funkcji sprintf (jednak jej użycie czasem jest kłopotliwe – „zasobożerne"). Jest to chyba najprostszy (w sensie programistycznym) sposób.

Możesz również skonwertować zmienną ręcznie, utworzyć tablicę znaków (char), a następnie ją uzupełnić, zamieniając każdą cyfrę temperatury na znak w kodzie ASCII (chyba trzeba dodać 48). Dobrać się do poszczególnych cyfr w takim wypadku też trzeba na piechotę, np. konwertując (rzutując) pomnożoną przez 100 (jeżeli chcesz mieć 2 miejsca po przecinku) zmienną na typ całkowity i potem za pomocą bawiąc się operacją modulo – operator % (najmłodsza cyfra to reszta z dzielenia liczby przez 10, druga w kolejności – cyfra dziesiątek – to reszta z dzielenia przez 100 pomniejszona o cyfrę jedności, itd.). Trzeba też pamiętać o kropce/przecinku dziesiętnym w odpowiednim miejscu.

  • Lubię! 2
Link to post
Share on other sites

@piotr96

Na wstępie dzięki wielkie za pomoc. Udało mi się rozwiązać problem w ten prostszy sposób. Podejrzewam, że dla osób mających większe obycie z C rozwiązanie jest oczywiste, ale gdyby ktoś potrzebował, wyświetlanie liczb zmiennoprzecinkowych za pomocą funkcji lcd_draw_text() zrobiłem tak:

sprintf(buffer, "%.2f", temperature);
lcd_draw_text(2, 35, (uint8_t *)buffer);

W moim przypadku potrzebuję temperaturę z dokładnością do 2 miejsc po przecinku.

Oczywiście wcześniej w programie zadeklarowałem zmienną tablicową, tutaj dla przykładu 8 znaków:

char buffer[8];

Zmienna temperature jest typu float i w każdym przebiegu pętli jest zamieniana na ciąg znaków przechowywany w zmiennej tablicowej buffer[].

A na biurku obok mnie temperatura to 21,06 C 😀.

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.