The code from LCDWIKI for ST7796S TFT:
// Sets the LCD address window
void LCDWIKI_SPI::Set_Addr_Window(int16_t x1, int16_t y1, int16_t x2, int16_t y2)
{
CS_ACTIVE;
if((lcd_driver == ID_932X) || (lcd_driver == ID_9225))
{
// Values passed are in current (possibly rotated) coordinate
// system. 932X requires hardware-native coords regardless of
// MADCTL, so rotate inputs as needed. The address counter is
// set to the top-left corner -- although fill operations can be
// done in any direction, the current screen rotation is applied
// because some users find it disconcerting when a fill does not
// occur top-to-bottom.
int x, y, t;
switch(rotation)
{
default:
x = x1;
y = y1;
break;
case 1:
t = y1;
y1 = x1;
x1 = WIDTH - 1 - y2;
y2 = x2;
x2 = WIDTH - 1 - t;
x = x2;
y = y1;
break;
case 2:
t = x1;
x1 = WIDTH - 1 - x2;
x2 = WIDTH - 1 - t;
t = y1;
y1 = HEIGHT - 1 - y2;
y2 = HEIGHT - 1 - t;
x = x2;
y = y2;
break;
case 3:
t = x1;
x1 = y1;
y1 = HEIGHT - 1 - x2;
x2 = y2;
y2 = HEIGHT - 1 - t;
x = x1;
y = y2;
break;
}
if(lcd_driver == ID_932X)
{
writeCmdData16(ILI932X_HOR_START_AD, x1); // Set address window
writeCmdData16(ILI932X_HOR_END_AD, x2);
writeCmdData16(ILI932X_VER_START_AD, y1);
writeCmdData16(ILI932X_VER_END_AD, y2);
writeCmdData16(ILI932X_GRAM_HOR_AD, x ); // Set address counter to top left
writeCmdData16(ILI932X_GRAM_VER_AD, y );
}
else if(lcd_driver == ID_9225)
{
writeCmdData16(0x36, x2);
writeCmdData16(0x37, x1);
writeCmdData16(0x38, y2);
writeCmdData16(0x39, y1);
writeCmdData16(XC, x);
writeCmdData16(YC, y);
writeCmd8(CC);
}
}
else if(lcd_driver == ID_7575)
{
writeCmdData8(HX8347G_COLADDRSTART_HI, x1>>8);
writeCmdData8(HX8347G_COLADDRSTART_LO, x1);
writeCmdData8(HX8347G_ROWADDRSTART_HI, y1>>8);
writeCmdData8(HX8347G_ROWADDRSTART_LO, y1);
writeCmdData8(HX8347G_COLADDREND_HI, x2>>8);
writeCmdData8(HX8347G_COLADDREND_LO, x2);
writeCmdData8(HX8347G_ROWADDREND_HI, y2>>8);
writeCmdData8(HX8347G_ROWADDREND_LO, y2);
}
else if(lcd_driver == ID_1283A)
{
int16_t t1, t2;
switch(rotation)
{
case 0:
case 2:
t1=x1;
t2=x2;
x1=y1+2;
x2=y2+2;
y1=t1+2;
y2=t2+2;
break;
case 1:
case 3:
y1=y1+2;
y2=y2+2;
break;
}
writeCmd8(XC);
writeData8(x2);
writeData8(x1);
writeCmd8(YC);
writeData8(y2);
writeData8(y1);
writeCmd8(0x21);
writeData8(x1);
writeData8(y1);
writeCmd8(CC);
}
else if(lcd_driver == ID_1106)
{
return;
}
else if(lcd_driver == ID_7735_128)
{
uint8_t x_buf[] = {((uint8_t)(x1+xoffset)>>8), ((uint8_t)(x1+xoffset)&0xFF), ((uint8_t)(x2+xoffset)>>8), ((uint8_t)(x2+xoffset)&0xFF)};
uint8_t y_buf[] = {(y1+yoffset)>>8, (y1+yoffset)&0xFF, (y2+yoffset)>>8, (y2+yoffset)&0xFF};
Push_Command(XC, x_buf, 4);
Push_Command(YC, y_buf, 4);
}
else
{
uint8_t x_buf[] = {x1>>8, x1&0xFF, x2>>8, x2&0xFF};
uint8_t y_buf[] = {y1>>8, y1&0xFF, y2>>8, y2&0xFF};
Push_Command(XC, x_buf, 4);
Push_Command(YC, y_buf, 4);
}
CS_IDLE;
}
Warning messages:
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp: In member function 'virtual void LCDWIKI_SPI::Set_Addr_Window(int16_t, int16_t, int16_t, int16_t)':
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:703:44: warning: narrowing conversion of '(((int)((uint8_t)(x1 + ((int)((LCDWIKI_SPI*)this)->LCDWIKI_SPI::xoffset)))) >> 8)' from 'int' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t x_buf[] = {((uint8_t)(x1+xoffset)>>8), ((uint8_t)(x1+xoffset)&0xFF), ((uint8_t)(x2+xoffset)>>8), ((uint8_t)(x2+xoffset)&0xFF)};
~~~~~~~~~~~~~~~~~~~~~~^~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:703:72: warning: narrowing conversion of '(int)(((unsigned char)((int)((uint8_t)(x1 + ((int)((LCDWIKI_SPI*)this)->LCDWIKI_SPI::xoffset))))) & 255)' from 'int' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t x_buf[] = {((uint8_t)(x1+xoffset)>>8), ((uint8_t)(x1+xoffset)&0xFF), ((uint8_t)(x2+xoffset)>>8), ((uint8_t)(x2+xoffset)&0xFF)};
~~~~~~~~~~~~~~~~~~~~~~^~~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:703:102: warning: narrowing conversion of '(((int)((uint8_t)(x2 + ((int)((LCDWIKI_SPI*)this)->LCDWIKI_SPI::xoffset)))) >> 8)' from 'int' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t x_buf[] = {((uint8_t)(x1+xoffset)>>8), ((uint8_t)(x1+xoffset)&0xFF), ((uint8_t)(x2+xoffset)>>8), ((uint8_t)(x2+xoffset)&0xFF)};
~~~~~~~~~~~~~~~~~~~~~~^~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:703:130: warning: narrowing conversion of '(int)(((unsigned char)((int)((uint8_t)(x2 + ((int)((LCDWIKI_SPI*)this)->LCDWIKI_SPI::xoffset))))) & 255)' from 'int' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t x_buf[] = {((uint8_t)(x1+xoffset)>>8), ((uint8_t)(x1+xoffset)&0xFF), ((uint8_t)(x2+xoffset)>>8), ((uint8_t)(x2+xoffset)&0xFF)};
~~~~~~~~~~~~~~~~~~~~~~^~~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:704:34: warning: narrowing conversion of '((y1 + ((int)((LCDWIKI_SPI*)this)->LCDWIKI_SPI::yoffset)) >> 8)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t y_buf[] = {(y1+yoffset)>>8, (y1+yoffset)&0xFF, (y2+yoffset)>>8, (y2+yoffset)&0xFF};
~~~~~~~~~~~~^~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:704:51: warning: narrowing conversion of '((y1 + ((int)((LCDWIKI_SPI*)this)->LCDWIKI_SPI::yoffset)) & 255)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t y_buf[] = {(y1+yoffset)>>8, (y1+yoffset)&0xFF, (y2+yoffset)>>8, (y2+yoffset)&0xFF};
~~~~~~~~~~~~^~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:704:70: warning: narrowing conversion of '((y2 + ((int)((LCDWIKI_SPI*)this)->LCDWIKI_SPI::yoffset)) >> 8)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t y_buf[] = {(y1+yoffset)>>8, (y1+yoffset)&0xFF, (y2+yoffset)>>8, (y2+yoffset)&0xFF};
~~~~~~~~~~~~^~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:704:87: warning: narrowing conversion of '((y2 + ((int)((LCDWIKI_SPI*)this)->LCDWIKI_SPI::yoffset)) & 255)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t y_buf[] = {(y1+yoffset)>>8, (y1+yoffset)&0xFF, (y2+yoffset)>>8, (y2+yoffset)&0xFF};
~~~~~~~~~~~~^~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:710:24: warning: narrowing conversion of '(x1 >> 8)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t x_buf[] = {x1>>8, x1&0xFF, x2>>8, x2&0xFF};
~~^~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:710:31: warning: narrowing conversion of '(x1 & 255)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t x_buf[] = {x1>>8, x1&0xFF, x2>>8, x2&0xFF};
~~^~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:710:40: warning: narrowing conversion of '(x2 >> 8)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t x_buf[] = {x1>>8, x1&0xFF, x2>>8, x2&0xFF};
~~^~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:710:47: warning: narrowing conversion of '(x2 & 255)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t x_buf[] = {x1>>8, x1&0xFF, x2>>8, x2&0xFF};
~~^~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:711:24: warning: narrowing conversion of '(y1 >> 8)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t y_buf[] = {y1>>8, y1&0xFF, y2>>8, y2&0xFF};
~~^~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:711:31: warning: narrowing conversion of '(y1 & 255)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t y_buf[] = {y1>>8, y1&0xFF, y2>>8, y2&0xFF};
~~^~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:711:40: warning: narrowing conversion of '(y2 >> 8)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t y_buf[] = {y1>>8, y1&0xFF, y2>>8, y2&0xFF};
~~^~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:711:47: warning: narrowing conversion of '(y2 & 255)' from 'int16_t {aka int}' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]
uint8_t y_buf[] = {y1>>8, y1&0xFF, y2>>8, y2&0xFF};
~~^~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp: In member function 'uint16_t LCDWIKI_SPI::Read_ID()':
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:912:31: warning: left shift count >= width of type [-Wshift-count-overflow]
ret = (Read_Reg(0xD0, 0) << 16) | Read_Reg(0xD0, 1);
^~
In file included from D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:24:0:
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp: In member function 'void LCDWIKI_SPI::Set_Rotation(uint8_t)':
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\mcu_spi_magic.h:5:30: warning: large integer implicitly truncated to unsigned type [-Woverflow]
#define write8(d) Spi_Write(d)
^
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\mcu_spi_magic.h:63:91: note: in expansion of macro 'write8'
#define writeCmdData16(a, d) CD_COMMAND; write8(a>>8); write8(a); CD_DATA; write8(d>>8); write8(d)
^~~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:1223:5: note: in expansion of macro 'writeCmdData16'
writeCmdData16(0x01, 0x2183);
^~~~~~~~~~~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\mcu_spi_magic.h:5:30: warning: large integer implicitly truncated to unsigned type [-Woverflow]
#define write8(d) Spi_Write(d)
^
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\mcu_spi_magic.h:63:91: note: in expansion of macro 'write8'
#define writeCmdData16(a, d) CD_COMMAND; write8(a>>8); write8(a); CD_DATA; write8(d>>8); write8(d)
^~~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:1224:5: note: in expansion of macro 'writeCmdData16'
writeCmdData16(0x03, 0x6830);
^~~~~~~~~~~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\mcu_spi_magic.h:5:30: warning: large integer implicitly truncated to unsigned type [-Woverflow]
#define write8(d) Spi_Write(d)
^
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\mcu_spi_magic.h:63:91: note: in expansion of macro 'write8'
#define writeCmdData16(a, d) CD_COMMAND; write8(a>>8); write8(a); CD_DATA; write8(d>>8); write8(d)
^~~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:1228:5: note: in expansion of macro 'writeCmdData16'
writeCmdData16(0x01, 0x2283);
^~~~~~~~~~~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\mcu_spi_magic.h:5:30: warning: large integer implicitly truncated to unsigned type [-Woverflow]
#define write8(d) Spi_Write(d)
^
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\mcu_spi_magic.h:63:91: note: in expansion of macro 'write8'
#define writeCmdData16(a, d) CD_COMMAND; write8(a>>8); write8(a); CD_DATA; write8(d>>8); write8(d)
^~~~~~
D:\Program_Files\Arduino\libraries\LCDWIKI_SPI\LCDWIKI_SPI.cpp:1229:5: note: in expansion of macro 'writeCmdData16'
writeCmdData16(0x03, 0x6838);
^~~~~~~~~~~~~~
Sketch uses 18100 bytes (56%) of program storage space. Maximum is 32256 bytes.
Global variables use 1475 bytes (72%) of dynamic memory, leaving 573 bytes for local variables. Maximum is 2048 bytes.