Práce s grafickým LCD
Úvod
Pro připojení k AVR jsem vybral grafické LCD řízené standardním řadičem KS108. Datasheet řadiče je možné stáhnout si zde: KS108b. Každý tento řadič obsluhuje matici 64x64 bodů. Body jsou rozděleny do 64 sloupců a každý sloupec je rozdělen na 8 řádků (bajtů), kde každý řádek je složen z 8 bodů (bitů). Pokud je tedy kurzor nastaven na pozici 0,0 a my zapíšeme data 0x55, zapíše se do prvního sloupce na prvních 8 bitů shora střídavě tečka a prázné místo.Pokud máme displej s rozlišením 128x64 bodů, musíme mít na displeji řadiče 2, kde každý obluhuje polovinu displeje. To, která polovina je zrovna ovládána, je určeno piny CS (Chip Select).
Knihovny pro GLCD
Jak už je zvykem na tomto webu, je možné si i pro tuto lekci stáhnout knihovnu pro ovládání grafického LCD. Jedná se prozatím o vývojovou verzi, kde kromě inicializace a zobrazení LCD není žádná další funkce, ale i ta může sloužit jako inspirace. Knihovnu je možné si stáhnout v souboru glcd.zip. Knihovna funguje pro následující konfiguraci:- DATA - PORTB
- ENABLE - PA.2
- DATA/COMMAND - PA.0
- READ/WRITE - PA.1
- CS1 - PA.3
- CS2 - PA.4
Ukázková aplikace
#define ADC_VREF_TYPE 0x40
#define F_CPU 147456000
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include "glcd_lib.h"
static uint8_t IMAGE[] PROGMEM = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,
0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF,
0xFF,0xFF,0x7F,0x7F,0x3F,0xBF,0x3F,0x1F,
0x3F,0x3F,0x3F,0x7F,0xFF,0xBF,0x1F,0x47,
0x87,0x07,0x07,0x07,0x27,0x77,0x77,0x67,
0xE7,0xE7,0xE7,0xC7,0x87,0x07,0x07,0x07,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x87,
0xC7,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0x7F,
0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,
0x3F,0x7F,0x7F,0x7F,0x3F,0x3F,0x3F,0x1F,
0x1F,0x1F,0x1F,0x1F,0x0F,0x1F,0x1F,0x1F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x7F,0x7F,0x7F,
0x7F,0x3F,0x3F,0x7F,0x7F,0x7F,0x7F,0x7F,
0x7F,0xFF,0xFF,0xFF,0x7F,0x7F,0xFF,0xFF,
0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xF8,0xF8,
0xF0,0xF0,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,
0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,
0x0C,0x0E,0x1C,0x3F,0x0F,0x03,0x00,0x04,
0x04,0x87,0xCF,0x9F,0xFF,0xFE,0xFC,0xF8,
0xF8,0xFC,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFD,0xFF,0xFF,0xFF,0xDF,0xCF,0x1F,
0x3F,0x3F,0x13,0x03,0x01,0x10,0x1C,0x0C,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x90,0xF8,0xF8,0xF8,0xF8,0xF8,0xCC,
0xE0,0xF0,0xF8,0xF8,0xF8,0xFC,0xFC,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xF8,0xF0,0xE0,0xE0,
0xC0,0x80,0x00,0x00,0x00,0x80,0xC0,0xC0,
0xE0,0xE0,0xC0,0xE0,0xF0,0xFC,0xFE,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0x3F,0x1F,0x09,0x01,0x00,
0x04,0x06,0x06,0x06,0x0E,0x1C,0x1E,0x18,
0x1C,0x18,0x19,0x19,0x01,0x03,0x00,0x00,
0x00,0x07,0x46,0x00,0x00,0x80,0x80,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x84,0xFC,0xF8,0xF4,0xFE,0xFE,
0xF7,0xFB,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFC,0xFC,0xFC,0xFD,0xF9,
0xF9,0xF3,0xFF,0xFF,0x5F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x1F,0x3F,0x3F,0x3F,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xF0,0xE0,0xC0,0xC0,0xC0,0xC0,
0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x03,0x06,0x00,
0x88,0xC8,0xFC,0xFC,0xFE,0xFF,0xFF,0xFF,
0xFF,0xFE,0xF0,0xE0,0xF8,0xFC,0xFE,0xFF,
0xFE,0xFC,0xF8,0x30,0x30,0xE0,0xF6,0x7F,
0x3F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFD,0xF0,0xE0,0xC0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x01,0xF1,0xFB,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFE,0x98,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0xC0,0xFE,0x7F,
0x1F,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFE,0xFC,0xFF,0xFF,0xFE,
0xFE,0x7F,0x7E,0x3F,0x1F,0x1F,0x0F,0x0F,
0x3D,0x39,0x19,0x3B,0x7F,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,
0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xF0,0xF0,
0xF0,0xF0,0xF8,0xFC,0xFF,0xFF,0xFF,0xFF,
0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFC,0xF0,0xF0,0xF0,0xF8,0xF8,0xF8,0xF0,
0xF0,0xE0,0xC0,0xC0,0xE0,0xF0,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xDF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0xF8,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,
0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x03,0x03,0x03,0x03,0x03,0x01,0x03,0x03,
0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x00,
0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
0x07,0x03,0x03,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x05,0x05,0x07,0x07,0x07,0x07
};
int main(void)
{
unsigned int i= 0;
unsigned int ii = 0;
unsigned char temp= 0x0F;
GLCD_Init();
for (ii=0; ii<16; ii++)
{
if (ii % 2)
{
GLCD_CS_2();
}
else
{
GLCD_CS_1();
}
GLCD_SetRow(ii / 2);
for (i=0; i<64; i++)
{
temp= pgm_read_byte_near(IMAGE+(ii*64+i));
GLCD_WriteData(~temp);
}
}
while (1);
}
Konstanta v paměti obsahujie bitový obrázek zobrazený na LCD. Obsahuje střídavě řádky pro levý a pravý řadič (1.-8. řádek). Tom je také uzpůsobena část pro výběr řadiče, kde je nastaven počet řádků na 16 (ne 8) a řádky jsou následně dělejny dvěmi. Zbytek po dělení určuje na jaký z řadičů bude část obrázku vykreslena.
Celý projekt je možné stáhnout zde.
Komentovat článek
Komentáře k článku
článek zatím nikdo nekomentoval
