Biblioteki graficzne Microchipa: obsługa touch-panela i LCD ze sterownikiem SSD1289
List. 16. Odczytanie współrzędnej x
int TouchGetXRAW(void) { TP_CS=0; Delay(); WriteTpSpi(0x90); Delay(); X=ReadTpSpi(); TP_CS=1; return((X&0x0fff)); }
List. 17. Odczytanie współrzędnej y
int TouchGetYRAW(void) { TP_CS=0; Delay(); WriteTpSpi(0xD0); Delay(); Y=ReadTpSpi(); TP_CS=1; return((Y&0x0fff)); }
Obie te procedury podają zmierzone wartości rezystancji w rozdzielczości 12-bitowej, a więc ich wartości zmieniają się w zakresie 0…4095. Żeby uzyskać rzeczywiste współrzędne z zakresu 0<x<319 i 0<y<219 trzeba odczytany wynik przekonwertować. Ale najpierw trzeba ustalić gdzie się znajduje punkt początkowy o współrzędnych (0,0), bo do tego zależy jak będzie wykonywana konwersji. Ja do ustalenia tego punktu dla biblioteki graficznej Microchipa posłużyłem się wtyczką GDD-X. Na ekranie postawiłem obiekt button i tak go przesunąłem by dwie współrzędne były zerowe. Okazało się, ze współrzędne (0,0) są w lewym górnym rogu wyświetlacza.
Na podstawie tej informacji zostały napisane 2 procedury odczytujące pomiary z XPT2046 i zwracające po przekonwertowaniu współrzędne x i y dotknięcia na ekranie. Zostały one pokazane na listingach 18 i 19.
List. 18. Procedura odczytania przekonwertowanej współrzędnej x
SHORT TouchGetY(void){ int x; float xp; if(TP_PENIRQ==1) return(-1); DelayMs(30); x=TouchGetYRAW(); if (x > 3900) x = 3900; else if (x < 200) x = 200; xp=(x - 200) / 16.25; x=xp; if (x > 240) x = 240; return(x); }
List. 19. Procedura odczytania przekonwertowanej współrzędnej y
SHORT TouchGetX(void){ int y; float yp; if(TP_PENIRQ==1) return(-1); DelayMs(30); y=TouchGetXRAW(); if (y > 3850) y = 3850; else if (y < 150) y = 150; yp=((y - 150) / 11.56); y=yp; if(y>320) y=320; return(y); }
Na początku obu procedur jest sprawdzany stan wejścia PENIRQ i jeżeli jest on wysoki, to procedura kończy działanie i zwraca wartość -1. Jeżeli ten stan jest niski, to odczytywana jest wartość z XTP2046 dla konkretnych kanałów. Każda z procedur zwraca po konwersji swoja współrzędną.
Wróćmy teraz do biblioteki i projektu generowanego w GDD-X. Jak już wspomniałem standardowo taki projekt, w którym wybrano MEB generuje pliki ze skonfigurowaną obsługą panelu rezystancyjnego przez przetworniki ADC mikrokontrolera. Musimy teraz go tak przekonfigurować by biblioteka korzystała z obsługi napisanej przez nas.
Po pierwsze trzeba wyłączyć kompilacje dla procedur umieszczonych TouchScreenResistive.c przez usuniecie definicji #define USE_TOUCHSCREEN_RESISTIVE w pliku konfiguracji MY_BOARD.h .
Obsługa panelu dotykowego sprowadza się głównie do funkcji void TouchGetMsg(GOL_MSG *pMsg) umieszczonej w pliku TouchScreen.c . Ta funkcja korzysta z wcześniej opisanych procedur TouchGetX() i TouchGetY() . Ponieważ po usunięciu #define USE_TOUCHSCREEN_RESISTIVE nie będą kompilowane funkcje z TouchScreenResistive.c , to projekt użyje naszych procedur.
Funkcje TouchGetMsg na podstawie odczytanych współrzędnych x, oraz y modyfikuje składowe struktury GOL_MSG dotyczące obsługi panelu dotykowego.
Jak widać z powyższego opisu, żeby dodać własną obsługę panelu dotykowego trzeba dostarczyć 2 procedury: TouchGetX() i TouchGetY() zwracające współrzędne dotkniętego punktu i tak skonfigurować bibliotekę, by z tych procedur korzystała. Zależnie od użytych rozwiązań sprzętowych trzeba też zmodyfikować procedurę TouchInit inicjującą w naszym przypadku programowy interfejs SPI.
Testowanie działania ekranu dotykowego można szybko sprawdzić przez postawienie na ekranie obiektów wykorzystujących ekran dotykowy. Ja użyłem trzech: przycisku Button , suwaka Slider i pokrętła Round Dial – fotografia 7.
Fot. 7. Wygląd ekranu testowania panelu dotykowego
Testy wykazały, ze wszystkie te obiekty współpracują prawidłowo z obsługa ekranu dotykowego, a ich działanie nie odbiega od działania takich samych obiektów w projekcie przeznaczonym dla firmowego modułu MEB.
Podsumowanie
W artykule pokazałem jak można w praktyce zintegrować dostępny na rynku wyświetlacz LCD z panelem dotykowym z graficzna biblioteką firmy Microchip. W trakcie pracy nad integracją z biblioteką miałem możliwość porównania efektów działania z wyświetlaczem modułu Multimedia Expansions Board. Oba wyświetlacze zachowywały się identycznie poza szybkością rysowania niektórych obiektów. Nieznacznie szybszy był wyświetlacz ze sterownikiem SSD1926 modułu MEB. Wynika to najprawdopodobniej z różnicy w budowie sterowników. Poza tym nie starałem się optymalizować czasowo obsługi komunikacji z SS1289
Integracja biblioteki z nowym sterownikiem, szczególnie wykonywana po raz pierwszy nie jest zadaniem prostym, chociaż być może na taka wygląda. Jest to spowodowane dość sporym skomplikowaniem projektu, dużą ilością plików źródłowych i nagminnym stosowaniem kompilacji warunkowej. Przykładowe projekty Microchipa maja tą właściwość, ze działają bardzo dobrze z modułami formowymi, ale ich modyfikacja dla innego sprzętu wymaga trochę pracy. W przypadku biblioteki graficznej naprawdę warto ta prace wykonać, bo efekty są znakomite.