Tag Archives: grayscale

About the Sitronix ST7528 grayscale GLCD

Bitmap2LCD is a tool for programming small Graphic LCDs in embedded systems.

Bitmap2LCD V2.1b and upwards supports the Sitronix ST7528 grayscale GLCD

The Sitronix ST7528 is a 16-Grey Scale Dot Matrix LCD Controller/Driver

< Quote >

The ST7528 LCD controller does not address rows directly, but rather groups of 8 rows in pages. The LCD memory on the controller is organized into 13 8-bit pages and 160 four-bit column addresses.

There are commands to set the starting page address and column address for a write operation, but no commands to select a row address – you must determine what page the row you want to write is in and set the page address that includes that row. This also implies that if you want to write pixels on adjacent pages, you must address the first page and column(s), write the data, then increment the page address to write the pixels in the adjacent page.

The controller also happens to use what seems like a very bizarre way to load pixel data. Logically, once the address is set, you would write the 4-bit pixel data (or maybe write 2 pixels at a time with a single byte). However, since the addressing scheme addresses pages and not rows, this approach is not used.

Instead, one bit of data for the entire addressed column of pixels (8 vertical pixels) in the current page is written with each byte sent to the LCD. Since each pixel requires 4 bits of data to define the grayscale level, 4 bytes of data must be sent per column to fully define the bits. While this data is being clocked in, the “main” column address does not change. Only after the fourth bit is written to a column is the main column address pointer automatically incremented inside the LCD controller so the next 4 bytes of data sent to the LCD will write the bit data for the next column.

To be complete, we must comment that the “column address” that you send to the LCD controller is actually bits 9:2 of a larger column address inside the controller. The bottom two bits 1:0 are “internal column” address bits. When the 4 bytes of data are written to the LCD controller by the MCU, the internal column address bits increment after each byte write. After the fourth byte is sent, the internal bits will roll from b’11’ to b’00’ and subsequently increase bit 2 of the column address. As you can probably guess, if you do not write LCD data to the controller in groups of 4 bytes, than you will not have complete data for the pixels and the internal LCD addressing will be corrupt.

The implication of all this is that you cannot ever write a single pixel on this LCD. The smallest number of pixels that can be refreshed is a 1 column x 8 row line and it will always take a minimum of four bytes sent to the LCD controller from the MCU to properly set those pixels. If you really do only want to update one pixel in the 1×8 column, you must be sure to write the same data that is already present for the other 7 pixels so their information does not change. This is where keeping a local copy of all pixel data in the LCD RAM becomes essential as individual pixels can be changed in the local RAM as the application requires it, and pixel data for unchanged pixels will still be present for the LCD refresh…

< End of Quote >

Quote from this well written Application Note :  ST7528 Appnote

From Bitmap2LCD Version 3.0H

  • Enable the Special Mode (blue arrow) for ST7528 in the Output+Settings main menu
  • To check it out, just draw 8 pixels in height in the work canvas, in one of the gray colors to be found inside the color picker ( in this example the chosen color is 7 )  ( red arrow )
  • Export Work Canvas to data array 
  • Find your 8 pixels inside the data array, 4 x 0x77 , corresponding to the these 8 gray pixels ( green arrow )

When converting a picture into hex data for a graphic LCD of 160 x 100 pixels , you will get 8320 Bytes, in vertical slices of 8 pixels in height.  ( Normal Gray 4bpp Mode outputs slices of 2 pixels in height = 8000 bytes of data )


Before Bitmap2LCD Version 3.0H

Here’s the needed configuration of Bitmap2LCD for a data output for the ST7528 :

  • Enable the Special Mode (red Arrow) for ST7528 in the Output main menu
  • Select the correct data direction (blue arrow)
  • Enable the Special Mode ON/OFF Switch (green arrow)
  • Select 4bpp Grayscale Mode in the Mode main menu

When converting a picture into hex data for a graphic LCD of 160 x 100 pixels , you will get 8320 Bytes, in vertical slices of 8 pixels in height.  ( Normal 4bpp Mode outputs slices of 2 pixels in height = 8000 bytes of data )

Other special Modes for the following Sitronix LCD controllers are planed in future upgrades :

4-Gray Graphic : ST7541 , St7571

32-gray Graphic : ST7529 , ST7586

Grayscale GLCD controller support : 4,16 and 32 gray levels

Bitmap2LCD is a tool for programming small Graphic LCDs in embedded systems.

