Mikrokontrolery Infineon XMC4500 w praktyce, część 5. Obsługa kolorowego wyświetlacza LCD TFT
Opis aplikacji
System w warstwie fizycznej składa się z płytki XMC4500 Relax Kit oraz modułu KAmodTFT2. Wyprowadzenia RESET, SCE, DIN oraz CLK wyświetlacza z modułu KAmodTFT2 zostały podłączone odpowiednio do wyprowadzeń P1.8, P1.9. P1.10 oraz P1.11 mikrokontrolera z płytki XMC4500 Relax Kit. Schemat elektryczny pokazano na rysunku 5. Rzeczywiste połączenie przedstawiono na fotografii 6.
Rys. 5. Schemat elektryczny komponentów wykorzystanych w aplikacji
Fot. 6. Zdjęcie połączonej płytki XMC4500 Relax Kit z modułem z KAmodTFT2
Aplikacja ma być prostym przykładem wykorzystania wyświetlacza, dlatego przewidziany scenariusz obejmuje wyświetlenie kolejno tekstu, figury geometrycznej oraz obrazka. Schemat blokowy programu przedstawiono na rysunku 7.
Rys. 7. Schemat blokowy działania aplikacji
Biblioteka obsługi wyświetlacza
Wyświetlacz od telefonu Nokia 6100/6610 cieszy się dużą popularnością wśród elektroników hobbystów, dzięki czemu powstało wiele dedykowanych dla tych wyświetlaczy bibliotek, które ich twórcy udostępniają bezpłatnie w Internecie. Tworząc aplikację warto skorzystać z takiej formy gotowego oprogramowania, zamiast pisać je od początku. W niniejszej aplikacji postąpiono właśnie w taki sposób. Użyta biblioteka pochodzi ze strony http://atomsoft.wordpress.com, którą prowadzi Jason Lopez. Kod biblioteki, który napisany został dla mikrokontrolera Microchip PIC18F248 można pobrać pod adresem. Biblioteka ta składa się z dwóch plików: źródłowego o nazwie lcd.c oraz nagłówkowego o nazwie lcd.h. Lista najważniejszych zaimplementowanych w nich funkcji wraz z krótkim opisem działania została przedstawiona w tabeli 1.
Tab. 1. Lista najważniejszych zaimplementowanych funkcji w bibliotece wyświetlacza wraz z krótkim opisem
Funkcja |
Opis działania |
LCDFill() |
Wypełnienie ekranu zadanym kolorem |
LCDInit() |
Zainicjowanie wyświetlacza |
LCDInit() |
Wypełnienie wskazanego piksela zadanym kolorem |
LCDSetLine() |
Narysowanie linii o zadanym kolorze między wskazanymi punktami |
LCDSetRect() |
Narysowanie prostokąta o zadanym kolorze między wskazanymi punktami |
LCDSetCircle() |
Narysowanie okręgu o zadanym kolorze i promieniu i punkcie będącym środkiem okręgu |
LCDPutChar() |
Napisanie pojedynczego znaku o zadanym rozmiarze oraz kolorze tekstu i tła, w zadanym miejscu |
LCDPutStr() |
Napisanie łańcucha znaków o zadanym rozmiarze oraz kolorze tekstu i tła, w zadanym miejscu |
LCDWriteBMP() |
Narysowanie obrazka z pliku graficznego typu BMP |
W bibliotece interfejs komunikacyjny do transmisji szeregowej zaimplementowany został programowo. Oznacza to, że wysyłanie danych do wyświetlacza odbywa się nie za pomocą sprzętowego interfejsu SPI, a przy użyciu portów wejścia/wyjścia.
Jako że biblioteka została napisana pod mikrokontroler Microchip PIC18F248, aby mogła ona być używana przez mikrokontroler z rodziny XMC4000 firmy Infineon konieczne jest dokonanie w niej pewnych zmian.
Zmiany w pliku lcd.h:
- Usunięcie dwóch dyrektyw #include:
#include #include
- Usunięcie linii:
#ifndef __LCD_H
- Usunięcie definicji do sterowania portami:
#define LCD_RES LATBbits.LATB0 //RESET #define LCD_DIO LATBbits.LATB1 //SERIAL DATA #define LCD_SCK LATBbits.LATB2 //CLOCK #define LCD_CS LATBbits.LATB3 //CHIP SELECT #define LCD_TRIS TRISB #define LCD_MASK 0xF0
- Usunięcie słowa ‘rom’ z: deklaracji funkcji LCDPutRomStr() i LCDWriteBMP()
Zmiany w pliku lcd.c:
- Dodanie dyrektyw #include:
#include #include
- Usunięcie słowa ‘rom’ z: deklaracji funkcji LCDPutRomStr() i LCDWriteBMP(), tablic FONT6x8[],FONT8x8[] i FONT8x16[] oraz wskaźników *pFont i *pChar
- Dodanie deklaracji i definicji funkcji do sterowania portami:
void LCD_RES(unsigned char value) { IO003_WritePort(IO003_Handle0,value); } void LCD_CS(unsigned char value) { IO003_WritePort(IO003_Handle1,value); } void LCD_DIO(unsigned char value) { IO003_WritePort(IO003_Handle2,value); } void LCD_SCK(unsigned char value) { IO003_WritePort(IO003_Handle3,value); }
- Zamiana definicji do sterowania portami i ich przypisań (LCD_RES = 1, LCD_RES = 0, LCD_DIO = 1, LCD_DIO = 0, LCD_SCK = 1, LCD_SCK = 0, LCD_CS = 1, LCD_CS = 0) na wywołanie funkcji (LCD_RES(1), LCD_RES(0), LCD_DIO(1), LCD_DIO(0), LCD_SCK(1), LCD_SCK(0), LCD_CS(1), LCD_CS(0))
- Usunięcie wyrażeń ‘Nop()’
- Usunięcie linii:
LCD_TRIS &=LCD_MASK; LCD_TRIS = 0;
- Zmiana ciała funkcji delay_ms() na:
unsigned int x; for(x=0;x<ms;x++) { int i=0; for(i=0; i<10; i++) { } }