Fork me on GitHub

Drawing Text on OLED Chip SSD1306 Using FreeType2


In the previous post we had discussed the framebuffer object of the C library for performing graphics on the OLED screen SSD1306 using a Raspberry Pi.

In this blog post, we demonstrate how we have used FreeType2 to draw text on the screen using fonts that can be installed using your Raspbian distro packages. FreeType2 provides an easy way to render any type of supported font on the screen, and we encapsulate all of that in a single function call ssd1306_framebuffer_draw_text().

UPDATE: This code is OBSOLETE as of git tag 0.6 or commit 50e836f9299f61a3fe2901f794d2131ade7c23be. Please refer to the latest blog post on this topic.

The code in this post is as of git tag 0.51 or commit 294ffccc1004b35028406fc4281cef894f473d2a from Github.

DRAWING TEXT

To draw a font on a framebuffer, we chose to use FreeType2 as it is open source, and supports a variety of fonts. It also lends itself well to drawing the font directly to our framebuffer memory image.

Just by following the FreeType2 tutorial we were able to implement the ssd1306_framebuffer_draw_text() and the ssd1306_framebuffer_draw_text_extra() functions.

We have abstracted out the FreeType2 usage, so that if in the future we choose to change the dependency on FreeType2, we can without exposing the APIs of the library to idiosyncrasies of FreeType2.

The simplest way to draw a string of text at (x,y) coordinates is to use the ssd1306_framebuffer_draw_text() function, which will start drawing the text at (x,y) for the given font and font size, as shown below.

#include <ssd1306_graphics.h>

/* ... some initialization code ... */

/* create the framebuffer for a OLED screen 128x32 */
ssd1306_framebuffer_t *fbp = ssd1306_framebuffer_create(128, 32, NULL);

// draw ABCDeF with the default font and font size 4 at (x,y) of (32, 32)
ssd1306_framebuffer_draw_text(fbp, "ABCDeF", 0, 32, 32, SSD1306_FONT_DEFAULT, 4);

ssd1306_framebuffer_bitdump(fbp);

The framebuffer now looks like:

0000 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0001 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0002 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0003 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0004 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0005 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0006 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0007 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0008 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0009 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0010 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0011 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0012 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0013 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0014 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0015 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0016 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0017 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0018 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0019 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0020 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0021 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0022 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0023 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0024 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0025 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0026 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0027 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0028 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0029 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0030 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0031 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0032 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0033 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0034 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0035 ..|||||. ...||||| |....... ||||||.| ||||.... ........ ...||||| ||||.... ........ ........ ........ ........ ........ ........ ........ ........ 
0036 ..|||||. ...||||| |||...|| ||||||.| ||||||.. ........ ...||||| ||||.... ........ ........ ........ ........ ........ ........ ........ ........ 
0037 ....|||. ....||.. .||...|| ...|||.. |...|||. ........ ....||.. ..||.... ........ ........ ........ ........ ........ ........ ........ ........ 
0038 ...||.|| ....||.. ..|..||. ....||.. |....||| ...||||| ....||.. |.||.... ........ ........ ........ ........ ........ ........ ........ ........ 
0039 ...||.|| ....||.. .||..||. ........ |.....|| ..|||.|| |...||.| |....... ........ ........ ........ ........ ........ ........ ........ ........ 
003A ...||.|| ....|||| |||..||. ........ |.....|| .||....| ||..|||| |....... ........ ........ ........ ........ ........ ........ ........ ........ 
003B ..|||||| |...||.. .|||.||. ........ |.....|| .||||||| ||..||.| |....... ........ ........ ........ ........ ........ ........ ........ ........ 
003C ..|||||| |...||.. ..||.||. ........ |.....|| .||||||| ||..||.. |....... ........ ........ ........ ........ ........ ........ ........ ........ 
003D .||..... ||..||.. ..||.||| ....||.. |....||. .|||.... ....||.. ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003E |||||..| |||||||| ||||..|| ||||||.| |||||||. ..|||.|| ||.||||| ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003F |||||..| |||||||| |||....| |||||..| ||||||.. ...||||| |..||||| |....... ........ ........ ........ ........ ........ ........ ........ ........ 

As you can see above the default font (BitStream Vera) gets rendered onto the framebuffer as expected, and in the same way gets displayed on screen on the OLED device as seen in the image below.

Drawing Text on the SSD1306 OLED Screen

Figure 1. Drawing aligned text on screen using Bitstream Vera font

Here is an example of drawing a large font size on the screen.

Drawing large font on the SSD1306 OLED Screen

Figure 2. Drawing a large font size on screen using the Bitstream Vera font

SUPPORTED FONT FACES

