/* Smooth Big Text with Hints v2 - see http://www.technoblogy.com/show?53BK David Johnson-Davies - www.technoblogy.com - 10th December 2024 For use with the Compact TFT Graphics Library - see http://www.technoblogy.com/show?2LMJ CC BY 4.0 Licensed under a Creative Commons Attribution 4.0 International license: http://creativecommons.org/licenses/by/4.0/ */ // Character set********************************************** const uint8_t CharMap[96][7] PROGMEM = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00 }, { 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, 0x00 }, { 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, 0x00 }, { 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, 0x00 }, { 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, 0x00 }, { 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x00 }, { 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00 }, { 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x00 }, { 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, 0x00 }, { 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00 }, { 0x00, 0x80, 0x70, 0x30, 0x00, 0x00, 0x00 }, { 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00 }, { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00 }, { 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00 }, { 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00 }, { 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00 }, { 0x72, 0x49, 0x49, 0x49, 0x46, 0x00, 0x00 }, { 0x21, 0x41, 0x49, 0x4D, 0x33, 0x5a, 0x00 }, // 3 { 0x18, 0x14, 0x12, 0x7F, 0x10, 0x5E, 0x00 }, // 4 { 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x00 }, { 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, 0x00 }, { 0x41, 0x21, 0x11, 0x09, 0x07, 0x00, 0x00 }, { 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00 }, { 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00 }, { 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00 }, { 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00 }, { 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, 0x00 }, { 0x02, 0x01, 0x59, 0x09, 0x06, 0x00, 0x00 }, { 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x87, 0x00 }, // @ { 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, 0x00 }, { 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00 }, { 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00 }, { 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00 }, { 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x00 }, { 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x00 }, { 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, 0x00 }, { 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00 }, { 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x00 }, { 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, 0x00 }, { 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00 }, { 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00 }, { 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x2E, 0x7E }, // M { 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x2C, 0x75 }, // N { 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00 }, { 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00 }, { 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x00 }, { 0x7F, 0x09, 0x19, 0x29, 0x46, 0x37, 0x00 }, // R { 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00 }, { 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, 0x00 }, { 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x00 }, { 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x00 }, { 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, 0x00 }, { 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x00 }, { 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x00 }, { 0x61, 0x51, 0x49, 0x45, 0x43, 0x00, 0x00 }, { 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, 0x00 }, { 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00 }, { 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x00 }, { 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x00 }, { 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00 }, { 0x00, 0x03, 0x07, 0x08, 0x00, 0x00, 0x00 }, { 0x20, 0x54, 0x54, 0x78, 0x40, 0x00, 0x00 }, { 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, 0x00 }, { 0x38, 0x44, 0x44, 0x44, 0x28, 0x00, 0x00 }, { 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, 0x00 }, { 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00 }, { 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, 0x00 }, { 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x8a, 0x00 }, // g { 0x7F, 0x08, 0x04, 0x04, 0x78, 0x27, 0x00 }, // h { 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, 0x00 }, { 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, 0x00 }, { 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00 }, { 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, 0x00 }, { 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, 0x00 }, { 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00 }, { 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00 }, { 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, 0x00 }, { 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, 0x00 }, { 0x7C, 0x08, 0x04, 0x04, 0x08, 0x27, 0x00 }, // r { 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, 0x00 }, { 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, 0x00 }, { 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, 0x00 }, { 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, 0x00 }, { 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, 0x00 }, { 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00 }, { 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, 0x00 }, { 0x44, 0x64, 0x54, 0x4C, 0x44, 0x14, 0x89 }, // z { 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x41, 0x36, 0x08, 0x00, 0x00, 0x00 }, { 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, 0x00 }, { 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00 }, // 127 = Cursor }; uint8_t scale = 2; bool smooth = true; bool hints = true; // Converts bit pattern abcdefgh into a0b0c0d0e0f0g0h uint16_t Stretch (uint16_t x) { x = (x & 0xF0)<<4 | (x & 0x0F); x = (x<<2 | x) & 0x3333; x = (x<<1 | x) & 0x5555; return x<<1 | x; } void WriteColumn (uint8_t bits) { uint16_t colour; digitalWrite(cs, LOW); for (uint8_t i=0; i<8; i++) { if (bits>>(7-i) & 1) colour = fore; else colour = back; SPI.transfer(colour>>8); SPI.transfer(colour & 0xFF); } digitalWrite(cs, HIGH); } void WriteColumns (uint16_t left, uint16_t right) { WriteColumn(left>>8); WriteColumn(left); WriteColumn(right>>8); WriteColumn(right); } void PlotChar (char c) { int colour; SendCommand2(CASET, yoff+ypos, yoff+ypos+8*scale-1); SendCommand2(RASET, xoff+xpos, xoff+xpos+6*scale-1); SendCommand(RAMWR); uint8_t col0 = pgm_read_byte(&CharMap[c-32][0]); uint16_t col0L, col0R, col1L, col1R; col0L = Stretch(col0); col0R = col0L; for (uint8_t col = 1 ; col < 5; col++) { uint8_t col1 = pgm_read_byte(&CharMap[c-32][col]); col1L = Stretch(col1); col1R = col1L; if (scale == 1) WriteColumn(col0); // Smoothing else { if (smooth) { for (int i=6; i>=0; i--) { for (int j=1; j<3; j++) { if (((col0>>i & 0b11) == (3-j)) && ((col1>>i & 0b11) == j)) { col0R = col0R | 1<<((i*2)+j); col1L = col1L | 1<<((i*2)+3-j); } } } } WriteColumns(col0L, col0R); col0L = col1L; col0R = col1R; } col0 = col1; } if (scale == 1) WriteColumn(col0); else { WriteColumns(col0L, col0R); if (hints) { uint8_t hint = pgm_read_byte(&CharMap[c-32][5]); if (hint) PlotPoint((hint>>4)+xpos, (hint & 0x0f)+ypos); hint = pgm_read_byte(&CharMap[c-32][6]); if (hint) PlotPoint((hint>>4)+xpos, (hint & 0x0f)+ypos); } } xpos = xpos + 6*scale; }