Uses the same fonts as the SPI_TFT_ILI9341 Library (I have many, and a html/php font editor for that)

Committer:
JackB
Date:
Wed Nov 23 09:39:54 2016 +0000
Revision:
3:41e8d7dc279a
Parent:
2:e213811335ac
Child:
4:44a66bd8c16c
Some code optimization

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackB 0:cc1fb45bc3ad 1 /*
JackB 0:cc1fb45bc3ad 2 **************** ******************
JackB 0:cc1fb45bc3ad 3
JackB 0:cc1fb45bc3ad 4 Ported to mbed platform
JackB 0:cc1fb45bc3ad 5 by Arman Safikhani 31 - 08-2015
JackB 0:cc1fb45bc3ad 6
JackB 0:cc1fb45bc3ad 7 Jack: Many thanks Arman!
JackB 0:cc1fb45bc3ad 8
JackB 0:cc1fb45bc3ad 9 Changed:
JackB 0:cc1fb45bc3ad 10 by Jack Berkhout 23-11-2016
JackB 1:8e447a4c8995 11 - uses the same fonts as the SPI_TFT_ILI9341 Library (I have many, and a html/php font editor for that)
JackB 0:cc1fb45bc3ad 12 - some code removed, some added, some changed
JackB 0:cc1fb45bc3ad 13 - the led backlight is using a PWM output, so it can be adjusted (0.0f = off - 1.0f = on)
JackB 0:cc1fb45bc3ad 14 - added formatted printf
JackB 0:cc1fb45bc3ad 15 - added claim as standard output on stream
JackB 2:e213811335ac 16 - Orientation definitions are now related to the SD card slot location (front view)
JackB 0:cc1fb45bc3ad 17
JackB 0:cc1fb45bc3ad 18 * *************** ******************
JackB 0:cc1fb45bc3ad 19 */
JackB 0:cc1fb45bc3ad 20
JackB 0:cc1fb45bc3ad 21 #include "SPI_TFT_ILI9225.h"
JackB 0:cc1fb45bc3ad 22 #define bitRead(value, bit) (((value) >> (bit)) & 0x01)
JackB 0:cc1fb45bc3ad 23
JackB 0:cc1fb45bc3ad 24 int font_color, x_font, y_font;
JackB 0:cc1fb45bc3ad 25 char highlight, fa_num;
JackB 0:cc1fb45bc3ad 26 int effect = 0, italic = 0;
JackB 0:cc1fb45bc3ad 27 unsigned int highlight_color;
JackB 0:cc1fb45bc3ad 28 /* Global Variables */
JackB 0:cc1fb45bc3ad 29 int x_text = 0, y_text = 0;
JackB 0:cc1fb45bc3ad 30 int x_base = 0;
JackB 0:cc1fb45bc3ad 31
JackB 0:cc1fb45bc3ad 32 // Constructor when using software SPI. All output pins are configurable.
JackB 0:cc1fb45bc3ad 33 TFT_22_ILI9225::TFT_22_ILI9225(PinName sdi, PinName clk, PinName cs, PinName rs, PinName rst, PinName led, const char *name) :
JackB 0:cc1fb45bc3ad 34 spi(sdi, NC, clk), _cs(cs), _rs(rs), _rst(rst), _led(led), Stream(name)
JackB 0:cc1fb45bc3ad 35 {
JackB 0:cc1fb45bc3ad 36 spi.frequency(24000000);
JackB 0:cc1fb45bc3ad 37 spi.format(8, 0);
JackB 0:cc1fb45bc3ad 38
JackB 0:cc1fb45bc3ad 39 // PWM output to control backlight
JackB 0:cc1fb45bc3ad 40 _led.period_ms(10);
JackB 0:cc1fb45bc3ad 41
JackB 0:cc1fb45bc3ad 42 // --- claim ---
JackB 0:cc1fb45bc3ad 43 _row = 0;
JackB 0:cc1fb45bc3ad 44 _column = 0;
JackB 0:cc1fb45bc3ad 45 if (name == NULL) {
JackB 0:cc1fb45bc3ad 46 _path = NULL;
JackB 0:cc1fb45bc3ad 47 } else {
JackB 0:cc1fb45bc3ad 48 _path = new char[strlen(name) + 2];
JackB 0:cc1fb45bc3ad 49 sprintf(_path, "/%s", name);
JackB 0:cc1fb45bc3ad 50 }
JackB 0:cc1fb45bc3ad 51 // --- /claim ---
JackB 0:cc1fb45bc3ad 52
JackB 0:cc1fb45bc3ad 53 init();
JackB 0:cc1fb45bc3ad 54 }
JackB 0:cc1fb45bc3ad 55
JackB 0:cc1fb45bc3ad 56 bool TFT_22_ILI9225::claim (FILE *stream) {
JackB 0:cc1fb45bc3ad 57 if ( _path == NULL) {
JackB 0:cc1fb45bc3ad 58 fprintf(stderr, "claim requires a name to be given in the instantioator of the TextDisplay instance!\r\n");
JackB 0:cc1fb45bc3ad 59 return false;
JackB 0:cc1fb45bc3ad 60 }
JackB 0:cc1fb45bc3ad 61 if (freopen(_path, "w", stream) == NULL) {
JackB 0:cc1fb45bc3ad 62 // Failed, should not happen
JackB 0:cc1fb45bc3ad 63 return false;
JackB 0:cc1fb45bc3ad 64 }
JackB 0:cc1fb45bc3ad 65 // make sure we use line buffering
JackB 0:cc1fb45bc3ad 66 setvbuf(stdout, NULL, _IOLBF, ILI9225_CHARS_PER_LINE);
JackB 0:cc1fb45bc3ad 67 return true;
JackB 0:cc1fb45bc3ad 68 }
JackB 0:cc1fb45bc3ad 69
JackB 0:cc1fb45bc3ad 70 void TFT_22_ILI9225::_orientCoordinates(uint16_t &x1, uint16_t &y1) {
JackB 0:cc1fb45bc3ad 71
JackB 0:cc1fb45bc3ad 72 switch (_orientation) {
JackB 0:cc1fb45bc3ad 73 case 0: // ok
JackB 0:cc1fb45bc3ad 74 break;
JackB 0:cc1fb45bc3ad 75 case 1: // ok
JackB 0:cc1fb45bc3ad 76 y1 = _maxY - y1 - 1;
JackB 0:cc1fb45bc3ad 77 _swap(x1, y1);
JackB 0:cc1fb45bc3ad 78 break;
JackB 0:cc1fb45bc3ad 79 case 2: // ok
JackB 0:cc1fb45bc3ad 80 x1 = _maxX - x1 - 1;
JackB 0:cc1fb45bc3ad 81 y1 = _maxY - y1 - 1;
JackB 0:cc1fb45bc3ad 82 break;
JackB 0:cc1fb45bc3ad 83 case 3: // ok
JackB 0:cc1fb45bc3ad 84 x1 = _maxX - x1 - 1;
JackB 0:cc1fb45bc3ad 85 _swap(x1, y1);
JackB 0:cc1fb45bc3ad 86 break;
JackB 0:cc1fb45bc3ad 87 }
JackB 0:cc1fb45bc3ad 88 }
JackB 0:cc1fb45bc3ad 89
JackB 0:cc1fb45bc3ad 90 void TFT_22_ILI9225::_setWindowMax(void) {
JackB 0:cc1fb45bc3ad 91 _setWindow(0, 0, maxX(), maxY());
JackB 0:cc1fb45bc3ad 92 }
JackB 0:cc1fb45bc3ad 93
JackB 0:cc1fb45bc3ad 94 void TFT_22_ILI9225::_setWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
JackB 0:cc1fb45bc3ad 95 _orientCoordinates(x0, y0);
JackB 0:cc1fb45bc3ad 96 _orientCoordinates(x1, y1);
JackB 0:cc1fb45bc3ad 97
JackB 0:cc1fb45bc3ad 98 if (x1 < x0) _swap(x0, x1);
JackB 0:cc1fb45bc3ad 99 if (y1 < y0) _swap(y0, y1);
JackB 0:cc1fb45bc3ad 100
JackB 0:cc1fb45bc3ad 101 _writeRegister(ILI9225_HORIZONTAL_WINDOW_ADDR1, x1);
JackB 0:cc1fb45bc3ad 102 _writeRegister(ILI9225_HORIZONTAL_WINDOW_ADDR2, x0);
JackB 0:cc1fb45bc3ad 103
JackB 0:cc1fb45bc3ad 104 _writeRegister(ILI9225_VERTICAL_WINDOW_ADDR1, y1);
JackB 0:cc1fb45bc3ad 105 _writeRegister(ILI9225_VERTICAL_WINDOW_ADDR2, y0);
JackB 0:cc1fb45bc3ad 106
JackB 0:cc1fb45bc3ad 107 _writeRegister(ILI9225_RAM_ADDR_SET1, x0);
JackB 0:cc1fb45bc3ad 108 _writeRegister(ILI9225_RAM_ADDR_SET2, y0);
JackB 0:cc1fb45bc3ad 109
JackB 0:cc1fb45bc3ad 110 _writeCommand(0x00, 0x22);
JackB 0:cc1fb45bc3ad 111 }
JackB 0:cc1fb45bc3ad 112
JackB 0:cc1fb45bc3ad 113 void TFT_22_ILI9225::init()
JackB 0:cc1fb45bc3ad 114 {
JackB 0:cc1fb45bc3ad 115 // Turn off backlight
JackB 0:cc1fb45bc3ad 116 setBacklight(0.0f);
JackB 0:cc1fb45bc3ad 117
JackB 0:cc1fb45bc3ad 118 // Initialization Code
JackB 0:cc1fb45bc3ad 119 _rst = 0;// Pull the reset pin low to reset ILI9225
JackB 0:cc1fb45bc3ad 120 wait_ms(10);
JackB 0:cc1fb45bc3ad 121 _rst = 1;// Pull the reset pin high to release the ILI9225C from the reset status
JackB 0:cc1fb45bc3ad 122 wait_ms(50);
JackB 0:cc1fb45bc3ad 123
JackB 0:cc1fb45bc3ad 124 /* Start Initial Sequence */
JackB 0:cc1fb45bc3ad 125 /* Set SS bit and direction output from S528 to S1 */
JackB 0:cc1fb45bc3ad 126 _writeRegister(ILI9225_POWER_CTRL1, 0x0000); // Set SAP,DSTB,STB
JackB 0:cc1fb45bc3ad 127 _writeRegister(ILI9225_POWER_CTRL2, 0x0000); // Set APON,PON,AON,VCI1EN,VC
JackB 0:cc1fb45bc3ad 128 _writeRegister(ILI9225_POWER_CTRL3, 0x0000); // Set BT,DC1,DC2,DC3
JackB 0:cc1fb45bc3ad 129 _writeRegister(ILI9225_POWER_CTRL4, 0x0000); // Set GVDD
JackB 0:cc1fb45bc3ad 130 _writeRegister(ILI9225_POWER_CTRL5, 0x0000); // Set VCOMH/VCOML voltage
JackB 0:cc1fb45bc3ad 131 wait_ms(40);
JackB 0:cc1fb45bc3ad 132
JackB 0:cc1fb45bc3ad 133 // Power-on sequence
JackB 0:cc1fb45bc3ad 134 _writeRegister(ILI9225_POWER_CTRL2, 0x0018); // Set APON,PON,AON,VCI1EN,VC
JackB 0:cc1fb45bc3ad 135 _writeRegister(ILI9225_POWER_CTRL3, 0x6121); // Set BT,DC1,DC2,DC3
JackB 0:cc1fb45bc3ad 136 _writeRegister(ILI9225_POWER_CTRL4, 0x006F); // Set GVDD /*007F 0088 */
JackB 0:cc1fb45bc3ad 137 _writeRegister(ILI9225_POWER_CTRL5, 0x495F); // Set VCOMH/VCOML voltage
JackB 0:cc1fb45bc3ad 138 _writeRegister(ILI9225_POWER_CTRL1, 0x0800); // Set SAP,DSTB,STB
JackB 0:cc1fb45bc3ad 139 wait_ms(10);
JackB 0:cc1fb45bc3ad 140 _writeRegister(ILI9225_POWER_CTRL2, 0x103B); // Set APON,PON,AON,VCI1EN,VC
JackB 0:cc1fb45bc3ad 141 wait_ms(50);
JackB 0:cc1fb45bc3ad 142
JackB 0:cc1fb45bc3ad 143 _writeRegister(ILI9225_DRIVER_OUTPUT_CTRL, 0x011C); // set the display line number and display direction
JackB 0:cc1fb45bc3ad 144 _writeRegister(ILI9225_LCD_AC_DRIVING_CTRL, 0x0100); // set 1 line inversion
JackB 0:cc1fb45bc3ad 145 _writeRegister(ILI9225_ENTRY_MODE, 0x1030); // set GRAM write direction and BGR=1.
JackB 0:cc1fb45bc3ad 146 _writeRegister(ILI9225_DISP_CTRL1, 0x0000); // Display off
JackB 0:cc1fb45bc3ad 147 _writeRegister(ILI9225_BLANK_PERIOD_CTRL1, 0x0808); // set the back porch and front porch
JackB 0:cc1fb45bc3ad 148 _writeRegister(ILI9225_FRAME_CYCLE_CTRL, 0x1100); // set the clocks number per line
JackB 0:cc1fb45bc3ad 149 _writeRegister(ILI9225_INTERFACE_CTRL, 0x0000); // CPU interface
JackB 0:cc1fb45bc3ad 150 _writeRegister(ILI9225_OSC_CTRL, 0x0D01); // Set Osc /*0e01*/
JackB 0:cc1fb45bc3ad 151 _writeRegister(ILI9225_VCI_RECYCLING, 0x0020); // Set VCI recycling
JackB 0:cc1fb45bc3ad 152 _writeRegister(ILI9225_RAM_ADDR_SET1, 0x0000); // RAM Address
JackB 0:cc1fb45bc3ad 153 _writeRegister(ILI9225_RAM_ADDR_SET2, 0x0000); // RAM Address
JackB 0:cc1fb45bc3ad 154
JackB 0:cc1fb45bc3ad 155 /* Set GRAM area */
JackB 0:cc1fb45bc3ad 156 _writeRegister(ILI9225_GATE_SCAN_CTRL, 0x0000);
JackB 0:cc1fb45bc3ad 157 _writeRegister(ILI9225_VERTICAL_SCROLL_CTRL1, 0x00DB);
JackB 0:cc1fb45bc3ad 158 _writeRegister(ILI9225_VERTICAL_SCROLL_CTRL2, 0x0000);
JackB 0:cc1fb45bc3ad 159 _writeRegister(ILI9225_VERTICAL_SCROLL_CTRL3, 0x0000);
JackB 0:cc1fb45bc3ad 160 _writeRegister(ILI9225_PARTIAL_DRIVING_POS1, 0x00DB);
JackB 0:cc1fb45bc3ad 161 _writeRegister(ILI9225_PARTIAL_DRIVING_POS2, 0x0000);
JackB 0:cc1fb45bc3ad 162 _writeRegister(ILI9225_HORIZONTAL_WINDOW_ADDR1, 0x00AF);
JackB 0:cc1fb45bc3ad 163 _writeRegister(ILI9225_HORIZONTAL_WINDOW_ADDR2, 0x0000);
JackB 0:cc1fb45bc3ad 164 _writeRegister(ILI9225_VERTICAL_WINDOW_ADDR1, 0x00DB);
JackB 0:cc1fb45bc3ad 165 _writeRegister(ILI9225_VERTICAL_WINDOW_ADDR2, 0x0000);
JackB 0:cc1fb45bc3ad 166
JackB 0:cc1fb45bc3ad 167 /* Set GAMMA curve */
JackB 0:cc1fb45bc3ad 168 _writeRegister(ILI9225_GAMMA_CTRL1, 0x0000);
JackB 0:cc1fb45bc3ad 169 _writeRegister(ILI9225_GAMMA_CTRL2, 0x0808);
JackB 0:cc1fb45bc3ad 170 _writeRegister(ILI9225_GAMMA_CTRL3, 0x080A);
JackB 0:cc1fb45bc3ad 171 _writeRegister(ILI9225_GAMMA_CTRL4, 0x000A);
JackB 0:cc1fb45bc3ad 172 _writeRegister(ILI9225_GAMMA_CTRL5, 0x0A08);
JackB 0:cc1fb45bc3ad 173 _writeRegister(ILI9225_GAMMA_CTRL6, 0x0808);
JackB 0:cc1fb45bc3ad 174 _writeRegister(ILI9225_GAMMA_CTRL7, 0x0000);
JackB 0:cc1fb45bc3ad 175 _writeRegister(ILI9225_GAMMA_CTRL8, 0x0A00);
JackB 0:cc1fb45bc3ad 176 _writeRegister(ILI9225_GAMMA_CTRL9, 0x0710);
JackB 0:cc1fb45bc3ad 177 _writeRegister(ILI9225_GAMMA_CTRL10, 0x0710);
JackB 0:cc1fb45bc3ad 178
JackB 0:cc1fb45bc3ad 179 _writeRegister(ILI9225_DISP_CTRL1, 0x0012);
JackB 0:cc1fb45bc3ad 180 wait_ms(50);
JackB 0:cc1fb45bc3ad 181 _writeRegister(ILI9225_DISP_CTRL1, 0x1017);
JackB 0:cc1fb45bc3ad 182
JackB 0:cc1fb45bc3ad 183 cls();
JackB 0:cc1fb45bc3ad 184 linespacing(0);
JackB 0:cc1fb45bc3ad 185 setBacklight(1.0f);
JackB 3:41e8d7dc279a 186 setOrientation(ILI9225_PORTRAIT_L);
JackB 0:cc1fb45bc3ad 187 foreground(COLOR_WHITE);
JackB 0:cc1fb45bc3ad 188 background(COLOR_BLACK);
JackB 0:cc1fb45bc3ad 189 }
JackB 0:cc1fb45bc3ad 190
JackB 0:cc1fb45bc3ad 191 void TFT_22_ILI9225::cls() {
JackB 0:cc1fb45bc3ad 192 setBacklightOff();
JackB 0:cc1fb45bc3ad 193 _setWindowMax();
JackB 0:cc1fb45bc3ad 194 _rs = 1;
JackB 0:cc1fb45bc3ad 195 _cs = 0;
JackB 0:cc1fb45bc3ad 196 for (uint16_t i = width() * height(); i > 0; i--) {
JackB 0:cc1fb45bc3ad 197 spi.write(0x00);
JackB 0:cc1fb45bc3ad 198 spi.write(0x00);
JackB 0:cc1fb45bc3ad 199 }
JackB 0:cc1fb45bc3ad 200 _cs = 1;
JackB 0:cc1fb45bc3ad 201 setBacklightOn();
JackB 0:cc1fb45bc3ad 202 gotoxy(0, 0);
JackB 0:cc1fb45bc3ad 203 }
JackB 0:cc1fb45bc3ad 204
JackB 0:cc1fb45bc3ad 205 void TFT_22_ILI9225::fill(uint16_t color)
JackB 0:cc1fb45bc3ad 206 {
JackB 0:cc1fb45bc3ad 207 fillRectangle(0, 0, maxX(), maxY(), color);
JackB 0:cc1fb45bc3ad 208 }
JackB 0:cc1fb45bc3ad 209
JackB 0:cc1fb45bc3ad 210 void TFT_22_ILI9225::invert(bool flag) {
JackB 0:cc1fb45bc3ad 211 _writeCommand(0x00, flag ? ILI9225C_INVON : ILI9225C_INVOFF);
JackB 0:cc1fb45bc3ad 212 }
JackB 0:cc1fb45bc3ad 213
JackB 0:cc1fb45bc3ad 214 void TFT_22_ILI9225::setBacklight(double brightness) {
JackB 0:cc1fb45bc3ad 215 // PWM output to control backlight
JackB 0:cc1fb45bc3ad 216 _brightness = brightness;
JackB 0:cc1fb45bc3ad 217 _led.write(pow(brightness, 2)); // power(x, 2): For the eye better brightness response
JackB 0:cc1fb45bc3ad 218 }
JackB 0:cc1fb45bc3ad 219
JackB 0:cc1fb45bc3ad 220 void TFT_22_ILI9225::setBacklightOff(void) {
JackB 0:cc1fb45bc3ad 221 _led.write(0.0f);
JackB 0:cc1fb45bc3ad 222 }
JackB 0:cc1fb45bc3ad 223
JackB 0:cc1fb45bc3ad 224 void TFT_22_ILI9225::setBacklightOn(void) {
JackB 0:cc1fb45bc3ad 225 setBacklight(_brightness);
JackB 0:cc1fb45bc3ad 226 }
JackB 0:cc1fb45bc3ad 227
JackB 0:cc1fb45bc3ad 228 void TFT_22_ILI9225::setDisplay(bool flag) {
JackB 0:cc1fb45bc3ad 229 if (flag) {
JackB 0:cc1fb45bc3ad 230 _writeRegister(0x00ff, 0x0000);
JackB 0:cc1fb45bc3ad 231 _writeRegister(ILI9225_POWER_CTRL1, 0x0000);
JackB 0:cc1fb45bc3ad 232 wait_ms(50);
JackB 0:cc1fb45bc3ad 233 _writeRegister(ILI9225_DISP_CTRL1, 0x1017);
JackB 0:cc1fb45bc3ad 234 wait_ms(200);
JackB 0:cc1fb45bc3ad 235 }
JackB 0:cc1fb45bc3ad 236 else {
JackB 0:cc1fb45bc3ad 237 _writeRegister(0x00ff, 0x0000);
JackB 0:cc1fb45bc3ad 238 _writeRegister(ILI9225_DISP_CTRL1, 0x0000);
JackB 0:cc1fb45bc3ad 239 wait_ms(50);
JackB 0:cc1fb45bc3ad 240 _writeRegister(ILI9225_POWER_CTRL1, 0x0003);
JackB 0:cc1fb45bc3ad 241 wait_ms(200);
JackB 0:cc1fb45bc3ad 242 }
JackB 0:cc1fb45bc3ad 243 }
JackB 0:cc1fb45bc3ad 244
JackB 0:cc1fb45bc3ad 245 void TFT_22_ILI9225::setOrientation(uint8_t orientation) {
JackB 0:cc1fb45bc3ad 246
JackB 0:cc1fb45bc3ad 247 _orientation = orientation % 4;
JackB 3:41e8d7dc279a 248 // Entry Mode (R03h)
JackB 3:41e8d7dc279a 249 // 0x1000 AM = 0: Horizontal, I/D[1:0] = 00: Horizontal: decrement, Vertical: decrement - ILI9225_PORTRAIT_R
JackB 3:41e8d7dc279a 250 // 0x1010 AM = 0: Horizontal, I/D[1:0] = 01: Horizontal: increment, Vertical: decrement
JackB 3:41e8d7dc279a 251 // 0x1020 AM = 0: Horizontal, I/D[1:0] = 10: Horizontal: decrement, Vertical: increment
JackB 3:41e8d7dc279a 252 // 0x1030 AM = 0: Horizontal, I/D[1:0] = 11: Horizontal: increment, Vertical: increment - ILI9225_PORTRAIT_L
JackB 3:41e8d7dc279a 253 // 0x1008 AM = 1: Vertical, I/D[1:0] = 00: Horizontal: decrement, Vertical: decrement
JackB 3:41e8d7dc279a 254 // 0x1018 AM = 1: Vertical, I/D[1:0] = 01: Horizontal: increment, Vertical: decrement - ILI9225_LANDSCAPE_T
JackB 3:41e8d7dc279a 255 // 0x1028 AM = 1: Vertical, I/D[1:0] = 10: Horizontal: decrement, Vertical: increment - ILI9225_LANDSCAPE_B
JackB 3:41e8d7dc279a 256 // 0x1038 AM = 1: Vertical, I/D[1:0] = 11: Horizontal: increment, Vertical: increment
JackB 3:41e8d7dc279a 257 uint16_t entryMode;
JackB 0:cc1fb45bc3ad 258 switch (_orientation) {
JackB 3:41e8d7dc279a 259 case ILI9225_PORTRAIT_L:
JackB 3:41e8d7dc279a 260 // 0x1030 AM = 0: Horizontal, I/D[1:0] = 11: Horizontal: increment, Vertical: increment
JackB 3:41e8d7dc279a 261 entryMode = 0x1030;
JackB 3:41e8d7dc279a 262 _maxX = ILI9225_LCD_WIDTH;
JackB 3:41e8d7dc279a 263 _maxY = ILI9225_LCD_HEIGHT;
JackB 3:41e8d7dc279a 264 break;
JackB 3:41e8d7dc279a 265 case ILI9225_LANDSCAPE_B:
JackB 3:41e8d7dc279a 266 // 0x1028 AM = 1: Vertical, I/D[1:0] = 10: Horizontal: decrement, Vertical: increment
JackB 3:41e8d7dc279a 267 entryMode = 0x1028;
JackB 3:41e8d7dc279a 268 _maxX = ILI9225_LCD_HEIGHT;
JackB 3:41e8d7dc279a 269 _maxY = ILI9225_LCD_WIDTH;
JackB 3:41e8d7dc279a 270 break;
JackB 3:41e8d7dc279a 271 case ILI9225_PORTRAIT_R:
JackB 3:41e8d7dc279a 272 // 0x1000 AM = 0: Horizontal, I/D[1:0] = 00: Horizontal: decrement, Vertical: decrement
JackB 3:41e8d7dc279a 273 entryMode = 0x1000;
JackB 3:41e8d7dc279a 274 _maxX = ILI9225_LCD_WIDTH;
JackB 3:41e8d7dc279a 275 _maxY = ILI9225_LCD_HEIGHT;
JackB 3:41e8d7dc279a 276 break;
JackB 3:41e8d7dc279a 277 case ILI9225_LANDSCAPE_T:
JackB 3:41e8d7dc279a 278 // 0x1018 AM = 1: Vertical, I/D[1:0] = 01: Horizontal: increment, Vertical: decrement
JackB 3:41e8d7dc279a 279 entryMode = 0x1018;
JackB 3:41e8d7dc279a 280 _maxX = ILI9225_LCD_HEIGHT;
JackB 3:41e8d7dc279a 281 _maxY = ILI9225_LCD_WIDTH;
JackB 3:41e8d7dc279a 282 break;
JackB 0:cc1fb45bc3ad 283 }
JackB 3:41e8d7dc279a 284 _writeRegister(ILI9225_ENTRY_MODE, entryMode); // set GRAM write direction and BGR=1.
JackB 0:cc1fb45bc3ad 285 }
JackB 0:cc1fb45bc3ad 286
JackB 0:cc1fb45bc3ad 287 uint8_t TFT_22_ILI9225::getOrientation() {
JackB 0:cc1fb45bc3ad 288 return _orientation;
JackB 0:cc1fb45bc3ad 289 }
JackB 0:cc1fb45bc3ad 290
JackB 0:cc1fb45bc3ad 291 void TFT_22_ILI9225::drawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) {
JackB 0:cc1fb45bc3ad 292 drawLine(x1, y1, x1, y2, color);
JackB 0:cc1fb45bc3ad 293 drawLine(x1, y1, x2, y1, color);
JackB 0:cc1fb45bc3ad 294 drawLine(x1, y2, x2, y2, color);
JackB 0:cc1fb45bc3ad 295 drawLine(x2, y1, x2, y2, color);
JackB 0:cc1fb45bc3ad 296 }
JackB 0:cc1fb45bc3ad 297
JackB 0:cc1fb45bc3ad 298 void TFT_22_ILI9225::fillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) {
JackB 0:cc1fb45bc3ad 299
JackB 0:cc1fb45bc3ad 300 _setWindow(x1, y1, x2, y2);
JackB 0:cc1fb45bc3ad 301 _startData();
JackB 0:cc1fb45bc3ad 302 for (uint16_t t = (y2 - y1 + 1) * (x2 - x1 + 1); t > 0; t--) {
JackB 0:cc1fb45bc3ad 303 _writeData(color);
JackB 0:cc1fb45bc3ad 304 }
JackB 0:cc1fb45bc3ad 305 _endData();
JackB 0:cc1fb45bc3ad 306 }
JackB 0:cc1fb45bc3ad 307
JackB 0:cc1fb45bc3ad 308 void TFT_22_ILI9225::drawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) {
JackB 0:cc1fb45bc3ad 309
JackB 0:cc1fb45bc3ad 310 int16_t f = 1 - r;
JackB 0:cc1fb45bc3ad 311 int16_t ddF_x = 1;
JackB 0:cc1fb45bc3ad 312 int16_t ddF_y = -2 * r;
JackB 0:cc1fb45bc3ad 313 int16_t x = 0;
JackB 0:cc1fb45bc3ad 314 int16_t y = r;
JackB 0:cc1fb45bc3ad 315
JackB 0:cc1fb45bc3ad 316 drawPixel(x0, y0 + r, color);
JackB 0:cc1fb45bc3ad 317 drawPixel(x0, y0 - r, color);
JackB 0:cc1fb45bc3ad 318 drawPixel(x0 + r, y0, color);
JackB 0:cc1fb45bc3ad 319 drawPixel(x0 - r, y0, color);
JackB 0:cc1fb45bc3ad 320
JackB 0:cc1fb45bc3ad 321 while (x < y) {
JackB 0:cc1fb45bc3ad 322 if (f >= 0) {
JackB 0:cc1fb45bc3ad 323 y--;
JackB 0:cc1fb45bc3ad 324 ddF_y += 2;
JackB 0:cc1fb45bc3ad 325 f += ddF_y;
JackB 0:cc1fb45bc3ad 326 }
JackB 0:cc1fb45bc3ad 327 x++;
JackB 0:cc1fb45bc3ad 328 ddF_x += 2;
JackB 0:cc1fb45bc3ad 329 f += ddF_x;
JackB 0:cc1fb45bc3ad 330
JackB 0:cc1fb45bc3ad 331 drawPixel(x0 + x, y0 + y, color);
JackB 0:cc1fb45bc3ad 332 drawPixel(x0 - x, y0 + y, color);
JackB 0:cc1fb45bc3ad 333 drawPixel(x0 + x, y0 - y, color);
JackB 0:cc1fb45bc3ad 334 drawPixel(x0 - x, y0 - y, color);
JackB 0:cc1fb45bc3ad 335 drawPixel(x0 + y, y0 + x, color);
JackB 0:cc1fb45bc3ad 336 drawPixel(x0 - y, y0 + x, color);
JackB 0:cc1fb45bc3ad 337 drawPixel(x0 + y, y0 - x, color);
JackB 0:cc1fb45bc3ad 338 drawPixel(x0 - y, y0 - x, color);
JackB 0:cc1fb45bc3ad 339 }
JackB 0:cc1fb45bc3ad 340 }
JackB 0:cc1fb45bc3ad 341
JackB 0:cc1fb45bc3ad 342 void TFT_22_ILI9225::fillCircle(uint8_t x0, uint8_t y0, uint8_t radius, uint16_t color) {
JackB 0:cc1fb45bc3ad 343
JackB 0:cc1fb45bc3ad 344 int16_t f = 1 - radius;
JackB 0:cc1fb45bc3ad 345 int16_t ddF_x = 1;
JackB 0:cc1fb45bc3ad 346 int16_t ddF_y = -2 * radius;
JackB 0:cc1fb45bc3ad 347 int16_t x = 0;
JackB 0:cc1fb45bc3ad 348 int16_t y = radius;
JackB 0:cc1fb45bc3ad 349
JackB 0:cc1fb45bc3ad 350 while (x < y) {
JackB 0:cc1fb45bc3ad 351 if (f >= 0) {
JackB 0:cc1fb45bc3ad 352 y--;
JackB 0:cc1fb45bc3ad 353 ddF_y += 2;
JackB 0:cc1fb45bc3ad 354 f += ddF_y;
JackB 0:cc1fb45bc3ad 355 }
JackB 0:cc1fb45bc3ad 356 x++;
JackB 0:cc1fb45bc3ad 357 ddF_x += 2;
JackB 0:cc1fb45bc3ad 358 f += ddF_x;
JackB 0:cc1fb45bc3ad 359
JackB 0:cc1fb45bc3ad 360 drawLine(x0 + x, y0 + y, x0 - x, y0 + y, color); // bottom
JackB 0:cc1fb45bc3ad 361 drawLine(x0 + x, y0 - y, x0 - x, y0 - y, color); // top
JackB 0:cc1fb45bc3ad 362 drawLine(x0 + y, y0 - x, x0 + y, y0 + x, color); // right
JackB 0:cc1fb45bc3ad 363 drawLine(x0 - y, y0 - x, x0 - y, y0 + x, color); // left
JackB 0:cc1fb45bc3ad 364 }
JackB 0:cc1fb45bc3ad 365 fillRectangle(x0 - x, y0 - y, x0 + x, y0 + y, color);
JackB 0:cc1fb45bc3ad 366 }
JackB 0:cc1fb45bc3ad 367
JackB 0:cc1fb45bc3ad 368 void TFT_22_ILI9225::drawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) {
JackB 0:cc1fb45bc3ad 369
JackB 0:cc1fb45bc3ad 370 // Classic Bresenham algorithm
JackB 0:cc1fb45bc3ad 371 int16_t steep = abs(y2 - y1) > abs(x2 - x1);
JackB 0:cc1fb45bc3ad 372 int16_t dx, dy;
JackB 0:cc1fb45bc3ad 373
JackB 0:cc1fb45bc3ad 374 if (steep) {
JackB 0:cc1fb45bc3ad 375 _swap(x1, y1);
JackB 0:cc1fb45bc3ad 376 _swap(x2, y2);
JackB 0:cc1fb45bc3ad 377 }
JackB 0:cc1fb45bc3ad 378
JackB 0:cc1fb45bc3ad 379 if (x1 > x2) {
JackB 0:cc1fb45bc3ad 380 _swap(x1, x2);
JackB 0:cc1fb45bc3ad 381 _swap(y1, y2);
JackB 0:cc1fb45bc3ad 382 }
JackB 0:cc1fb45bc3ad 383
JackB 0:cc1fb45bc3ad 384 dx = x2 - x1;
JackB 0:cc1fb45bc3ad 385 dy = abs(y2 - y1);
JackB 0:cc1fb45bc3ad 386
JackB 0:cc1fb45bc3ad 387 int16_t err = dx / 2;
JackB 0:cc1fb45bc3ad 388 int16_t ystep;
JackB 0:cc1fb45bc3ad 389
JackB 0:cc1fb45bc3ad 390 if (y1 < y2) ystep = 1;
JackB 0:cc1fb45bc3ad 391 else ystep = -1;
JackB 0:cc1fb45bc3ad 392
JackB 0:cc1fb45bc3ad 393
JackB 0:cc1fb45bc3ad 394 for (; x1 <= x2; x1++) {
JackB 0:cc1fb45bc3ad 395 if (steep) drawPixel(y1, x1, color);
JackB 0:cc1fb45bc3ad 396 else drawPixel(x1, y1, color);
JackB 0:cc1fb45bc3ad 397
JackB 0:cc1fb45bc3ad 398 err -= dy;
JackB 0:cc1fb45bc3ad 399 if (err < 0) {
JackB 0:cc1fb45bc3ad 400 y1 += ystep;
JackB 0:cc1fb45bc3ad 401 err += dx;
JackB 0:cc1fb45bc3ad 402 }
JackB 0:cc1fb45bc3ad 403 }
JackB 0:cc1fb45bc3ad 404 }
JackB 0:cc1fb45bc3ad 405
JackB 0:cc1fb45bc3ad 406 void TFT_22_ILI9225::drawPixel(uint16_t x1, uint16_t y1, uint16_t color) {
JackB 0:cc1fb45bc3ad 407
JackB 0:cc1fb45bc3ad 408 if ((x1 >= _maxX) || (y1 >= _maxY)) return;
JackB 0:cc1fb45bc3ad 409
JackB 0:cc1fb45bc3ad 410 _setWindow(x1, y1, x1 + 1, y1 + 1);
JackB 0:cc1fb45bc3ad 411 _orientCoordinates(x1, y1);
JackB 3:41e8d7dc279a 412 _rs = 1;
JackB 3:41e8d7dc279a 413 _cs = 0;
JackB 3:41e8d7dc279a 414 spi.write(color >> 8);
JackB 3:41e8d7dc279a 415 spi.write(color & 0xff);
JackB 3:41e8d7dc279a 416 _cs = 1;
JackB 0:cc1fb45bc3ad 417 }
JackB 0:cc1fb45bc3ad 418
JackB 0:cc1fb45bc3ad 419 uint16_t TFT_22_ILI9225::maxX(void) {
JackB 0:cc1fb45bc3ad 420 return _maxX - 1;
JackB 0:cc1fb45bc3ad 421 }
JackB 0:cc1fb45bc3ad 422
JackB 0:cc1fb45bc3ad 423 uint16_t TFT_22_ILI9225::maxY(void) {
JackB 0:cc1fb45bc3ad 424 return _maxY - 1;
JackB 0:cc1fb45bc3ad 425 }
JackB 0:cc1fb45bc3ad 426
JackB 0:cc1fb45bc3ad 427 uint16_t TFT_22_ILI9225::width(void) {
JackB 0:cc1fb45bc3ad 428 return _maxX;
JackB 0:cc1fb45bc3ad 429 }
JackB 0:cc1fb45bc3ad 430
JackB 0:cc1fb45bc3ad 431 uint16_t TFT_22_ILI9225::height(void) {
JackB 0:cc1fb45bc3ad 432 return _maxY;
JackB 0:cc1fb45bc3ad 433 }
JackB 0:cc1fb45bc3ad 434
JackB 0:cc1fb45bc3ad 435 uint16_t TFT_22_ILI9225::setColor(uint8_t red8, uint8_t green8, uint8_t blue8) {
JackB 0:cc1fb45bc3ad 436 // rgb16 = red5 green6 blue5
JackB 0:cc1fb45bc3ad 437 return (red8 >> 3) << 11 | (green8 >> 2) << 5 | (blue8 >> 3);
JackB 0:cc1fb45bc3ad 438 }
JackB 0:cc1fb45bc3ad 439
JackB 0:cc1fb45bc3ad 440 void TFT_22_ILI9225::splitColor(uint16_t rgb, uint8_t &red, uint8_t &green, uint8_t &blue) {
JackB 0:cc1fb45bc3ad 441 // rgb16 = red5 green6 blue5
JackB 0:cc1fb45bc3ad 442
JackB 0:cc1fb45bc3ad 443 red = (rgb & 0xF800) >> 11 << 3;
JackB 0:cc1fb45bc3ad 444 green = (rgb & 0x7E0) >> 5 << 2;
JackB 0:cc1fb45bc3ad 445 blue = (rgb & 0x1F) << 3;
JackB 0:cc1fb45bc3ad 446 }
JackB 0:cc1fb45bc3ad 447
JackB 0:cc1fb45bc3ad 448 void TFT_22_ILI9225::_swap(uint16_t &a, uint16_t &b) {
JackB 0:cc1fb45bc3ad 449 uint16_t w = a;
JackB 0:cc1fb45bc3ad 450 a = b;
JackB 0:cc1fb45bc3ad 451 b = w;
JackB 0:cc1fb45bc3ad 452 }
JackB 0:cc1fb45bc3ad 453
JackB 0:cc1fb45bc3ad 454 void TFT_22_ILI9225::_writeCommand(uint8_t HI, uint8_t LO) {
JackB 0:cc1fb45bc3ad 455 _rs = 0;
JackB 0:cc1fb45bc3ad 456 _cs = 0;
JackB 0:cc1fb45bc3ad 457 spi.write(HI);
JackB 0:cc1fb45bc3ad 458 spi.write(LO);
JackB 0:cc1fb45bc3ad 459 _cs = 1;
JackB 0:cc1fb45bc3ad 460 }
JackB 0:cc1fb45bc3ad 461
JackB 0:cc1fb45bc3ad 462 void TFT_22_ILI9225::_writeData(uint16_t data) {
JackB 0:cc1fb45bc3ad 463 spi.write(data >> 8);
JackB 0:cc1fb45bc3ad 464 spi.write(data & 0xff);
JackB 0:cc1fb45bc3ad 465 // spi.write(data);
JackB 0:cc1fb45bc3ad 466 }
JackB 0:cc1fb45bc3ad 467
JackB 0:cc1fb45bc3ad 468 void TFT_22_ILI9225::_startData(void) {
JackB 0:cc1fb45bc3ad 469 _rs = 1;
JackB 0:cc1fb45bc3ad 470 _cs = 0;
JackB 0:cc1fb45bc3ad 471 // spi.format(16, 0); // New mbed library can't use 16 bit spi anymore on this platform
JackB 0:cc1fb45bc3ad 472 }
JackB 0:cc1fb45bc3ad 473
JackB 0:cc1fb45bc3ad 474 void TFT_22_ILI9225::_endData(void) {
JackB 0:cc1fb45bc3ad 475 _cs = 1;
JackB 0:cc1fb45bc3ad 476 // spi.format(8, 0);
JackB 0:cc1fb45bc3ad 477 }
JackB 0:cc1fb45bc3ad 478
JackB 0:cc1fb45bc3ad 479 void TFT_22_ILI9225::_writeRegister(uint16_t reg, uint16_t data) {
JackB 0:cc1fb45bc3ad 480 _writeCommand(reg >> 8, reg & 0xff);
JackB 0:cc1fb45bc3ad 481 _startData();
JackB 0:cc1fb45bc3ad 482 _writeData(data);
JackB 0:cc1fb45bc3ad 483 _endData();
JackB 0:cc1fb45bc3ad 484 }
JackB 0:cc1fb45bc3ad 485
JackB 0:cc1fb45bc3ad 486 void TFT_22_ILI9225::drawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t color) {
JackB 0:cc1fb45bc3ad 487 drawLine(x1, y1, x2, y2, color);
JackB 0:cc1fb45bc3ad 488 drawLine(x2, y2, x3, y3, color);
JackB 0:cc1fb45bc3ad 489 drawLine(x3, y3, x1, y1, color);
JackB 0:cc1fb45bc3ad 490 }
JackB 0:cc1fb45bc3ad 491
JackB 0:cc1fb45bc3ad 492 void TFT_22_ILI9225::fillTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t color) {
JackB 0:cc1fb45bc3ad 493
JackB 0:cc1fb45bc3ad 494 uint16_t a, b, y, last;
JackB 0:cc1fb45bc3ad 495
JackB 0:cc1fb45bc3ad 496 // Sort coordinates by Y order (y3 >= y2 >= y1)
JackB 0:cc1fb45bc3ad 497 if (y1 > y2) {
JackB 0:cc1fb45bc3ad 498 _swap(y1, y2); _swap(x1, x2);
JackB 0:cc1fb45bc3ad 499 }
JackB 0:cc1fb45bc3ad 500 if (y2 > y3) {
JackB 0:cc1fb45bc3ad 501 _swap(y3, y2); _swap(x3, x2);
JackB 0:cc1fb45bc3ad 502 }
JackB 0:cc1fb45bc3ad 503 if (y1 > y2) {
JackB 0:cc1fb45bc3ad 504 _swap(y1, y2); _swap(x1, x2);
JackB 0:cc1fb45bc3ad 505 }
JackB 0:cc1fb45bc3ad 506
JackB 0:cc1fb45bc3ad 507 if (y1 == y3) { // Handle awkward all-on-same-line case as its own thing
JackB 0:cc1fb45bc3ad 508 a = b = x1;
JackB 0:cc1fb45bc3ad 509 if (x2 < a) a = x2;
JackB 0:cc1fb45bc3ad 510 else if (x2 > b) b = x2;
JackB 0:cc1fb45bc3ad 511 if (x3 < a) a = x3;
JackB 0:cc1fb45bc3ad 512 else if (x3 > b) b = x3;
JackB 0:cc1fb45bc3ad 513 drawLine(a, y1, b, y1, color);
JackB 0:cc1fb45bc3ad 514 return;
JackB 0:cc1fb45bc3ad 515 }
JackB 0:cc1fb45bc3ad 516
JackB 0:cc1fb45bc3ad 517 uint16_t dx11 = x2 - x1,
JackB 0:cc1fb45bc3ad 518 dy11 = y2 - y1,
JackB 0:cc1fb45bc3ad 519 dx12 = x3 - x1,
JackB 0:cc1fb45bc3ad 520 dy12 = y3 - y1,
JackB 0:cc1fb45bc3ad 521 dx22 = x3 - x2,
JackB 0:cc1fb45bc3ad 522 dy22 = y3 - y2,
JackB 0:cc1fb45bc3ad 523 sa = 0,
JackB 0:cc1fb45bc3ad 524 sb = 0;
JackB 0:cc1fb45bc3ad 525
JackB 0:cc1fb45bc3ad 526 // For upper part of triangle, find scanline crossings for segments
JackB 0:cc1fb45bc3ad 527 // 0-1 and 0-2. If y2=y3 (flat-bottomed triangle), the scanline y2
JackB 0:cc1fb45bc3ad 528 // is included here (and second loop will be skipped, avoiding a /0
JackB 0:cc1fb45bc3ad 529 // error there), otherwise scanline y2 is skipped here and handled
JackB 0:cc1fb45bc3ad 530 // in the second loop...which also avoids a /0 error here if y1=y2
JackB 0:cc1fb45bc3ad 531 // (flat-topped triangle).
JackB 0:cc1fb45bc3ad 532 if (y2 == y3) last = y2; // Include y2 scanline
JackB 0:cc1fb45bc3ad 533 else last = y2 - 1; // Skip it
JackB 0:cc1fb45bc3ad 534
JackB 0:cc1fb45bc3ad 535 for (y = y1; y <= last; y++) {
JackB 0:cc1fb45bc3ad 536 a = x1 + sa / dy11;
JackB 0:cc1fb45bc3ad 537 b = x1 + sb / dy12;
JackB 0:cc1fb45bc3ad 538 sa += dx11;
JackB 0:cc1fb45bc3ad 539 sb += dx12;
JackB 0:cc1fb45bc3ad 540 /* longhand:
JackB 0:cc1fb45bc3ad 541 a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
JackB 0:cc1fb45bc3ad 542 b = x1 + (x3 - x1) * (y - y1) / (y3 - y1);
JackB 0:cc1fb45bc3ad 543 */
JackB 0:cc1fb45bc3ad 544 if (a > b) _swap(a, b);
JackB 0:cc1fb45bc3ad 545 drawLine(a, y, b, y, color);
JackB 0:cc1fb45bc3ad 546 }
JackB 0:cc1fb45bc3ad 547
JackB 0:cc1fb45bc3ad 548 // For lower part of triangle, find scanline crossings for segments
JackB 0:cc1fb45bc3ad 549 // 0-2 and 1-2. This loop is skipped if y2=y3.
JackB 0:cc1fb45bc3ad 550 sa = dx22 * (y - y2);
JackB 0:cc1fb45bc3ad 551 sb = dx12 * (y - y1);
JackB 0:cc1fb45bc3ad 552 for (; y <= y3; y++) {
JackB 0:cc1fb45bc3ad 553 a = x2 + sa / dy22;
JackB 0:cc1fb45bc3ad 554 b = x1 + sb / dy12;
JackB 0:cc1fb45bc3ad 555 sa += dx22;
JackB 0:cc1fb45bc3ad 556 sb += dx12;
JackB 0:cc1fb45bc3ad 557 /* longhand:
JackB 0:cc1fb45bc3ad 558 a = x2 + (x3 - x2) * (y - y2) / (y3 - y2);
JackB 0:cc1fb45bc3ad 559 b = x1 + (x3 - x1) * (y - y1) / (y3 - y1);
JackB 0:cc1fb45bc3ad 560 */
JackB 0:cc1fb45bc3ad 561 if (a > b) _swap(a, b);
JackB 0:cc1fb45bc3ad 562 drawLine(a, y, b, y, color);
JackB 0:cc1fb45bc3ad 563 }
JackB 0:cc1fb45bc3ad 564 }
JackB 0:cc1fb45bc3ad 565
JackB 0:cc1fb45bc3ad 566 void TFT_22_ILI9225::setFont(unsigned char* f) {
JackB 0:cc1fb45bc3ad 567 font = f;
JackB 0:cc1fb45bc3ad 568 }
JackB 0:cc1fb45bc3ad 569
JackB 0:cc1fb45bc3ad 570 int TFT_22_ILI9225::putc(int value)
JackB 0:cc1fb45bc3ad 571 {
JackB 0:cc1fb45bc3ad 572 if (value == '\n') { // new line
JackB 0:cc1fb45bc3ad 573 char_x = 0;
JackB 0:cc1fb45bc3ad 574 char_y = char_y + (font[FONT_VERT] + char_line_spacing);
JackB 0:cc1fb45bc3ad 575 if (char_y >= height() - (font[FONT_VERT] + char_line_spacing)) {
JackB 0:cc1fb45bc3ad 576 char_y = 0;
JackB 0:cc1fb45bc3ad 577 }
JackB 0:cc1fb45bc3ad 578 return value;
JackB 0:cc1fb45bc3ad 579 }
JackB 0:cc1fb45bc3ad 580 if ((value < 32) || (value > 127)) {
JackB 0:cc1fb45bc3ad 581 return value;
JackB 0:cc1fb45bc3ad 582 }
JackB 0:cc1fb45bc3ad 583 character(char_x, char_y, value);
JackB 0:cc1fb45bc3ad 584 return value;
JackB 0:cc1fb45bc3ad 585 }
JackB 0:cc1fb45bc3ad 586
JackB 0:cc1fb45bc3ad 587 void TFT_22_ILI9225::character(int x, int y, int c)
JackB 0:cc1fb45bc3ad 588 {
JackB 3:41e8d7dc279a 589 unsigned int hor, vert, offset, bpl, i, j, b;
JackB 0:cc1fb45bc3ad 590 unsigned char* zeichen;
JackB 0:cc1fb45bc3ad 591 unsigned char z,w;
JackB 0:cc1fb45bc3ad 592
JackB 0:cc1fb45bc3ad 593 if ((c < 31) || (c > 127)) return; // test char range
JackB 0:cc1fb45bc3ad 594
JackB 0:cc1fb45bc3ad 595 // read font parameter from start of array
JackB 0:cc1fb45bc3ad 596 offset = font[FONT_LENGTH]; // bytes / char
JackB 0:cc1fb45bc3ad 597 hor = font[FONT_HORZ]; // get hor size of font
JackB 0:cc1fb45bc3ad 598 vert = font[FONT_VERT]; // get vert size of font
JackB 0:cc1fb45bc3ad 599 bpl = font[FONT_BYTES_VERT]; // bytes per line
JackB 0:cc1fb45bc3ad 600
JackB 0:cc1fb45bc3ad 601 if (char_x + hor > width()) {
JackB 0:cc1fb45bc3ad 602 char_x = 0;
JackB 0:cc1fb45bc3ad 603 char_y = char_y + vert + char_line_spacing;
JackB 0:cc1fb45bc3ad 604 if (char_y >= height() - (vert + char_line_spacing)) {
JackB 0:cc1fb45bc3ad 605 char_y = 0;
JackB 0:cc1fb45bc3ad 606 }
JackB 0:cc1fb45bc3ad 607 }
JackB 0:cc1fb45bc3ad 608 _setWindow(char_x, char_y, (char_x+hor)-1, (char_y+vert)-1);
JackB 0:cc1fb45bc3ad 609
JackB 0:cc1fb45bc3ad 610 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
JackB 0:cc1fb45bc3ad 611 w = zeichen[0]; // width of actual char
JackB 0:cc1fb45bc3ad 612 _startData();
JackB 0:cc1fb45bc3ad 613
JackB 0:cc1fb45bc3ad 614 // Portrait
JackB 3:41e8d7dc279a 615 for (j = 0; j < vert; j++) { // vert line
JackB 3:41e8d7dc279a 616 for (i = 0; i < hor; i++) { // horz line
JackB 0:cc1fb45bc3ad 617 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
JackB 0:cc1fb45bc3ad 618 b = 1 << (j & 0x07);
JackB 0:cc1fb45bc3ad 619 if (( z & b ) == 0x00) {
JackB 0:cc1fb45bc3ad 620 spi.write(_background >> 8);
JackB 0:cc1fb45bc3ad 621 spi.write(_background & 0xff);
JackB 0:cc1fb45bc3ad 622 } else {
JackB 0:cc1fb45bc3ad 623 spi.write(_foreground >> 8);
JackB 0:cc1fb45bc3ad 624 spi.write(_foreground & 0xff);
JackB 0:cc1fb45bc3ad 625 }
JackB 0:cc1fb45bc3ad 626 }
JackB 0:cc1fb45bc3ad 627 }
JackB 3:41e8d7dc279a 628
JackB 3:41e8d7dc279a 629 // switch (_orientation) {
JackB 3:41e8d7dc279a 630 // case 0:
JackB 3:41e8d7dc279a 631 // // Portrait
JackB 3:41e8d7dc279a 632 // for (j = 0; j < vert; j++) { // vert line
JackB 3:41e8d7dc279a 633 // for (i = 0; i < hor; i++) { // horz line
JackB 3:41e8d7dc279a 634 // z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
JackB 3:41e8d7dc279a 635 // b = 1 << (j & 0x07);
JackB 3:41e8d7dc279a 636 // if (( z & b ) == 0x00) {
JackB 3:41e8d7dc279a 637 // spi.write(_background >> 8);
JackB 3:41e8d7dc279a 638 // spi.write(_background & 0xff);
JackB 3:41e8d7dc279a 639 // } else {
JackB 3:41e8d7dc279a 640 // spi.write(_foreground >> 8);
JackB 3:41e8d7dc279a 641 // spi.write(_foreground & 0xff);
JackB 3:41e8d7dc279a 642 // }
JackB 3:41e8d7dc279a 643 // }
JackB 3:41e8d7dc279a 644 // }
JackB 3:41e8d7dc279a 645 // break;
JackB 3:41e8d7dc279a 646 // case 1:
JackB 3:41e8d7dc279a 647 // // Landscape
JackB 3:41e8d7dc279a 648 // for (int i=0; i<hor; i++) { // horz line
JackB 3:41e8d7dc279a 649 // for (int j=vert-1; j>=0; j--) { // vert line
JackB 3:41e8d7dc279a 650 // z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
JackB 3:41e8d7dc279a 651 // b = 1 << (j & 0x07);
JackB 3:41e8d7dc279a 652 // if (( z & b ) == 0x00) {
JackB 3:41e8d7dc279a 653 // spi.write(_background >> 8);
JackB 3:41e8d7dc279a 654 // spi.write(_background & 0xff);
JackB 3:41e8d7dc279a 655 // } else {
JackB 3:41e8d7dc279a 656 // spi.write(_foreground >> 8);
JackB 3:41e8d7dc279a 657 // spi.write(_foreground & 0xff);
JackB 3:41e8d7dc279a 658 // }
JackB 3:41e8d7dc279a 659 // }
JackB 3:41e8d7dc279a 660 // }
JackB 3:41e8d7dc279a 661 // break;
JackB 3:41e8d7dc279a 662 // case 2:
JackB 3:41e8d7dc279a 663 // // Portrait
JackB 3:41e8d7dc279a 664 // for (int j=vert-1; j>=0; j--) { // vert line
JackB 3:41e8d7dc279a 665 // for (int i=hor-1; i>=0; i--) { // horz line
JackB 3:41e8d7dc279a 666 // z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
JackB 3:41e8d7dc279a 667 // b = 1 << (j & 0x07);
JackB 3:41e8d7dc279a 668 // if (( z & b ) == 0x00) {
JackB 3:41e8d7dc279a 669 // spi.write(_background >> 8);
JackB 3:41e8d7dc279a 670 // spi.write(_background & 0xff);
JackB 3:41e8d7dc279a 671 // } else {
JackB 3:41e8d7dc279a 672 // spi.write(_foreground >> 8);
JackB 3:41e8d7dc279a 673 // spi.write(_foreground & 0xff);
JackB 3:41e8d7dc279a 674 // }
JackB 3:41e8d7dc279a 675 // }
JackB 3:41e8d7dc279a 676 // }
JackB 3:41e8d7dc279a 677 // break;
JackB 3:41e8d7dc279a 678 // case 3:
JackB 3:41e8d7dc279a 679 // // Landscape
JackB 3:41e8d7dc279a 680 // for (int i=hor-1; i>= 0; i--) { // horz line
JackB 3:41e8d7dc279a 681 // for (int j=0; j<vert; j++) { // vert line
JackB 3:41e8d7dc279a 682 // z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
JackB 3:41e8d7dc279a 683 // b = 1 << (j & 0x07);
JackB 3:41e8d7dc279a 684 // if (( z & b ) == 0x00) {
JackB 3:41e8d7dc279a 685 // spi.write(_background >> 8);
JackB 3:41e8d7dc279a 686 // spi.write(_background & 0xff);
JackB 3:41e8d7dc279a 687 // } else {
JackB 3:41e8d7dc279a 688 // spi.write(_foreground >> 8);
JackB 3:41e8d7dc279a 689 // spi.write(_foreground & 0xff);
JackB 3:41e8d7dc279a 690 // }
JackB 3:41e8d7dc279a 691 // }
JackB 3:41e8d7dc279a 692 // }
JackB 3:41e8d7dc279a 693 // break;
JackB 3:41e8d7dc279a 694 // }
JackB 0:cc1fb45bc3ad 695
JackB 0:cc1fb45bc3ad 696 _endData();
JackB 0:cc1fb45bc3ad 697 _setWindowMax();
JackB 0:cc1fb45bc3ad 698 if ((w + 2) < hor) { // x offset to next char
JackB 0:cc1fb45bc3ad 699 char_x += w + 2;
JackB 0:cc1fb45bc3ad 700 } else char_x += hor;
JackB 0:cc1fb45bc3ad 701 }
JackB 0:cc1fb45bc3ad 702
JackB 0:cc1fb45bc3ad 703 void TFT_22_ILI9225::foreground(uint16_t colour) {
JackB 0:cc1fb45bc3ad 704 _foreground = colour;
JackB 0:cc1fb45bc3ad 705 }
JackB 0:cc1fb45bc3ad 706
JackB 0:cc1fb45bc3ad 707 void TFT_22_ILI9225::background(uint16_t colour) {
JackB 0:cc1fb45bc3ad 708 _background = colour;
JackB 0:cc1fb45bc3ad 709 }
JackB 0:cc1fb45bc3ad 710
JackB 0:cc1fb45bc3ad 711 void TFT_22_ILI9225::locate(int x, int y)
JackB 0:cc1fb45bc3ad 712 {
JackB 0:cc1fb45bc3ad 713 char_x = x;
JackB 0:cc1fb45bc3ad 714 char_y = y;
JackB 0:cc1fb45bc3ad 715 }
JackB 0:cc1fb45bc3ad 716
JackB 0:cc1fb45bc3ad 717 void TFT_22_ILI9225::gotoxy(int x, int y)
JackB 0:cc1fb45bc3ad 718 {
JackB 0:cc1fb45bc3ad 719 char_x = x * font[FONT_HORZ];
JackB 0:cc1fb45bc3ad 720 char_y = y * (font[FONT_VERT] + char_line_spacing);
JackB 0:cc1fb45bc3ad 721 }
JackB 0:cc1fb45bc3ad 722
JackB 0:cc1fb45bc3ad 723 void TFT_22_ILI9225::home(void)
JackB 0:cc1fb45bc3ad 724 {
JackB 0:cc1fb45bc3ad 725 gotoxy(0, 0);
JackB 0:cc1fb45bc3ad 726 }
JackB 0:cc1fb45bc3ad 727
JackB 0:cc1fb45bc3ad 728 void TFT_22_ILI9225::linespacing(int line_spacing)
JackB 0:cc1fb45bc3ad 729 {
JackB 0:cc1fb45bc3ad 730 char_line_spacing = line_spacing;
JackB 0:cc1fb45bc3ad 731 }
JackB 0:cc1fb45bc3ad 732
JackB 0:cc1fb45bc3ad 733 int TFT_22_ILI9225::columns()
JackB 0:cc1fb45bc3ad 734 {
JackB 0:cc1fb45bc3ad 735 return width() / font[FONT_HORZ];
JackB 0:cc1fb45bc3ad 736 }
JackB 0:cc1fb45bc3ad 737
JackB 0:cc1fb45bc3ad 738 int TFT_22_ILI9225::rows()
JackB 0:cc1fb45bc3ad 739 {
JackB 0:cc1fb45bc3ad 740 return height() / font[FONT_VERT];
JackB 0:cc1fb45bc3ad 741 }
JackB 0:cc1fb45bc3ad 742
JackB 0:cc1fb45bc3ad 743 //----------------------------------------------------------------------------------------------------
JackB 0:cc1fb45bc3ad 744 //************************************* ECA 2.8 inch LCD Module **************************************
JackB 0:cc1fb45bc3ad 745 //----------------------------------------------------------------------------------------------------
JackB 0:cc1fb45bc3ad 746 // Description : Draws a beveled figure on the screen.
JackB 0:cc1fb45bc3ad 747 // Input : x0, y0 - coordinate position of the upper left center
JackB 0:cc1fb45bc3ad 748 // : x1, y1 - coordinate position of the lower right center
JackB 0:cc1fb45bc3ad 749 // : rad - defines the redius of the circle,
JackB 0:cc1fb45bc3ad 750 // : fill - fill yes or no
JackB 0:cc1fb45bc3ad 751 //----------------------------------------------------------------------------------------------------
JackB 0:cc1fb45bc3ad 752 void TFT_22_ILI9225::roundRectangle(int x0, int y0, int x1, int y1, int rad, bool fill, int color)
JackB 0:cc1fb45bc3ad 753 {
JackB 0:cc1fb45bc3ad 754 signed int a, b, P;
JackB 0:cc1fb45bc3ad 755
JackB 0:cc1fb45bc3ad 756 a = 0; // increment by 1
JackB 0:cc1fb45bc3ad 757 b = rad; // decrement by 1 using P
JackB 0:cc1fb45bc3ad 758 P = 1 - rad;
JackB 0:cc1fb45bc3ad 759
JackB 0:cc1fb45bc3ad 760
JackB 0:cc1fb45bc3ad 761 if (fill)
JackB 0:cc1fb45bc3ad 762 {
JackB 0:cc1fb45bc3ad 763 fillRectangle(x0, y0 + rad, x1, y1 - rad, color);
JackB 0:cc1fb45bc3ad 764
JackB 0:cc1fb45bc3ad 765 do
JackB 0:cc1fb45bc3ad 766 {
JackB 0:cc1fb45bc3ad 767 fillRectangle(x0 - a + rad, y0 - b + rad, a + x1 - rad, y0 - b + rad, color); // 8 --> 1
JackB 0:cc1fb45bc3ad 768 fillRectangle(x0 - b + rad, y0 - a + rad, b + x1 - rad, y0 - a + rad, color); // 7 --> 2
JackB 0:cc1fb45bc3ad 769 fillRectangle(x0 - b + rad, a + y1 - rad, b + x1 - rad, a + y1 - rad, color); // 6 --> 3
JackB 0:cc1fb45bc3ad 770 fillRectangle(x0 - a + rad, b + y1 - rad, a + x1 - rad, b + y1 - rad, color); // 5 --> 4
JackB 0:cc1fb45bc3ad 771
JackB 0:cc1fb45bc3ad 772 if (P < 0)
JackB 0:cc1fb45bc3ad 773 P += 3 + 2 * a++;
JackB 0:cc1fb45bc3ad 774 else
JackB 0:cc1fb45bc3ad 775 P += 5 + 2 * (a++ - b--);
JackB 0:cc1fb45bc3ad 776
JackB 0:cc1fb45bc3ad 777 } while (a <= b);
JackB 0:cc1fb45bc3ad 778 } //fill
JackB 0:cc1fb45bc3ad 779 else
JackB 0:cc1fb45bc3ad 780 {
JackB 0:cc1fb45bc3ad 781 fillRectangle(x0 + rad, y0, x1 - rad, y0, color); // top
JackB 0:cc1fb45bc3ad 782 fillRectangle(x0 + rad, y1, x1 - rad, y1, color); // bottom
JackB 0:cc1fb45bc3ad 783 fillRectangle(x0, y0 + rad, x0, y1 - rad, color); // left
JackB 0:cc1fb45bc3ad 784 fillRectangle(x1, y0 + rad, x1, y1 - rad, color); // right
JackB 0:cc1fb45bc3ad 785
JackB 0:cc1fb45bc3ad 786 do
JackB 0:cc1fb45bc3ad 787 {
JackB 0:cc1fb45bc3ad 788 drawPixel(a + x1 - rad, y0 - b + rad, color); // `````` Segment 1
JackB 0:cc1fb45bc3ad 789 drawPixel(b + x1 - rad, y0 - a + rad, color); // `````` Segment 2
JackB 0:cc1fb45bc3ad 790
JackB 0:cc1fb45bc3ad 791 drawPixel(b + x1 - rad, a + y1 - rad, color); // `````` Segment 3
JackB 0:cc1fb45bc3ad 792 drawPixel(a + x1 - rad, b + y1 - rad, color); // `````` Segment 4
JackB 0:cc1fb45bc3ad 793
JackB 0:cc1fb45bc3ad 794 drawPixel(x0 - a + rad, b + y1 - rad, color); // `````` Segment 5
JackB 0:cc1fb45bc3ad 795 drawPixel(x0 - b + rad, a + y1 - rad, color); // `````` Segment 6
JackB 0:cc1fb45bc3ad 796
JackB 0:cc1fb45bc3ad 797 drawPixel(x0 - b + rad, y0 - a + rad, color); // `````` Segment 7
JackB 0:cc1fb45bc3ad 798 drawPixel(x0 - a + rad, y0 - b + rad, color); // `````` Segment 8
JackB 0:cc1fb45bc3ad 799
JackB 0:cc1fb45bc3ad 800 if (P < 0)
JackB 0:cc1fb45bc3ad 801 P += 3 + 2 * a++;
JackB 0:cc1fb45bc3ad 802 else
JackB 0:cc1fb45bc3ad 803 P += 5 + 2 * (a++ - b--);
JackB 0:cc1fb45bc3ad 804 } while (a <= b);
JackB 0:cc1fb45bc3ad 805 } //no fill
JackB 0:cc1fb45bc3ad 806 } //RoundRectangle
JackB 0:cc1fb45bc3ad 807
JackB 0:cc1fb45bc3ad 808 //----------------------------------------------------------------------------------------------------
JackB 0:cc1fb45bc3ad 809 //************************************* ECA 2.8 inch LCD Module **************************************
JackB 0:cc1fb45bc3ad 810 //----------------------------------------------------------------------------------------------------
JackB 0:cc1fb45bc3ad 811 // Make an ascii string from an unicode string
JackB 0:cc1fb45bc3ad 812 //----------------------------------------------------------------------------------------------------
JackB 0:cc1fb45bc3ad 813
JackB 0:cc1fb45bc3ad 814 void TFT_22_ILI9225::unicode2ascii(char *uni_str, char *ascii_str)
JackB 0:cc1fb45bc3ad 815 {
JackB 0:cc1fb45bc3ad 816 int counter = 0;
JackB 0:cc1fb45bc3ad 817 int Uch = 0;
JackB 0:cc1fb45bc3ad 818 char chl, chh;
JackB 0:cc1fb45bc3ad 819
JackB 0:cc1fb45bc3ad 820
JackB 0:cc1fb45bc3ad 821 while (*uni_str)
JackB 0:cc1fb45bc3ad 822 {
JackB 0:cc1fb45bc3ad 823 chl = *uni_str++;
JackB 0:cc1fb45bc3ad 824 chh = *uni_str++;
JackB 0:cc1fb45bc3ad 825
JackB 0:cc1fb45bc3ad 826 Uch = 0;
JackB 0:cc1fb45bc3ad 827 Uch = ((Uch | chh) << 8) | chl;
JackB 0:cc1fb45bc3ad 828
JackB 0:cc1fb45bc3ad 829 if (Uch > 1574 && Uch < 1591)
JackB 0:cc1fb45bc3ad 830 *(ascii_str + counter) = (char)(Uch - 1376);
JackB 0:cc1fb45bc3ad 831 else if (Uch > 1590 && Uch < 1595)
JackB 0:cc1fb45bc3ad 832 *(ascii_str + counter) = (char)(Uch - 1375);
JackB 0:cc1fb45bc3ad 833 else if (Uch > 1600 && Uch < 1603)
JackB 0:cc1fb45bc3ad 834 *(ascii_str + counter) = (char)(Uch - 1380);
JackB 0:cc1fb45bc3ad 835 else if (Uch == 1705)
JackB 0:cc1fb45bc3ad 836 *(ascii_str + counter) = (char)(Uch - 1482);
JackB 0:cc1fb45bc3ad 837 else if (Uch == 1604)
JackB 0:cc1fb45bc3ad 838 *(ascii_str + counter) = (char)(Uch - 1379);
JackB 0:cc1fb45bc3ad 839 else if (Uch > 1604 && Uch < 1609)
JackB 0:cc1fb45bc3ad 840 *(ascii_str + counter) = (char)(Uch - 1378);
JackB 0:cc1fb45bc3ad 841 else if (Uch == 1740)
JackB 0:cc1fb45bc3ad 842 *(ascii_str + counter) = (char)(Uch - 1503);
JackB 0:cc1fb45bc3ad 843 else if (Uch == 1574)
JackB 0:cc1fb45bc3ad 844 *(ascii_str + counter) = (char)(Uch - 1381);
JackB 0:cc1fb45bc3ad 845 else if (Uch == 1662)
JackB 0:cc1fb45bc3ad 846 *(ascii_str + counter) = (char)(Uch - 1533);
JackB 0:cc1fb45bc3ad 847 else if (Uch == 1670)
JackB 0:cc1fb45bc3ad 848 *(ascii_str + counter) = (char)(Uch - 1529);
JackB 0:cc1fb45bc3ad 849 else if (Uch == 1688)
JackB 0:cc1fb45bc3ad 850 *(ascii_str + counter) = (char)(Uch - 1546);
JackB 0:cc1fb45bc3ad 851 else if (Uch == 1711)
JackB 0:cc1fb45bc3ad 852 *(ascii_str + counter) = (char)(Uch - 1567);
JackB 0:cc1fb45bc3ad 853 else if (Uch == 1570)
JackB 0:cc1fb45bc3ad 854 *(ascii_str + counter) = (char)(Uch - 1376);
JackB 0:cc1fb45bc3ad 855 else if (Uch > 1631 && Uch < 1642)
JackB 0:cc1fb45bc3ad 856 *(ascii_str + counter) = (char)(Uch - 1584);
JackB 0:cc1fb45bc3ad 857 else if (Uch == 65536)
JackB 0:cc1fb45bc3ad 858 *(ascii_str + counter) = NULL;
JackB 0:cc1fb45bc3ad 859 else
JackB 0:cc1fb45bc3ad 860 *(ascii_str + counter) = (char)Uch;
JackB 0:cc1fb45bc3ad 861
JackB 0:cc1fb45bc3ad 862
JackB 0:cc1fb45bc3ad 863 counter++;
JackB 0:cc1fb45bc3ad 864
JackB 0:cc1fb45bc3ad 865 }
JackB 0:cc1fb45bc3ad 866 *(ascii_str + counter) = NULL;
JackB 0:cc1fb45bc3ad 867
JackB 0:cc1fb45bc3ad 868 }
JackB 0:cc1fb45bc3ad 869