Since V2.3 and upwards, Bitmap2LCD supports the 4,16 and 32 level grayscale controllers. ( Newly implemented are the 4 and 32 gray levels capability )

Color images and pictures can be imported and converted to 4, 16 and 32 gray levels into the work canvas. The software tool then generates the pixel data array in the selected arrangment, 2, 4 or 5 bits per pixel.

Here’s a list of grayscale LCD controllers, featuring 4, 16 and 32 gray levels.


Grayscale LCD Controllers

4 Gray Levels (2bpp)


S6B0741 128×129 Samsung


KS0741 128×129 Samsung


HT1647 64×16 Holtek


ST7541 128×129 Sitronix


ST7571 128×129 Sitronix


ST7586S 384×160 Sitronix


UPD16686 128×128 NEC


UPD16498 128×128 NEC


UPD16488A 128×92 NEC


HD66750 128×128 Hitachi


HD66421 160×100 Hitachi


EM65100 69 x101 Elan Microelectronics Corp


NJU6680 128×128 New Japan Radio


NJU6682 160×132 New Japan Radio


RA8806 320X240 Raio Technology


16 Gray Levels (4bpp)


EM65101 128×160 Elan Microelectronics Corp


SSD1322 480×120 Solomon Systech


SSD1325 128×80 Solomon Systech


SSD1326 256×32 Solomon Systech


SSD1327 128×128 Solomon Systech


32 Gray Levels (5bpp)


ST7529 255×160 Sitronix


Bitmap to GLCD Hex file >> Output settings

Bitmap2LCD is a tool for programming small Graphic LCDs in embedded systems.

Go to the Main Settings (v2.5 +):

bitmap2lcd settings

From V2.5, the below settings can also be found on the file explorer window, outputs tab : there’s a button at the top right to hide or show this toolbar.

fig 1. Hex file output settings buttons [ Bitmap2LCD from V2.0 upwards ]


Bitmap2LCD is a universal programming tool for converting bitmaps/images to GLCD for most graphic LCD controllers. (Monochrome,Grayscale, and Color ->[Color from V2.0] )

The software converts the bitmap and generates a hexadecimal file according to the previously defined user settings.

Here’s a short description of the available settings :

The hexadecimal output format can be selected with a series of buttons located in the output panel (fig 1.)

Description of the settings:

  • The choice of 8 different vertical or horizontal pagings ( the buttons with the arrows ) , your choice depends of the GLCD controller which is built in your LCD module. ( Please refer to the GLCD controller datasheet )
  • Most significant bit is first or is last (Data bit 7) — or in other words the data endianness.
  • Byte nibble swap On/Off, for example for 16 gray level grayscale mode for Sitronix ST7528 controller compatibility. ( In the case of 2 pixel per data byte, 4 bit per pixel data, gray levels )
  • Negative or positive output setting
  • GLCD zero corner selection (Corner where the conversion starts)
  • Output File Header Editor , (A small script to configure Hex file header)
  • Enable/Disable of the Output Data for compression for monochrome GLCD.
  • Enable/Disable 6 or 8 bit Data byte wide output for T693C Controller

As the converted output can just contain a part of the display size, there are other selectable options (not on fig1.)

  • Enable/disable X,Y area coordinate data insertion in the Hex ouptut file
  • Enable/disable area size data insertion in the Hex output file

These configuration settings are saved when you quit the application and restored on application launch. These settings are also a part of the project specific configuration.

Find other available settings in this topic.




Color GLCD Displays

In color GLCDs, each individual pixel is divided into three cells, or subpixels, which are colored red (R), green (G), and blue (B).

In GLCDs, the most important thing in interfacing color GLCD is to know how color is defined to a given pixel. Available formats depends on the brand and type of GLCD controller built in the choosen module :

12 bit per pixel pixel format (12bpp)
RRRRGGGG  4 bits red and 4 bits green 1st pixel BBBBRRRR   4 bits blue 1st pixel and 4 bits red 2nd  pixel GGGGBBBB  4 bits  green and 4 bits blue 2nd pixel

8 bit per pixel pixel format (8bpp)
RRRGGGBB  3 bits red, 3 bits green and 2 bits blue

16 bit per pixel pixel format (16bpp)
RRRRRGGG  5 bits red and 3 bits green 1st pixel GGGBBBBB  3 bits red and 5 bits blue 1st pixel

The Bitmap2LCD programming tool supports these GLCD color formats from V2.0.