Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

LPC1768 - wyświetlenie obrazka na LCD z sterownikiem SPFD5408B

mariuszterba 15 Maj 2014 13:32 1371 12
  • #1 15 Maj 2014 13:32
    mariuszterba
    Poziom 10  

    Poznaje i oprogramowuję kolejne elementy zestawu Mini-DK-2 aktualnie na tapecie jest wyświetlacz LCD na kontrolerze SPFD5408B. W przyzakładowych programach od producenta zabrakło funkcji pozwalającej wyświetlenie obrazka. Analizując zawartość kodu GLCD.c zauważyłem, że wszystkie funkcję wyświetlające np. linie, tekst wykorzystują funkcję rysującą punkt LCD_SetPoint.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czytając elektrodę polecanym programem do konwersji grafiki dla wyświetlaczy jest m. in. program LCD Image Converter. Ściągłem go, wykonałem kilka prób konwersji za każdy razem tworzy tablicę, którą jak się domyślam można użyć w moim programie do rysowania obrazka. Wydaję mi się, że mogę użyć w/w funnkcji LCD_SetPoint bo po eksperymentach wyszło mi że zmienna point decyduje o kolorze jaki zostanie wyświetlony. Raz próbowałem użyć tablicy wygenerowanej przez program LCD Image Converter, pobierałem jej kolejne elementy i przekazywałem funkcji LCD_SetPoint ale na ekranie pojawiły się śmieci.
    Jak wykorzystać dane zawarte w tablicy i w jakim formacie nakazać programowi LCD Image Converter zapisu danych dla wyświetlacza na SPFD5408B ?

    0 12
  • Pomocny post
    #2 15 Maj 2014 13:55
    mi14chal
    Poziom 28  

    Po pierwsze pokaż kod który wyświetla obrazek. Po drugie czy wyświetlacz jest używany w trybie 16 bitowym, jeśli tak to ten program generuje 16 bitowe próbki w formacie RGB565?

    0
  • #3 15 Maj 2014 16:37
    mariuszterba
    Poziom 10  

    Oto funkcja rysująca obrazek:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    wywołuję ją z main w taki sposób GUI_Show_Picture(0, 0, 128, 128, &image_data_rss);

    Z powodu wielkości kodu wygenerowanego przez program LCD Image Converter tablicę image_data_rss dodaję jako załącznik.

    Nie wiem na razie w jakim trybie jest wyświetlacz może Ty będziesz wiedział na podstawie tego kodu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 15 Maj 2014 17:03
    mi14chal
    Poziom 28  

    No i wszystko jasne skoro masz tablicę static const uint32_t image_data_rss która jest 32 bitowa, a w funkcji masz uint16_t *picture to co się dziwisz, że źle wyświetla. Tak jak pisałem wyeksportuj obrazek do formatu RGB565 i będzie ok.

    0
  • #5 15 Maj 2014 17:27
    mariuszterba
    Poziom 10  

    Jest znacznie lepiej, tak jak napisałeś zapisałem w formacie 16b RGB565.
    Tylko wokół obrazka pojawia się "coś" jeszcze:
    LPC1768 - wyświetlenie obrazka na LCD z sterownikiem SPFD5408B
    Oryginał wygląda tak:
    LPC1768 - wyświetlenie obrazka na LCD z sterownikiem SPFD5408B

    Dodam, że przed wyświetleniem obrazka czyszczę ekran białym kolorem.

    0
  • Pomocny post
    #6 15 Maj 2014 19:17
    Badmaneq
    Poziom 23  

    Używanie funkcji LCD_SetPoint nie jest najlepszym rozwiązaniem, sterownik SPFD5408B i wiele innych pozwala ustawić tzw. obszar okna do którego zapisuje się wartości (kolory) jeden za drugim. Pomija się ciągłe ustalanie aktualnej pozycji "kursora".
    LPC1768 - wyświetlenie obrazka na LCD z sterownikiem SPFD5408B
    Podczas inicjalizacji obszar okna ustawiany jest na cały ekran, lecz można to zmienić w każdej chwili. Dla omawianego sterownika są to rejestry:
    R50h - poziomy adres startowy okna
    R51h - poziomy adres końcowy okna
    R52h - pionowy adres startowy okna
    R53h - pionowy adres końcowy okna

    po wpisaniu odpowiednich wartości do w/w rejestrów należy tylko wpisywać do pamięci sterownika kolejne wartości, po każdym wpisaniu do rejestru R22h wartości inkrementowana jest pozycja "kursora", lecz kiedy zostanie osiągnięty ostatni poziomy adres końcowy okna automatycznie "kursor" zostanie przestawiony do nowej linii... W ten sposób można skopiować tablicę z danymi bez ciągłego obliczania pozycji.
    Poniżej podaję kod na prawidłowe rozwiązanie wyświetlania grafiki.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wrzuć oryginalny plik z grafiką jako załącznik to przetestuję u mnie co się dzieje.

    0
  • #7 15 Maj 2014 19:46
    mariuszterba
    Poziom 10  

    Faktycznie lepsze rozwiązanie. Dzięki za kod i wytłumaczenie.
    W załączniku dorzucam oryginalny obrazek.

    PS. Jestem w trakcie studiowania datasheeta tego kontrolera.

    0
  • #8 15 Maj 2014 20:42
    Badmaneq
    Poziom 23  

    Ależ zagwozdkę mi dałeś :)
    Także u mnie pojawiły się dodatkowe elementy na wyświetlanym obrazku. Co Ja się nakombinowałem w końcu wziąłem inny obraz na tapetę i zadziałało. Już sądziłem, że to wina LCD Image Converter który nie radzi sobie z grafiką w formacie PNG, wziąłem inny obrazek PNG i było ok. Dal pewności Twój PNG chciałem prze konwertować do JPEG'a i otrzymałem komunikat, że zostaną utracone dane przezroczystości obrazka (eureka :). Odnalazł się winowajca.
    Wygląda, że LCD Image Converter w przypadku grafiki z przezroczystością zapisuje dodatkowe dane i to one widać dodatkowo na ekranie.

    Ponieważ program LCD Image Converter tworzy nowy typ tImage można go wykorzystać i funkcja może mieć postać:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wywołanie
    Code:
    LCD_ShowPicture( 50, 100 , &rss );

    0
  • #9 16 Maj 2014 13:29
    mariuszterba
    Poziom 10  

    Wielkie dzięki.
    Jeszce jedno jak powinno nazywać funkcję:
    1. GUI_Show_Picture
    2. GUI_ShowPicture

    która z powyższych jest powszechniej stosowana ?

    0
  • #10 16 Maj 2014 13:56
    gaskoin
    Poziom 38  

    Ani jedna ani druga. Jeśli chodzi o funkcje to:

    gui_show_picture

    Ale tak naprawdę ważne żebyś użył czegokolwiek i był konsekwentny w nazewnictwie.

    0
  • #11 30 Maj 2014 14:46
    NewbieMan
    Poziom 13  

    @mariuszterba: w kodzie inicjalizacyjnym wyświetlacza LCD masz wiele zbędnego kodu zostaw tylko ten odpowiedzialny za inicjację Twojego kontrolera, czyli to co jest w warunku else if( DeviceCode == 0x5408 ). Ewentualnie możesz dodać kompilację warunkową dla poszczególnych sterowników LCD.

    0
  • #12 30 Maj 2014 15:07
    gaskoin
    Poziom 38  

    NewbieMan napisał:
    Ewentualnie możesz dodać kompilację warunkową dla poszczególnych sterowników LCD.


    Optymalizator gcc wytnie niepotrzebne fragmenty kodu (jeśli numer sterownika będzie stałą).

    0
  • #13 30 Maj 2014 18:08
    mariuszterba
    Poziom 10  

    gaskoin napisał:
    NewbieMan napisał:
    Ewentualnie możesz dodać kompilację warunkową dla poszczególnych sterowników LCD.


    Optymalizator gcc wytnie niepotrzebne fragmenty kodu (jeśli numer sterownika będzie stałą).


    Co do kompilacji warunkowej to wiem o co chodzi.
    @gaskoin: możesz podać mały przykład ze stałą ?

    0