LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

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. 

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.