Reklama

Barevný LCD displej s řadičem ST7735S řízený mikrokontrolérem ATmega

Úvod

Nedávno jsem si na Ebay pořídil barevný grafický displej s řadičem ST7735S, který se připojuje k mikrokontroléru pomocí SPI rozhraní. Tento článek není zaměřen na teoretické vysvětlení komunikace SPI, to nechám na některý příspěvek do Základů programování mikrokontroléru ATmega, ale na praktickou ukázku zapojení tohoto grafického displeje a na pár osobních zkušeností s tímto displejem.
Věrohodných informací o tomto LCD displeji je velmi málo. Informace od prodejců na Ebay jsou velmi strohé a jediný datasheet, co jsem našel, je pouze přímo pro řadič displeje ST7735. Takže když jsem hledal návod, jak zprovoznit tento display pro mikrokontrolér ATmega32, tak jsem byl velmi rád, že jsem našel několik návodů pro jiné mikrokontroléry. Mimo jiné jsem našel velmi dobrý návod pro mikrokontrolér ATmega328 a pro podobný displej se stejným řadičem, který lze stáhnout ZDE. Nejedná se pouze o zdrojový kód, ale i o důkladné vysvětlení celého postupu. Zběžným pohledem jsem se podíval na rozdíly v komunikaci SPI pro ATmegu32 a ATmegu328 a narazil jsem pouze na jiné rozložení pinů. Ovšem pokud používáte mikrokontrolér ATmega328, tak nemusíte žádné úpravy ani provádět a přímo můžete použít dostupný návod. Dále jsou drobné rozdíly v pojmenování pinů u LCD displeje, ale o tom víc v následujícím postupu.

Postup krok za krokem

 
1.
Jako první si připojíme LCD displej k mikrokontroléru. Jednotlivé piny LCD ukazuje Obr. 1.
Obr. 1: Konektor pro připojení LCD displeje a mikrokontroléru

Obr. 1: Konektor pro připojení LCD displeje a mikrokontroléru

Propojení se trochu liší od vzorového zapojení, viz Tab. 1.

Tab. 1: Popis připojení LCD a mikrokontroléru

Pin LCD Pin mikrokontroléru
LED – (LED podsvícení) 3 – PB2 (proudové omezení, nebo spínání pomocí tranzistoru), nebo VCC s rezistorem
SCK – (sériové hodiny) 8 – (PB7) – max 3,3 V
SDA – (sériové data) 6 – (PB5) – max 3,3 V
A0 2 – (PB1) – max 3,3 V
RESET 1 – (PB0) – max 3,3 V
CS 5 – (PB4), nebo GND – max 3,3 V
GND GND
VCC VCC

 
Když jsem poprvé viděl názvy pinů na LCD displeji, tak jsem nabyl dojmu, že se tento displej připojuje přes I2C a ne přes SPI, ale všechny dostupné návody, co jsem našel popisují vždy výhradně připojení pomocí SPI. Dalším překvapením pro mě byl pin A0, který je z největší pravděpodobností stejný jako pin D/C, který řídí rozlišení mezi daty a příkazy (ověřeno několika komentáři na fórech a praxí). Pro tento LCD displej existuje několik různých provedení, takže se klidně může stát, že narazíte zase na jiné značení jednotlivých pinů. Co se týká výše napájecího napětí, tak na tomto displeji není přímo napsána, ale displej by měl být jak pro 3,3 V, tak i pro napětí 5 V (dle některých informací prodejců z Ebay). Dost záleží na jednotlivých provedeních DPS s LCD, zda obsahují stabilizátor napětí z 5V na 3,3V, dále záleží na propojení konfigurační propojky pro napájecí napětí apod. Typ, který jsem zkoušel měl podle všeho osazen integrovaný obvod LM6206-3.0 (katalog výrobce ZDE), takže by nemuselo být přímo nutné propájet propojku J1 při použití napájecího napětí 3,3 V. Podle katalogového listu výrobce LCD (ke stažení ZDE) může být maximální úroveň napětí datové komunikace 3,3V. Proto je nutné použít při napájecím napětí 5V převodník úrovně z 5V na 3,3V (na některých typech DPS s LCD to vypadá, že již je tento převodník umístěn). Také někteří prodejci uvádí, že je nutné k pinu LED umístit do série rezistor pro omezení proudu (pro 3,3 V – 10 Ohm, pro 5 V – 100 Ohm). Osobně rezistor přidávám, protože napětí na LED se pohybuje okolo 3,2 V, takže při napájecím napětím 5 V bude na rezistoru napětí okolo 1,8 V. Proud protékající LED a výkon rezistoru lze dopočítat pomocí staršího příspěvku, viz ZDE. Pokud chcete využít ke spínání pinu LED mikrokontrolér, musíte si dát pozor, aby nastavený proud LED nebyl vyšší, než maximální povolený protékající proud pinu mikrokontroléru. Můžete také využít proudové posílení výstupu, více lze nalézt ZDE.
 
2.
Založíme nový projekt v Atmel Studiu a zkopírujeme do něj zdrojový kód, který lze stáhnout ZDE. Zdrojový kód začíná na straně na 13. Celý zdrojový kód včetně funkce “main” pro zjednodušení vložíme do vytvořeného projektového souboru.
 
POZOR při kopírování dojde někdy ke spojení dvou řádků, když začíná nová strana. První řádek z nové strany se při kopírování spojí s komentářem z předchozí strany. Asi nejzáludnější to bylo ve funkci void HardwareReset(), kde kvůli řádku SetBit(PORTB,0); // return PB0 high se nedařilo LCD displej zprovoznit. Takže celý zdrojový kód projděte, nebo jednotlivé strany kopírujte zvlášť.
 