By default, the libssd1306 library supports the following fonts, and also allows the user to load their own font file. The package requirements for the default fonts require the user to install fonts-freefont-ttf and ttf-bitstream-vera. If the user wants to have access to Microsoft®’s TrueType fonts, they can install ttf-mscorefonts-installer using the package manager and get access to Microsoft® specific fonts like Arial and Comic Sans.

We shall show you examples of using the custom fonts below. Using the ssd1306_fontface_t enum type allows the user to not have to know where the font file is located, since we already know that as part of the installation packages. So we currently hard-code these locations in and map them to an enum. If the user wants to load their own font file they can use the SSD1306_FONT_CUSTOM option and the ssd1306_framebuffer_draw_text_extra() function which accepts custom options for drawing the text, including the font file location.

The default font paths are provided in the ssd1306_graphics.h header file.

If the user wants to draw using the Microsoft® TrueType font Comic Sans, they can use the following code example:

#include <ssd1306_graphics.h>
/* ... some initialization ... */

/* create the framebuffer for a OLED screen 128x32 */
ssd1306_framebuffer_t *fbp = ssd1306_framebuffer_create(128, 32, NULL);

// setup the options
ssd1306_graphics_options_t opts;
opts.type = SSD1306_OPT_FONT_FILE;
opts.value.font_file = "/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf";
// call the draw_text_extra() function which accepts options
ssd1306_framebuffer_draw_text_extra(fbp. "ABCDeF", 0, 32, 32, SSD1306_FONT_CUSTOM, 4, &opts, 1);

The only difference between the ssd1306_framebuffer_draw_text() and ssd1306_framebuffer_draw_text_extra() functions is that the latter accepts custom options for font files, rotation of fonts and rotation of pixels.

ROTATING THE FONT

In some rare cases, we may want to draw a text at an angle such as for displaying logos, or just rotating a text on screen by say 30°. We can do that with the SSD1306_OPT_ROTATE_FONT option and provide the rotation angle in the rotation_degrees field. This uses the font transformation functions provided by FreeType2 internally, and is highly accurate.

Below is an example that uses both the custom font file option for Comic Sans and rotates it by 30°, as seen in the framebuffer output.

#include <ssd1306_graphics.h>
/* ... some initialization ... */

/* create the framebuffer for a OLED screen 128x32 */
ssd1306_framebuffer_t *fbp = ssd1306_framebuffer_create(128, 32, NULL);

// setup the options
ssd1306_graphics_options_t opts[2];
opts[0].type = SSD1306_OPT_FONT_FILE;
opts[0].value.font_file = "/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf";
opts[1].type = SSD1306_OPT_ROTATE_FONT;
opts[1].value.rotation_degrees = 30;
// call the draw_text_extra() function which accepts options
ssd1306_framebuffer_draw_text_extra(fbp. "ABCDeF", 0, 32, 32, SSD1306_FONT_CUSTOM, 4, opts, 2);
// dump the framebuffer to screen
ssd1306_framebuffer_bitdump(fbp);
0000 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0001 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0002 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0003 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0004 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0005 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0006 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0007 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0008 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0009 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
000F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0010 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0011 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0012 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0013 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0014 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0015 ........ ........ ........ ........ ........ ......|| |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0016 ........ ........ ........ ........ ........ ....|||| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0017 ........ ........ ........ ........ ........ ...||||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0018 ........ ........ ........ ........ ........ ..|||||. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0019 ........ ........ ........ ........ ........ ..||||.. .|||.... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001A ........ ........ ........ ........ ........ ...|||.| ||||.... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001B ........ ........ ........ ........ ........ ...||||| ||||.... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001C ........ ........ ........ ........ ........ ....|||| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001D ........ ........ ........ ........ ........ ....|||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001E ........ ........ ........ ........ ......|| ||...||| ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
001F ........ ........ ........ ........ .....||| ||...||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0020 ........ ........ ........ ........ .....||| ||....|| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0021 ........ ........ ........ ....|||| |....||| ||.....| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0022 ........ ........ ........ |||||||| |||..||. ||.....| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0023 ........ ........ ........ |||||||| ||||.||| ||...... ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0024 ........ ........ ....|||| ||||.... .||||||| |.|||||. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0025 ........ ........ ...||||| .|||.... ..|||.|| ||||||.. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0026 ........ ........ ..|||||| .||||... ...||.|| |||||... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0027 ........ ........ ..|||... ..|||... ...||... |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0028 ........ ........ ..|||... ...|||.. ..|||... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0029 ........ ........ .|||.... ...|||.. .||||... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002A ........ ........ .|||.... ....|||| |||||... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002B ........ ||||||.. .|||.... ....|||| ||||.... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002C .......| |||||||. .|||.... .....||| |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002D ......|| |||||||. .|||.... .....||| ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002E ......|| |...|||. ..|||... ||||.... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002F .......| ||..|||. ..||||.| |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0030 |||....| ||.||||| |..||||| |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0031 ||||.... |||||||| |..||||| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0032 ||||.... |||||||. |.....|| ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0033 |||||... .||||..| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0034 ||||||.. .|||..|| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0035 ||.|||.. ..|||||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0036 ||||||.. ..|||||| |....... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0037 ||||||.. ...||||. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0038 |||||... ...|||.. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0039 ||||...| ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003A |||..... ||...... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003B |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003C |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003D |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003E |||..... ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 

