emWin driver GUIDRV_CompactColor_16
Supported hardware
Controllers
This driver works with the following display controllers:
- Ampire FSA506
- Epson S1D13742, S1D13743, S1D19122
- Himax HX8301, HX8312A, HX8325A, HX8340, HX8347, HX8352, HX8352B, HX8353
- Hitachi HD66766, HD66772, HD66789
- Ilitek ILI9161, ILI9220, ILI9320, ILI9325, ILI9326
- LG Electronics LGDP4531, LGDP4551
- MagnaChip D54E4PA7551
- Novatek NT39122, NT7573
- OriseTech SPFD5408, SPFD54124C, SPFD5414D, SPFD5420A
- Renesas R61505, R61509, R61516, R61580, R63401
- Samsung S6D0110A, S6D0117, S6D0129, S6D04H0
- Sharp LCY-A06003, LR38825
- Sitronix ST7628, ST7637, ST7712, ST7735, ST7787
- Solomon SSD1284, SSD1289, SSD1298, SSD1355, SSD1963, SSD2119
- Toshiba JBT6K71
Bits per pixel
Supported color depth is 16 bpp.
Interfaces
The driver supports 8-bit parallel, 16 bit parallel and 3 pin SPI interface. Default mode is 8-bit parallel.
Driver selection and configuration
To be able to use this driver the following macro definition needs to be added to the configuration file LCDConf.h:
#define LCD_USE_COMPACT_COLOR_16
After this define has been added the display driver assumes the driver specific configuration file
LCDConf_CompactColor_16.h in the configuration folder. All further compile time configuration macros
should be defined in this file. To create a driver device using the GUIDRV_CompactColor_16 for the
given display, e.g. the following command can be used:
GUI_DEVICE_CreateAndLink(GUIDRV_COMPACT_COLOR_16, GUICC_565, 0, 0);
Please refer to the emWin documentation to get more information about using the proper palette mode.
Display data RAM organization

