Topics

► Games

► Sound & Music

► Watches & Clocks

► GPS

► Power Supplies

► Computers

► Graphics

► Thermometers

► Wearables

► Test Equipment

► Tutorials

► Libraries

► PCB-Based Projects

By processor

AVR ATtiny

► ATtiny10

► ATtiny2313

► ATtiny84

► ATtiny841

► ATtiny85

► ATtiny861

► ATtiny88

AVR ATmega

► ATmega328

► ATmega1284

AVR 0-series and 1-series

► ATmega4809

► ATtiny1604

► ATtiny1614

► ATtiny3216

► ATtiny3227

► ATtiny402

► ATtiny404

► ATtiny414

► ATtiny814

AVR DA/DB-series

► AVR128DA28

► AVR128DA32

► AVR128DA48

► AVR128DB28

ARM

► ATSAMD21

► RP2040

► RA4M1

About me

  • About me
  • Twitter
  • Mastodon

Feeds

RSS feed

Big Text for Little Display

11th May 2017

This article describes a small addition to my ATtiny85 Graphics Display to allow you to plot double-sized characters, alongside the other text and graphics supported by the previous version. This is useful if you're using the display for a digital readout where the values need to be clearly visible:

BigText.jpg

Displaying double-sized characters on the 64x48 OLED graphics display.

With double-sized characters the display allows 3 lines of five characters per line.

Bitmap doubling

The key routine is Stretch(), which takes an 8-bit bit pattern, and stretches it to 16 bits with each bit repeated twice:

int Stretch (int x) {
  x = (x & 0xF0)<<4 | (x & 0x0F);
  x = (x<<2 | x) & 0x3333;
  x = (x<<1 | x) & 0x5555;
  return x | x<<1;
}

This nice algorithm is from Hacker's Delight [1]. It works as follows:

Starting from the bit pattern abcdefgh, successive lines of the routine generate:

0000abcd0000efgh
00ab00cd00ef00gh
0a0b0c0d0e0f0g0h
aabbccddeeffgghh

The routine to plot the double-size characters calls this for each column of the dot-matrix character definition, and then plots it twice horizontally:

void PlotBigText(int x, int y, PGM_P s) {
  int p = (int)s;
  int page = (47 - y - yOrigin)>>3;
  while (1) {
    char c = pgm_read_byte(p++);
    if (c == 0) return;
    for (uint8_t col = 0 ; col < 6; col++) {
      int bits = Stretch(pgm_read_byte(&CharMap[c-32][col]));
      for (int i=2; i--;) {
        Buffer[(page-1)*64 + x + xOrigin] = bits;
        Buffer[page*64 + x + xOrigin] = bits>>8;
        x++;
      }
    }
  }
}

I've also updated the Graphics Display program to use the PGM_P macro to define strings in program memory; to specify a string you now specify it using the PSTR macro, so the demo program to give the display shown above is:

void DoubleSizeCharacters () {
  xOrigin = 0; yOrigin = 0;
  ClearBuffer();
  PlotBigText(0, 32, PSTR("4.98V"));
  PlotBigText(0, 16, PSTR("0.15A"));
  PlotText(0, 0, PSTR("10:27:59am"));
  DisplayBuffer();
}

Here's the whole updated ATtiny85 Graphics Display program with the examples: ATtiny85 Graphics Display with Big Text Program v2.

Update

9th May 2018: Corrected the declaration of the character map from uint32_t to uint8_t.

3rd December 2018: Removed unnecessary initialisations for the display, since they were the defaults.


  1. ^ Warren Jr., Henry S. (2013) [2002]. Hacker's Delight (2 ed.). Addison Wesley - Pearson Education, Inc., p. 139-141.

blog comments powered by Disqus