All the code snippets can be found in the examples/fb_graphics.c file.

ROTATING PIXELS

As shown in the previous post, we may want to rotate an image on the screen by using the pixel rotation function. We can absolutely use that feature for drawing text at different locations by rotating not just the font, but also the pixels.

Below is an example that uses both the custom font file option for Comic Sans and rotates it by 30°, and then rotates the drawing by 180° as seen in the framebuffer output.

Note that the SSD1306_OPT_ROTATE_PIXEL option only accepts multiples of 90° in the rotation_degrees field. Any other value will get ignored, and an error statement printed to the log.

#include <ssd1306_graphics.h>
/* ... some initialization ... */

/* create the framebuffer for a OLED screen 128x32 */
ssd1306_framebuffer_t *fbp = ssd1306_framebuffer_create(128, 32, NULL);

// setup the options
ssd1306_graphics_options_t opts[2];
opts[0].type = SSD1306_OPT_ROTATE_FONT;
opts[0].value.rotation_degrees = 30;
opts[1].type = SSD1306_OPT_ROTATE_PIXEL;
opts[1].value.rotation_degrees = 30;
// call the draw_text_extra() function which accepts options
ssd1306_framebuffer_draw_text_extra(fbp. "ABCDeF", 0, 0, 0, SSD1306_FONT_DEFAULT, 4, opts, 2);
// dump the framebuffer to screen
ssd1306_framebuffer_bitdump(fbp);

If you scroll to the right of this buffer dump, you can see the flip of the rotated font string.

0000 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ......|| 
0001 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .....||| 
0002 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ....|||| 
0003 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|....|| 
0004 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |||...|| 
0005 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ....|||| 
0006 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ....|||. ...||||| 
0007 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ..||||.. ...||..| 
0008 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|||.||. ...|||.| 
0009 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |||..||. ....|||| 
000A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |.....|| .....||| 
000B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |...|||| |.....|| 
000C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|||||.. .||||||| |....... 
000D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |||||||. .||||..| |||..... 
000E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |....||| ..||.... |||..... 
000F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ......|| |.||..|| ||...... 
0010 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ...|||.. .......| |..||||| ........ 
0011 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .||||... .......| |....... ........ 
0012 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |||.||.. .......| |....... ........ 
0013 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| ||..|||. .......| |....... ........ 
0014 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |....||. ..|...|| |....... ........ 
0015 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| |....||| ..|||||| ........ ........ 
0016 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |||||..| |.....|| ..||||.. ........ ........ 
0017 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ......|| ||.|||.| |......| ||.|.... ........ ........ 
0018 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ......|| ...||||. ||....|| ||...... ........ ........ 
0019 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ..|||||. |||||||| |....... ........ ........ 
001A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|||.... .|||.||. ..|||||. ........ ........ ........ 
001B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ||||.... .|..|||. ........ ........ ........ ........ 
001C ........ ........ ........ ........ ........ ........ ........ ........ ........ .......| ||||.... .|.|||.. ........ ........ ........ ........ 
001D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ...||... .||||... ........ ........ ........ ........ 
001E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ...||... ........ ........ ........ ........ ........ 
001F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ||||||.. ........ ........ ........ ........ ........ 
0020 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .||||||. ........ ........ ........ ........ ........ 
0021 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .||..||| |....... ........ ........ ........ ........ 
0022 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .....||| |....... ........ ........ ........ ........ 
0023 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ |..||||. ........ ........ ........ ........ ........ 
0024 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ||||||.. ........ ........ ........ ........ ........ 
0025 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ||||.... ........ ........ ........ ........ ........ 
0026 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .|...... ........ ........ ........ ........ ........ 
0027 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0028 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0029 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
002F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0030 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0031 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0032 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0033 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0034 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0035 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0036 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0037 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0038 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
0039 ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003A ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003B ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003C ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003D ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003E ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 
003F ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ 

Here is an example of using Comic Sans and rotating the text.

Drawing Text on the SSD1306 OLED Screen

Figure 3. Drawing Comic Sans rotated text on screen