The picture above shows the relation between the display memory and the SEG and COM lines of the LCD.
Additional RAM requirements
This LCD driver can be used with and without a display data cache, containing a complete copy of the contents
of the LCD data RAM. The amount of memory used by the cache is:
LCD_XSIZE * LCD_YSIZE * 2 bytes
Using a cache is only recommended if it is intended to use a lot of drawing operations using the XOR drawing
mode. A cache would avoid reading the display data in this case. Normally the use of a cache is not recommended.
The driver can be used with a write buffer used for drawing multiple pixels of the same color. If multiple pixels of
the same color should be drawn the driver first fills the buffer and then executes only one time the macro
LCD_WRITEM_A1 to transfer the data to the display controller. The default buffer size is 500 bytes.
Available configuration macros (compile time configuration)
Controller selection
To select the desired controller the macro LCD_CONTROLLER should be used in the configuration file
LCDConf_CompactColor_16.h. The following table shows the values to be used to select the appropriate controller:
| Number | Supported Controller |
|---|---|
| 66700 | Sharp LR38825 |
| 66701 | Ilitek ILI9326 OriseTech SPFD5420A Renesas R61509, R63401 |
| 66702 | Solomon SSD1284, SSD1289, SSD1298 |
| 66703 | Toshiba JBT6K71 |
| 66704 | Sharp LCY-A06003 |
| 66705 | Renesas R61505 Samsung S6D0129 |
| 66706 | MagnaChip D54E4PA7551 |
| 66707 | Himax HX8312 |
| 66708 | Ilitek ILI9320, ILI9325 LG Electronics LGDP4531, LGDP4551 OriseTech SPFD5408 Renesas R61505, R61580 |
| 66709 | Epson S1D19122 |
| 66710 | Novatek NT7573 |
| 66711 | Epson S1D13742, S1D13743 |
| 66712 | Himax HX8347, HX8352 |
| 66713 | Himax HX8340 |
| 66714 | Solomon SSD2119 |
| 66715 | Himax HX8352B |
| 66716 | Ampire FSA506 |
| 66717 | Sitronix ST7787 |
| 66766 | Hitachi HD66766 Ilitec ILI9161 Samsung S6D0110A |
| 66772 | Himax HX8301 Hitachi HD66772 Ilitec ILI9220 Samsung S6D0117 Sitronix ST7712 |
| 66789 | Hitachi HD66789 |
Display configuration
The following table shows the available configuration macros:
| Macro | Description |
|---|---|
| LCD_MIRROR_X | Activate to mirror X-axis. |
| LCD_MIRROR_Y | Activate to mirror Y-axis. |
| LCD_SWAP_XY | Activate to swap X- and Y-axis. |
Hardware access
The following table shows the available configuration macros which can be defined in this file for
configuring the hardware access:
| Macro | Description |
|---|---|
| LCD_NUM_DUMMY_READS | Number of required dummy reads if a read operation should be executed. The default value is 2. If using a serial interface the display controllers HD66766 and HD66772 need 5 dummy reads. Sharp LR38825 needs 3 dummy reads with a 8-bit bus. |
| LCD_REG01 | This macro is only required if a Himax HX8312A is used. Unfortunately the register 0x01 (Control register 1) contains orientation specific settings as well as common settings. So this macro should contain the contents of this register. |
| LCD_SERIAL_ID | With a serial 3 wire interface this macro defines the ID signal of the device ID code. It should be 0 (default) or 1. Please note: This macro is only used with the 3 wire protocoll for Hitachi HD66772, Samsung S6D0117, Himax HX8301 and Ilitek ILI9220. |
| LCD_USE_SERIAL_3PIN | This configuration macro has been implemented to support the 3 wire serial interface of the following controllers: Hitachi HD66772, Samsung S6D0117, Himax HX8301, Ilitek ILI9220. Should be set to 1 if the 3 wire serial interface is used. Default is 0. Please note: Do not use this macro with other display controllers! |
| LCD_USE_PARALLEL_16 | Should be set to 1 if the 16 bit parallel interface is used. Default is 0. |
| LCD_WRITE_BUFFER_SIZE | Defines the size of the write buffer. Using a write buffer increases the performance of the driver. If multiple pixels should be written with the same color, the driver first fills the buffer and then writes the contents of the buffer with one execution of the macro LCD_WRITEM_A1, instead of multiple macro executions. The default buffer size is 500 bytes. |
| LCD_WRITE_A0 | Write a byte to display controller with RS-line low. |
| LCD_WRITE_A1 | Write a byte to display controller with RS-line high. |
| LCD_READM_A1 | Read multiple bytes (8 bit parallel interface) or multiple words (16 bit parallel interface) from display controller with RS-line high. |
| LCD_WRITEM_A1 | Write multiple bytes (8 bit parallel interface) or multiple words (16 bit parallel interface) to display controller with RS-line high. |
| LCD_WRITEM_A0 | Write multiple bytes (8 bit parallel interface) or multiple words (16 bit parallel interface) to display controller with RS-line low. |
The driver initializes the ’Driver Output Mode’ and ’Entry Mode’ register itself. The user does not need to
initialize this registers in LCD_X_InitController().
Available configuraion routines (run-time configuration)
The following table lists the available run-time configuration routines:
| Routine | Description |
|---|---|
| LCD_SetSizeEx() | Changes the size of the visible area. |
Configuration example
The following shows how to select the driver and how it can be configured:
LCDConf.h
As explained above it should include the following for selecting the driver:
#define LCD_USE_COMPACT_COLOR_16
LCDConf_CompactColor_16.h
This file contains the display driver specific configuration and could look as the following:
// // General configuration of LCD // #define LCD_CONTROLLER 66709 // Renesas R61516 #define LCD_BITSPERPIXEL 16 #define LCD_SWAP_RB 1 #define LCD_USE_PARALLEL_16 1 #define LCD_MIRROR_Y 1 // // Indirect interface configuration // void LCD_X_Write01_16 (unsigned short c); void LCD_X_Write00_16 (unsigned short c); void LCD_X_WriteM01_16(unsigned short * pData, int NumWords); void LCD_X_WriteM00_16(unsigned short * pData, int NumWords); void LCD_X_ReadM01_16 (unsigned short * pData, int NumWords); #define LCD_WRITE_A1 (Word) LCD_X_Write01_16(Word) #define LCD_WRITE_A0 (Word) LCD_X_Write00_16(Word) #define LCD_WRITEM_A1(Word, NumWords) LCD_X_WriteM01_16(Word, NumWords) #define LCD_WRITEM_A0(Word, NumWords) LCD_X_WriteM00_16(Word, NumWords) #define LCD_READM_A1 (Word, NumWords) LCD_X_ReadM01_16 (Word, NumWords)
LCDConf.c
The following shows how to create a display driver device with this driver and how to configure it:
void LCD_X_Config(void) {
//
// Set display driver and color conversion
//
GUI_DEVICE_CreateAndLink(GUIDRV_COMPACT_COLOR_16, // Display driver
GUICC_M565, // Color conversion
0, 0);
//
// Display driver configuration
//
LCD_SetSizeEx(0, 240, 320); // Physical display size in pixels
}
GUIDRV_CompactColor_16
