Funkční kód pro TFT displej s řadičem HX8743

Pokud se objeví šum nebo starý obraz, tak to je dobrá známka, že se displej rozběhl. Obsah paměti není inicializovaný, takže je v pořádku že zůstává starý stav. Doplnil bych ještě nějaké pokračování.

Při zápisu obrazových dat je možné zapisovat grafické body 16-bitově (5 nejnižších bitů modrá, 6 vyšších bitů zelená a 5 nejvyšších bitů červená složka) nebo 24-bitově (na 2 zápisy, nejdříve nižších 8 bitů zelená, vyšších 8 bitů červená, a druhý zápis 8 bitů modrá a vyšších 8 bitů nevyužito). 24-bitů využívá sice jen 6 vyšších bitů z každé barevné složky, ale lze tak snadno zapisovat 24-bitový obrazový buffer a červená a modrá složka využijí o 1 bit více než v 16-bitovém módu. Barevný mód určuje bit 13 registru Reg11h.

// set 24-bit interface void LCD_RGB24(void) { u16 r; r = Reg11h; r &= ~(1 << 13); if (r != Reg11h) { Reg11h = r; LCD_WriteReg(0x0011, r); } } ... analogicky LCD_RGB16(void)...

Před zápisem gafických dat je potřeba nastavit výstupní okno, kam se bude vykreslovat. Definuje se počáteční adresa ve videopaměti, počátek a konec okna a případně způsob adresování. Tímto způsobem lze snadno otáčet displej (ve 4 směrech), pouze nastavením hw registrů.

[code]// === set LCD write address
#define LCD_Addr(x,y) { LCD_WriteReg(0x4e, (x)); LCD_WriteReg(0x4f, (y)); }

// set address mode (hinc/vinc=horizontal/vertical increment, vfirst=change vertical first)
void LCD_SetAddrMode(bool hinc, bool vinc, bool vfirst)
{
u16 r;
r = Reg11h & ~((1<<5) | (1<<4) | (1<<3)); // ID1, ID0, AM
if (vinc) r |= (1<<5); // ID1
if (hinc) r |= (1<<4); // ID0
if (vfirst) r |= (1<<3); // AM
if (r != Reg11h)
{
Reg11h = r;
LCD_WriteReg(0x0011, r);
}
}

// set output window
void LCD_SetWindow(u16 x, u16 y, u16 w, u16 h)
{
switch (DispRot)
{
case DISP_ROT0:
LCD_SetAddrMode(TRUE, TRUE, FALSE);
LCD_WriteReg(0x44, ((x+w-1)<<8) | x);
LCD_WriteReg(0x45, y);
LCD_WriteReg(0x46, y+h-1);
LCD_Addr(x, y);
break;

… analogicky rotace 90, 180 a 270.[/code]

Je dobré začít vymazáním obdélníku jednou barvou, např. 16-bitovou.

[code]// display rectangle
void LCD_Rect(u16 x, u16 y, u16 w, u16 h, u16 color)
{
u32 i;

LCD_RGB16();		// set 16-bit interface

LCD_SetWindow(x, y, w, h); // set output window

LCD_index(0x22);	// budou se zapisovat data do GRAM
LCD_DataMode();		// select DATA mode
LCD_OutData(color); 	// output value
LCD_CS_ON();		// chip select ON

for (i=w*h; i>0; i--)
{
	LCD_WR_ON();
	LCD_WR_ON();		// prodlouzeni impulsu WR
	LCD_WR_OFF();
}

LCD_CS_OFF();		// chip select OFF

}[/code]

Při zobrazení obdélníku byla barva stejná, proto ji stačilo nastavit na výstup pouze jednou, před smyčkou. Při vykreslování obrázku je potřeba nastavovat grafická data uvnitř při každém průchodu smyčkou - data se načítají z ukazatele obrázku (v RGB nebo 16-bitovém módu). Pokud se vykresluje výřez, je třeba po každé lince posunout ukazatel dat na další linku, ale registry řadiče není třeba už nastavovat, řadič posune ukazatel sám na další linku v okně.