Pro zjednodušení dalšího použití určitě doporučuji vytvořit si vlastní .c a.h soubor, který bude sloužit jako univerzální knihovna pro více projektů.
 
3.
Po vložení zdrojového souboru do projektu provedeme pár změn.
První změnu provedeme v definicích, kde změníme:
 
#define LED 5 na #define LED 2 // Boarduino LED on PB2
 
Dále změníme ve funkci void SetupPorts() nastavení DDRB na:
 
DDRB = 0b10111111; // Output- PB7(SCK), SDA(PB5), PB4(CS), PB2(LED),PB1(A0), PB0(RESET)
 
a také do funkce SetupPorts() přidáme příkazy pro nastavení CS do stavu log. 0 a pro rozsvícení LED
 
SetBit(PORTB,LED); // Turn LED ON
ClearBit(PORTB,4); // Clear CS
 
Pokud jste připojily CS na GND a pin LED na VCC, tak tyto řádky přidávat nemusíte.
 
Z funkce “main” odstraníme ještě řádek:
 
FlashLED(1); // indicate program start
 
který by nechal vypnuté podsvícení displeje pokud k němu využíváte PB2.
 
Také můžete ve funkci void OpenSPI() pomocí registrů SPCR a SPSR nastavit frekvenci pro SPI v závislosti na použitém krystalu.
 
4.
Přeložíme a nahrajeme zdrojový kód do mikrokontroléru. Nyní by se měla zobrazit matice písmen a animace s nápisem “Hello, World!”, viz Obr. 2.

Obr. 2: Výsledek staženého souboru

Obr. 2: Výsledek staženého souboru

 

Příklad použití LCD displeje jako jednoduchý grafický voltmetr, viz. Obr. 3.

Obr. 3: Příklad použití

Obr. 3: Příklad použití

 

Pro rychlé otestování můžete stáhnout zdrojový kód pro mikrokontrolér ATmega32, který zobrazí obrazovku, viz. Obr. 4.

Obr. 4: Výsledek testovacího souboru

Obr. 4: Výsledek testovacího souboru

 
ZDROJOVÝ KÓD LZE STÁHNOUT POUZE PO PŘIHLÁŠENÍ.
 
Jakékoliv šíření staženého zdrojového kódu bez souhlasu autora je zakázáno.

 

Download “ST7735 - AT32” ST7735_test.zip – Downloaded 28 times – 2 kB


 

Popis některých užitečných funkcí

 
void SetupPorts() – Nastavení pinů mikrokontroléru
void FlashLED(byte count) – Zablikání LED podsvícením
void OpenSPI() – Oteření SPI komunikace
void CloseSPI() – Uzavření SPI komunikace
void HardwareReset() – Hardwarový reset displeje
void InitDisplay() – Inicializace displeje
void ClearScreen()- Vymazání obrazovky
void DrawPixel (byte x, byte y, int color) – Vykreslení pixelu na pozici X,Y barvou color
void HLine (byte x0, byte x1, byte y, int color) – Vykreslení vodorovné čáry
void VLine (byte x, byte y0, byte y1, int color) – Vykreslení svislé čáry
void Line (int x0, int y0, int x1, int y1, int color) – Vykreslení čáry
void DrawRect (byte x0, byte y0, byte x1, byte y1, int color) – Vykreslení obdélníku
void FillRect (byte x0, byte y0, byte x1, byte y1, int color) – Vykreslení plného obdélníku
void CircleQuadrant (byte xPos, byte yPos, byte radius, byte quad, int color) – Vykreslení jednoho kvadrantu kružnice
void Circle (byte xPos, byte yPos, byte radius, int color) – Vykreslení kružnice
void RoundRect (byte x0, byte y0, byte x1, byte y1, byte r, int color) – Vykreslení obdélníku se zakulacenými rohy
void FillCircle (byte xPos, byte yPos, byte radius, int color) – Vykreslení plné kružnice
void Ellipse (int x0, int y0, int width, int height, int color) – Vykreslení elipsy
void FillEllipse(int xPos,int yPos,int width,int height, int color) – Vykreslení plné elipsy
void GotoXY (byte x,byte y) – Jít na pozici XY ve velikosti znaku
void GotoLine(byte y) – Jít na řádek Y
void SetOrientation(int degrees) – Nastavení orientace displeje v úhlech 90°, 180° a 270°
void PutCh (char ch, byte x, byte y, int color) – Vypsání znaku na pozici XY
void WriteChar(char ch, int color) – Vypsání znaku na aktuální pozici. Pozici znaku lze měnit dle GotoXY
void WriteString(char *text, int color) – Vypsání řetězce na aktuální pozici. Pozici znaku lze měnit dle GotoXY
void WriteInt(int i) – Vypsání čísla dekadicky na aktuální pozici. Pozici znaku lze měnit dle GotoXY
void WriteHex(int i) – Vypsání čísla hexadecimálně na aktuální pozici. Pozici znaku lze měnit dle GotoXY
 
 
Aktualizace: 5.10.2015

Následující a předchozí příspěvek v kategorii:

 
Následující: Rozšíření knihovny pro barevný grafický LCD displej s řadičem ST7735 o zobrazení sedmisegmentového displeje
Předchozí: Bitové operace nejen pro mikrokontroléry AVR
 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.