Library to drive an ILI9225 2.2" SPI TFT.

Dependents:   ILI9225_TFT_Sample

ILI9225 SPI TFT Library

/media/uploads/Arman92/ili9225_tft_front-1-.jpg

This library works with the ILI9225 based 2.2" 176x220 TFT LCD shields commonly found on eBay. Note that there is a commonly available 2.2" 240x320 TFT module very similar in appearance but using the ILI9341 driver. (Only the main Buffer IC and I/O pins are different)

Sample Usage program

Wiring guide :

mbed boardLCD board
+ 3,3V or +5VVCC
GNDGND
GPIO_PINRST (Reset pin)
GPIO_PINRS [Command (RS=0)/ Parameter (RS=1)]
GPIO_PIN or GNDCS (Chip selection pin)
SPI_MOSISDI (Serial data input )
SPI_SCKCLK (Reference clock)
GPIO_PIN or PWM or VCCLED (Backlit)
Committer:
Arman92
Date:
Mon Aug 31 05:05:09 2015 +0000
Revision:
0:e97881aef140
Child:
1:73bf39f23246
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Arman92 0:e97881aef140 1 /*
Arman92 0:e97881aef140 2 **************** ******************
Arman92 0:e97881aef140 3
Arman92 0:e97881aef140 4 Ported to mbed platform
Arman92 0:e97881aef140 5 Added Persian Support
Arman92 0:e97881aef140 6
Arman92 0:e97881aef140 7 by Arman Safikhani 31 - 08-2015
Arman92 0:e97881aef140 8
Arman92 0:e97881aef140 9 * *************** ******************
Arman92 0:e97881aef140 10 */
Arman92 0:e97881aef140 11
Arman92 0:e97881aef140 12
Arman92 0:e97881aef140 13
Arman92 0:e97881aef140 14
Arman92 0:e97881aef140 15 #include "TFT_22_ILI9225.h"
Arman92 0:e97881aef140 16 #define bitRead(value, bit) (((value) >> (bit)) & 0x01)
Arman92 0:e97881aef140 17
Arman92 0:e97881aef140 18 int font_color, x_font, y_font;
Arman92 0:e97881aef140 19 char highlight, fa_num;
Arman92 0:e97881aef140 20 int effect = 0, italic = 0;
Arman92 0:e97881aef140 21 unsigned int highlight_color;
Arman92 0:e97881aef140 22 /* Global Variables */
Arman92 0:e97881aef140 23 int x_text = 0, y_text = 0;
Arman92 0:e97881aef140 24 int x_base = 0;
Arman92 0:e97881aef140 25
Arman92 0:e97881aef140 26 // Constructor when using software SPI. All output pins are configurable.
Arman92 0:e97881aef140 27 TFT_22_ILI9225::TFT_22_ILI9225(PinName rst, PinName rs, PinName cs, PinName sdi, PinName clk, PinName led) :
Arman92 0:e97881aef140 28 _rst(rst), _rs(rs), _cs(cs), _sdi(sdi), _clk(clk), spi(sdi, NC, clk), _led(led),
Arman92 0:e97881aef140 29 _rstInOut(_rst), _rsInOut(_rs), _csInOut(_cs), _ledInOut(_led),
Arman92 0:e97881aef140 30 hwSPI(false)
Arman92 0:e97881aef140 31 {
Arman92 0:e97881aef140 32 }
Arman92 0:e97881aef140 33
Arman92 0:e97881aef140 34 // Constructor when using hardware SPI. Faster, but must use SPI pins
Arman92 0:e97881aef140 35 // specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.)
Arman92 0:e97881aef140 36 //TFT_22_ILI9225::TFT_22_ILI9225(PinName rst, PinName rs, PinName cs, PinName led) :
Arman92 0:e97881aef140 37 // _rst(rst), _rs(rs), _cs(cs), _sdi(NC), _clk(NC), _led(led),
Arman92 0:e97881aef140 38 // _rstInOut(_rst), _rsInOut(_rs), _csInOut(_cs), _ledInOut(_led),
Arman92 0:e97881aef140 39 // hwSPI(true), spi(SPI_MOSI, NC, SPI_SCK)
Arman92 0:e97881aef140 40 //{
Arman92 0:e97881aef140 41 //}
Arman92 0:e97881aef140 42
Arman92 0:e97881aef140 43
Arman92 0:e97881aef140 44
Arman92 0:e97881aef140 45
Arman92 0:e97881aef140 46 void TFT_22_ILI9225::_orientCoordinates(uint16_t &x1, uint16_t &y1) {
Arman92 0:e97881aef140 47
Arman92 0:e97881aef140 48 switch (_orientation) {
Arman92 0:e97881aef140 49 case 0: // ok
Arman92 0:e97881aef140 50 break;
Arman92 0:e97881aef140 51 case 1: // ok
Arman92 0:e97881aef140 52 y1 = _maxY - y1 - 1;
Arman92 0:e97881aef140 53 _swap(x1, y1);
Arman92 0:e97881aef140 54 break;
Arman92 0:e97881aef140 55 case 2: // ok
Arman92 0:e97881aef140 56 x1 = _maxX - x1 - 1;
Arman92 0:e97881aef140 57 y1 = _maxY - y1 - 1;
Arman92 0:e97881aef140 58 break;
Arman92 0:e97881aef140 59 case 3: // ok
Arman92 0:e97881aef140 60 x1 = _maxX - x1 - 1;
Arman92 0:e97881aef140 61 _swap(x1, y1);
Arman92 0:e97881aef140 62 break;
Arman92 0:e97881aef140 63 }
Arman92 0:e97881aef140 64 }
Arman92 0:e97881aef140 65
Arman92 0:e97881aef140 66
Arman92 0:e97881aef140 67 void TFT_22_ILI9225::_setWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
Arman92 0:e97881aef140 68 _orientCoordinates(x0, y0);
Arman92 0:e97881aef140 69 _orientCoordinates(x1, y1);
Arman92 0:e97881aef140 70
Arman92 0:e97881aef140 71 if (x1 < x0) _swap(x0, x1);
Arman92 0:e97881aef140 72 if (y1 < y0) _swap(y0, y1);
Arman92 0:e97881aef140 73
Arman92 0:e97881aef140 74 _writeRegister(ILI9225_HORIZONTAL_WINDOW_ADDR1, x1);
Arman92 0:e97881aef140 75 _writeRegister(ILI9225_HORIZONTAL_WINDOW_ADDR2, x0);
Arman92 0:e97881aef140 76
Arman92 0:e97881aef140 77 _writeRegister(ILI9225_VERTICAL_WINDOW_ADDR1, y1);
Arman92 0:e97881aef140 78 _writeRegister(ILI9225_VERTICAL_WINDOW_ADDR2, y0);
Arman92 0:e97881aef140 79
Arman92 0:e97881aef140 80 _writeRegister(ILI9225_RAM_ADDR_SET1, x0);
Arman92 0:e97881aef140 81 _writeRegister(ILI9225_RAM_ADDR_SET2, y0);
Arman92 0:e97881aef140 82
Arman92 0:e97881aef140 83 _writeCommand(0x00, 0x22);
Arman92 0:e97881aef140 84 }
Arman92 0:e97881aef140 85
Arman92 0:e97881aef140 86
Arman92 0:e97881aef140 87 void TFT_22_ILI9225::begin() {
Arman92 0:e97881aef140 88
Arman92 0:e97881aef140 89 // Set up pins
Arman92 0:e97881aef140 90
Arman92 0:e97881aef140 91
Arman92 0:e97881aef140 92 _rsInOut.output();
Arman92 0:e97881aef140 93 _csInOut.output();
Arman92 0:e97881aef140 94 _rstInOut.output();
Arman92 0:e97881aef140 95
Arman92 0:e97881aef140 96 if (_led) _ledInOut.output();
Arman92 0:e97881aef140 97
Arman92 0:e97881aef140 98 if (hwSPI) { // Using hardware SPI
Arman92 0:e97881aef140 99 spi.frequency(16000000);
Arman92 0:e97881aef140 100 spi.format(8, 0);
Arman92 0:e97881aef140 101
Arman92 0:e97881aef140 102 }
Arman92 0:e97881aef140 103 else {
Arman92 0:e97881aef140 104 DigitalInOut _clkInOut(_clk);
Arman92 0:e97881aef140 105 _clkInOut.output();
Arman92 0:e97881aef140 106 DigitalInOut _sdiInOut(_sdi);
Arman92 0:e97881aef140 107 _sdiInOut.output();
Arman92 0:e97881aef140 108 }
Arman92 0:e97881aef140 109
Arman92 0:e97881aef140 110 // Turn on backlight
Arman92 0:e97881aef140 111 if (_led) _ledInOut = 1;
Arman92 0:e97881aef140 112
Arman92 0:e97881aef140 113 // Initialization Code
Arman92 0:e97881aef140 114 _rstInOut = 1; // Pull the reset pin high to release the ILI9225C from the reset status
Arman92 0:e97881aef140 115 wait_ms(1);
Arman92 0:e97881aef140 116 _rstInOut = 0;// Pull the reset pin low to reset ILI9225
Arman92 0:e97881aef140 117 wait_ms(10);
Arman92 0:e97881aef140 118 _rstInOut = 1;// Pull the reset pin high to release the ILI9225C from the reset status
Arman92 0:e97881aef140 119 wait_ms(50);
Arman92 0:e97881aef140 120
Arman92 0:e97881aef140 121 /* Start Initial Sequence */
Arman92 0:e97881aef140 122 /* Set SS bit and direction output from S528 to S1 */
Arman92 0:e97881aef140 123 _writeRegister(ILI9225_POWER_CTRL1, 0x0000); // Set SAP,DSTB,STB
Arman92 0:e97881aef140 124 _writeRegister(ILI9225_POWER_CTRL2, 0x0000); // Set APON,PON,AON,VCI1EN,VC
Arman92 0:e97881aef140 125 _writeRegister(ILI9225_POWER_CTRL3, 0x0000); // Set BT,DC1,DC2,DC3
Arman92 0:e97881aef140 126 _writeRegister(ILI9225_POWER_CTRL4, 0x0000); // Set GVDD
Arman92 0:e97881aef140 127 _writeRegister(ILI9225_POWER_CTRL5, 0x0000); // Set VCOMH/VCOML voltage
Arman92 0:e97881aef140 128 wait_ms(40);
Arman92 0:e97881aef140 129
Arman92 0:e97881aef140 130 // Power-on sequence
Arman92 0:e97881aef140 131 _writeRegister(ILI9225_POWER_CTRL2, 0x0018); // Set APON,PON,AON,VCI1EN,VC
Arman92 0:e97881aef140 132 _writeRegister(ILI9225_POWER_CTRL3, 0x6121); // Set BT,DC1,DC2,DC3
Arman92 0:e97881aef140 133 _writeRegister(ILI9225_POWER_CTRL4, 0x006F); // Set GVDD /*007F 0088 */
Arman92 0:e97881aef140 134 _writeRegister(ILI9225_POWER_CTRL5, 0x495F); // Set VCOMH/VCOML voltage
Arman92 0:e97881aef140 135 _writeRegister(ILI9225_POWER_CTRL1, 0x0800); // Set SAP,DSTB,STB
Arman92 0:e97881aef140 136 wait_ms(10);
Arman92 0:e97881aef140 137 _writeRegister(ILI9225_POWER_CTRL2, 0x103B); // Set APON,PON,AON,VCI1EN,VC
Arman92 0:e97881aef140 138 wait_ms(50);
Arman92 0:e97881aef140 139
Arman92 0:e97881aef140 140 _writeRegister(ILI9225_DRIVER_OUTPUT_CTRL, 0x011C); // set the display line number and display direction
Arman92 0:e97881aef140 141 _writeRegister(ILI9225_LCD_AC_DRIVING_CTRL, 0x0100); // set 1 line inversion
Arman92 0:e97881aef140 142 _writeRegister(ILI9225_ENTRY_MODE, 0x1030); // set GRAM write direction and BGR=1.
Arman92 0:e97881aef140 143 _writeRegister(ILI9225_DISP_CTRL1, 0x0000); // Display off
Arman92 0:e97881aef140 144 _writeRegister(ILI9225_BLANK_PERIOD_CTRL1, 0x0808); // set the back porch and front porch
Arman92 0:e97881aef140 145 _writeRegister(ILI9225_FRAME_CYCLE_CTRL, 0x1100); // set the clocks number per line
Arman92 0:e97881aef140 146 _writeRegister(ILI9225_INTERFACE_CTRL, 0x0000); // CPU interface
Arman92 0:e97881aef140 147 _writeRegister(ILI9225_OSC_CTRL, 0x0D01); // Set Osc /*0e01*/
Arman92 0:e97881aef140 148 _writeRegister(ILI9225_VCI_RECYCLING, 0x0020); // Set VCI recycling
Arman92 0:e97881aef140 149 _writeRegister(ILI9225_RAM_ADDR_SET1, 0x0000); // RAM Address
Arman92 0:e97881aef140 150 _writeRegister(ILI9225_RAM_ADDR_SET2, 0x0000); // RAM Address
Arman92 0:e97881aef140 151
Arman92 0:e97881aef140 152 /* Set GRAM area */
Arman92 0:e97881aef140 153 _writeRegister(ILI9225_GATE_SCAN_CTRL, 0x0000);
Arman92 0:e97881aef140 154 _writeRegister(ILI9225_VERTICAL_SCROLL_CTRL1, 0x00DB);
Arman92 0:e97881aef140 155 _writeRegister(ILI9225_VERTICAL_SCROLL_CTRL2, 0x0000);
Arman92 0:e97881aef140 156 _writeRegister(ILI9225_VERTICAL_SCROLL_CTRL3, 0x0000);
Arman92 0:e97881aef140 157 _writeRegister(ILI9225_PARTIAL_DRIVING_POS1, 0x00DB);
Arman92 0:e97881aef140 158 _writeRegister(ILI9225_PARTIAL_DRIVING_POS2, 0x0000);
Arman92 0:e97881aef140 159 _writeRegister(ILI9225_HORIZONTAL_WINDOW_ADDR1, 0x00AF);
Arman92 0:e97881aef140 160 _writeRegister(ILI9225_HORIZONTAL_WINDOW_ADDR2, 0x0000);
Arman92 0:e97881aef140 161 _writeRegister(ILI9225_VERTICAL_WINDOW_ADDR1, 0x00DB);
Arman92 0:e97881aef140 162 _writeRegister(ILI9225_VERTICAL_WINDOW_ADDR2, 0x0000);
Arman92 0:e97881aef140 163
Arman92 0:e97881aef140 164 /* Set GAMMA curve */
Arman92 0:e97881aef140 165 _writeRegister(ILI9225_GAMMA_CTRL1, 0x0000);
Arman92 0:e97881aef140 166 _writeRegister(ILI9225_GAMMA_CTRL2, 0x0808);
Arman92 0:e97881aef140 167 _writeRegister(ILI9225_GAMMA_CTRL3, 0x080A);
Arman92 0:e97881aef140 168 _writeRegister(ILI9225_GAMMA_CTRL4, 0x000A);
Arman92 0:e97881aef140 169 _writeRegister(ILI9225_GAMMA_CTRL5, 0x0A08);
Arman92 0:e97881aef140 170 _writeRegister(ILI9225_GAMMA_CTRL6, 0x0808);
Arman92 0:e97881aef140 171 _writeRegister(ILI9225_GAMMA_CTRL7, 0x0000);
Arman92 0:e97881aef140 172 _writeRegister(ILI9225_GAMMA_CTRL8, 0x0A00);
Arman92 0:e97881aef140 173 _writeRegister(ILI9225_GAMMA_CTRL9, 0x0710);
Arman92 0:e97881aef140 174 _writeRegister(ILI9225_GAMMA_CTRL10, 0x0710);
Arman92 0:e97881aef140 175
Arman92 0:e97881aef140 176 _writeRegister(ILI9225_DISP_CTRL1, 0x0012);
Arman92 0:e97881aef140 177 wait_ms(50);
Arman92 0:e97881aef140 178 _writeRegister(ILI9225_DISP_CTRL1, 0x1017);
Arman92 0:e97881aef140 179
Arman92 0:e97881aef140 180 setBacklight(true);
Arman92 0:e97881aef140 181 setOrientation(0);
Arman92 0:e97881aef140 182
Arman92 0:e97881aef140 183 // Initialize variables
Arman92 0:e97881aef140 184 setBackgroundColor(COLOR_BLACK);
Arman92 0:e97881aef140 185
Arman92 0:e97881aef140 186 clear();
Arman92 0:e97881aef140 187 }
Arman92 0:e97881aef140 188
Arman92 0:e97881aef140 189
Arman92 0:e97881aef140 190 void TFT_22_ILI9225::clear() {
Arman92 0:e97881aef140 191 uint8_t old = _orientation;
Arman92 0:e97881aef140 192 setOrientation(0);
Arman92 0:e97881aef140 193 fillRectangle(0, 0, _maxX - 1, _maxY - 1, COLOR_BLACK);
Arman92 0:e97881aef140 194 setOrientation(old);
Arman92 0:e97881aef140 195 wait_ms(10);
Arman92 0:e97881aef140 196 }
Arman92 0:e97881aef140 197
Arman92 0:e97881aef140 198 void TFT_22_ILI9225::fill(uint16_t color)
Arman92 0:e97881aef140 199 {
Arman92 0:e97881aef140 200 fillRectangle(0, 0, _maxX - 1, _maxY - 1, color);
Arman92 0:e97881aef140 201 }
Arman92 0:e97881aef140 202
Arman92 0:e97881aef140 203
Arman92 0:e97881aef140 204 void TFT_22_ILI9225::invert(bool flag) {
Arman92 0:e97881aef140 205 _writeCommand(0x00, flag ? ILI9225C_INVON : ILI9225C_INVOFF);
Arman92 0:e97881aef140 206 }
Arman92 0:e97881aef140 207
Arman92 0:e97881aef140 208
Arman92 0:e97881aef140 209 void TFT_22_ILI9225::setBacklight(bool flag) {
Arman92 0:e97881aef140 210 if (_led) _ledInOut = flag ? 1 : 0;
Arman92 0:e97881aef140 211 }
Arman92 0:e97881aef140 212
Arman92 0:e97881aef140 213
Arman92 0:e97881aef140 214 void TFT_22_ILI9225::setDisplay(bool flag) {
Arman92 0:e97881aef140 215 if (flag) {
Arman92 0:e97881aef140 216 _writeRegister(0x00ff, 0x0000);
Arman92 0:e97881aef140 217 _writeRegister(ILI9225_POWER_CTRL1, 0x0000);
Arman92 0:e97881aef140 218 wait_ms(50);
Arman92 0:e97881aef140 219 _writeRegister(ILI9225_DISP_CTRL1, 0x1017);
Arman92 0:e97881aef140 220 wait_ms(200);
Arman92 0:e97881aef140 221 }
Arman92 0:e97881aef140 222 else {
Arman92 0:e97881aef140 223 _writeRegister(0x00ff, 0x0000);
Arman92 0:e97881aef140 224 _writeRegister(ILI9225_DISP_CTRL1, 0x0000);
Arman92 0:e97881aef140 225 wait_ms(50);
Arman92 0:e97881aef140 226 _writeRegister(ILI9225_POWER_CTRL1, 0x0003);
Arman92 0:e97881aef140 227 wait_ms(200);
Arman92 0:e97881aef140 228 }
Arman92 0:e97881aef140 229 }
Arman92 0:e97881aef140 230
Arman92 0:e97881aef140 231
Arman92 0:e97881aef140 232 void TFT_22_ILI9225::setOrientation(uint8_t orientation) {
Arman92 0:e97881aef140 233
Arman92 0:e97881aef140 234 _orientation = orientation % 4;
Arman92 0:e97881aef140 235
Arman92 0:e97881aef140 236 switch (_orientation) {
Arman92 0:e97881aef140 237 case 0:
Arman92 0:e97881aef140 238 _maxX = ILI9225_LCD_WIDTH;
Arman92 0:e97881aef140 239 _maxY = ILI9225_LCD_HEIGHT;
Arman92 0:e97881aef140 240 break;
Arman92 0:e97881aef140 241 case 1:
Arman92 0:e97881aef140 242 _maxX = ILI9225_LCD_HEIGHT;
Arman92 0:e97881aef140 243 _maxY = ILI9225_LCD_WIDTH;
Arman92 0:e97881aef140 244 break;
Arman92 0:e97881aef140 245 case 2:
Arman92 0:e97881aef140 246 _maxX = ILI9225_LCD_WIDTH;
Arman92 0:e97881aef140 247 _maxY = ILI9225_LCD_HEIGHT;
Arman92 0:e97881aef140 248 break;
Arman92 0:e97881aef140 249 case 3:
Arman92 0:e97881aef140 250 _maxX = ILI9225_LCD_HEIGHT;
Arman92 0:e97881aef140 251 _maxY = ILI9225_LCD_WIDTH;
Arman92 0:e97881aef140 252 break;
Arman92 0:e97881aef140 253 }
Arman92 0:e97881aef140 254 }
Arman92 0:e97881aef140 255
Arman92 0:e97881aef140 256
Arman92 0:e97881aef140 257 uint8_t TFT_22_ILI9225::getOrientation() {
Arman92 0:e97881aef140 258 return _orientation;
Arman92 0:e97881aef140 259 }
Arman92 0:e97881aef140 260
Arman92 0:e97881aef140 261
Arman92 0:e97881aef140 262 void TFT_22_ILI9225::drawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) {
Arman92 0:e97881aef140 263 drawLine(x1, y1, x1, y2, color);
Arman92 0:e97881aef140 264 drawLine(x1, y1, x2, y1, color);
Arman92 0:e97881aef140 265 drawLine(x1, y2, x2, y2, color);
Arman92 0:e97881aef140 266 drawLine(x2, y1, x2, y2, color);
Arman92 0:e97881aef140 267 }
Arman92 0:e97881aef140 268
Arman92 0:e97881aef140 269
Arman92 0:e97881aef140 270 void TFT_22_ILI9225::fillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) {
Arman92 0:e97881aef140 271
Arman92 0:e97881aef140 272 _setWindow(x1, y1, x2, y2);
Arman92 0:e97881aef140 273
Arman92 0:e97881aef140 274 for (uint16_t t = (y2 - y1 + 1) * (x2 - x1 + 1); t > 0; t--)
Arman92 0:e97881aef140 275 _writeData(color >> 8, color);
Arman92 0:e97881aef140 276 }
Arman92 0:e97881aef140 277
Arman92 0:e97881aef140 278
Arman92 0:e97881aef140 279 void TFT_22_ILI9225::drawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) {
Arman92 0:e97881aef140 280
Arman92 0:e97881aef140 281 int16_t f = 1 - r;
Arman92 0:e97881aef140 282 int16_t ddF_x = 1;
Arman92 0:e97881aef140 283 int16_t ddF_y = -2 * r;
Arman92 0:e97881aef140 284 int16_t x = 0;
Arman92 0:e97881aef140 285 int16_t y = r;
Arman92 0:e97881aef140 286
Arman92 0:e97881aef140 287 drawPixel(x0, y0 + r, color);
Arman92 0:e97881aef140 288 drawPixel(x0, y0 - r, color);
Arman92 0:e97881aef140 289 drawPixel(x0 + r, y0, color);
Arman92 0:e97881aef140 290 drawPixel(x0 - r, y0, color);
Arman92 0:e97881aef140 291
Arman92 0:e97881aef140 292 while (x < y) {
Arman92 0:e97881aef140 293 if (f >= 0) {
Arman92 0:e97881aef140 294 y--;
Arman92 0:e97881aef140 295 ddF_y += 2;
Arman92 0:e97881aef140 296 f += ddF_y;
Arman92 0:e97881aef140 297 }
Arman92 0:e97881aef140 298 x++;
Arman92 0:e97881aef140 299 ddF_x += 2;
Arman92 0:e97881aef140 300 f += ddF_x;
Arman92 0:e97881aef140 301
Arman92 0:e97881aef140 302 drawPixel(x0 + x, y0 + y, color);
Arman92 0:e97881aef140 303 drawPixel(x0 - x, y0 + y, color);
Arman92 0:e97881aef140 304 drawPixel(x0 + x, y0 - y, color);
Arman92 0:e97881aef140 305 drawPixel(x0 - x, y0 - y, color);
Arman92 0:e97881aef140 306 drawPixel(x0 + y, y0 + x, color);
Arman92 0:e97881aef140 307 drawPixel(x0 - y, y0 + x, color);
Arman92 0:e97881aef140 308 drawPixel(x0 + y, y0 - x, color);
Arman92 0:e97881aef140 309 drawPixel(x0 - y, y0 - x, color);
Arman92 0:e97881aef140 310 }
Arman92 0:e97881aef140 311 }
Arman92 0:e97881aef140 312
Arman92 0:e97881aef140 313
Arman92 0:e97881aef140 314 void TFT_22_ILI9225::fillCircle(uint8_t x0, uint8_t y0, uint8_t radius, uint16_t color) {
Arman92 0:e97881aef140 315
Arman92 0:e97881aef140 316 int16_t f = 1 - radius;
Arman92 0:e97881aef140 317 int16_t ddF_x = 1;
Arman92 0:e97881aef140 318 int16_t ddF_y = -2 * radius;
Arman92 0:e97881aef140 319 int16_t x = 0;
Arman92 0:e97881aef140 320 int16_t y = radius;
Arman92 0:e97881aef140 321
Arman92 0:e97881aef140 322 while (x < y) {
Arman92 0:e97881aef140 323 if (f >= 0) {
Arman92 0:e97881aef140 324 y--;
Arman92 0:e97881aef140 325 ddF_y += 2;
Arman92 0:e97881aef140 326 f += ddF_y;
Arman92 0:e97881aef140 327 }
Arman92 0:e97881aef140 328 x++;
Arman92 0:e97881aef140 329 ddF_x += 2;
Arman92 0:e97881aef140 330 f += ddF_x;
Arman92 0:e97881aef140 331
Arman92 0:e97881aef140 332 drawLine(x0 + x, y0 + y, x0 - x, y0 + y, color); // bottom
Arman92 0:e97881aef140 333 drawLine(x0 + x, y0 - y, x0 - x, y0 - y, color); // top
Arman92 0:e97881aef140 334 drawLine(x0 + y, y0 - x, x0 + y, y0 + x, color); // right
Arman92 0:e97881aef140 335 drawLine(x0 - y, y0 - x, x0 - y, y0 + x, color); // left
Arman92 0:e97881aef140 336 }
Arman92 0:e97881aef140 337 fillRectangle(x0 - x, y0 - y, x0 + x, y0 + y, color);
Arman92 0:e97881aef140 338 }
Arman92 0:e97881aef140 339
Arman92 0:e97881aef140 340
Arman92 0:e97881aef140 341 void TFT_22_ILI9225::drawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) {
Arman92 0:e97881aef140 342
Arman92 0:e97881aef140 343 // Classic Bresenham algorithm
Arman92 0:e97881aef140 344 int16_t steep = abs(y2 - y1) > abs(x2 - x1);
Arman92 0:e97881aef140 345 int16_t dx, dy;
Arman92 0:e97881aef140 346
Arman92 0:e97881aef140 347 if (steep) {
Arman92 0:e97881aef140 348 _swap(x1, y1);
Arman92 0:e97881aef140 349 _swap(x2, y2);
Arman92 0:e97881aef140 350 }
Arman92 0:e97881aef140 351
Arman92 0:e97881aef140 352 if (x1 > x2) {
Arman92 0:e97881aef140 353 _swap(x1, x2);
Arman92 0:e97881aef140 354 _swap(y1, y2);
Arman92 0:e97881aef140 355 }
Arman92 0:e97881aef140 356
Arman92 0:e97881aef140 357 dx = x2 - x1;
Arman92 0:e97881aef140 358 dy = abs(y2 - y1);
Arman92 0:e97881aef140 359
Arman92 0:e97881aef140 360 int16_t err = dx / 2;
Arman92 0:e97881aef140 361 int16_t ystep;
Arman92 0:e97881aef140 362
Arman92 0:e97881aef140 363 if (y1 < y2) ystep = 1;
Arman92 0:e97881aef140 364 else ystep = -1;
Arman92 0:e97881aef140 365
Arman92 0:e97881aef140 366
Arman92 0:e97881aef140 367 for (; x1 <= x2; x1++) {
Arman92 0:e97881aef140 368 if (steep) drawPixel(y1, x1, color);
Arman92 0:e97881aef140 369 else drawPixel(x1, y1, color);
Arman92 0:e97881aef140 370
Arman92 0:e97881aef140 371 err -= dy;
Arman92 0:e97881aef140 372 if (err < 0) {
Arman92 0:e97881aef140 373 y1 += ystep;
Arman92 0:e97881aef140 374 err += dx;
Arman92 0:e97881aef140 375 }
Arman92 0:e97881aef140 376 }
Arman92 0:e97881aef140 377 }
Arman92 0:e97881aef140 378
Arman92 0:e97881aef140 379
Arman92 0:e97881aef140 380 void TFT_22_ILI9225::drawPixel(uint16_t x1, uint16_t y1, uint16_t color) {
Arman92 0:e97881aef140 381
Arman92 0:e97881aef140 382 if ((x1 >= _maxX) || (y1 >= _maxY)) return;
Arman92 0:e97881aef140 383
Arman92 0:e97881aef140 384 _setWindow(x1, y1, x1 + 1, y1 + 1);
Arman92 0:e97881aef140 385 _orientCoordinates(x1, y1);
Arman92 0:e97881aef140 386 _writeData(color >> 8, color);
Arman92 0:e97881aef140 387 }
Arman92 0:e97881aef140 388
Arman92 0:e97881aef140 389
Arman92 0:e97881aef140 390 uint16_t TFT_22_ILI9225::maxX() {
Arman92 0:e97881aef140 391 return _maxX;
Arman92 0:e97881aef140 392 }
Arman92 0:e97881aef140 393
Arman92 0:e97881aef140 394
Arman92 0:e97881aef140 395 uint16_t TFT_22_ILI9225::maxY() {
Arman92 0:e97881aef140 396 return _maxY;
Arman92 0:e97881aef140 397 }
Arman92 0:e97881aef140 398
Arman92 0:e97881aef140 399
Arman92 0:e97881aef140 400 uint16_t TFT_22_ILI9225::setColor(uint8_t red8, uint8_t green8, uint8_t blue8) {
Arman92 0:e97881aef140 401 // rgb16 = red5 green6 blue5
Arman92 0:e97881aef140 402 return (red8 >> 3) << 11 | (green8 >> 2) << 5 | (blue8 >> 3);
Arman92 0:e97881aef140 403 }
Arman92 0:e97881aef140 404
Arman92 0:e97881aef140 405
Arman92 0:e97881aef140 406 void TFT_22_ILI9225::splitColor(uint16_t rgb, uint8_t &red, uint8_t &green, uint8_t &blue) {
Arman92 0:e97881aef140 407 // rgb16 = red5 green6 blue5
Arman92 0:e97881aef140 408
Arman92 0:e97881aef140 409 red = (rgb & 0xF800) >> 11 << 3;
Arman92 0:e97881aef140 410 green = (rgb & 0x7E0) >> 5 << 2;
Arman92 0:e97881aef140 411 blue = (rgb & 0x1F) << 3;
Arman92 0:e97881aef140 412 }
Arman92 0:e97881aef140 413
Arman92 0:e97881aef140 414
Arman92 0:e97881aef140 415 void TFT_22_ILI9225::_swap(uint16_t &a, uint16_t &b) {
Arman92 0:e97881aef140 416 uint16_t w = a;
Arman92 0:e97881aef140 417 a = b;
Arman92 0:e97881aef140 418 b = w;
Arman92 0:e97881aef140 419 }
Arman92 0:e97881aef140 420
Arman92 0:e97881aef140 421 // Utilities
Arman92 0:e97881aef140 422 void TFT_22_ILI9225::_writeCommand(uint8_t HI, uint8_t LO) {
Arman92 0:e97881aef140 423 _rsInOut = 0;
Arman92 0:e97881aef140 424 _csInOut = 0;
Arman92 0:e97881aef140 425 spi.write(HI);
Arman92 0:e97881aef140 426 spi.write(LO);
Arman92 0:e97881aef140 427 _csInOut = 1;
Arman92 0:e97881aef140 428 }
Arman92 0:e97881aef140 429
Arman92 0:e97881aef140 430
Arman92 0:e97881aef140 431 void TFT_22_ILI9225::_writeData(uint8_t HI, uint8_t LO) {
Arman92 0:e97881aef140 432 _rsInOut = 1;
Arman92 0:e97881aef140 433 _csInOut = 0;
Arman92 0:e97881aef140 434 spi.write(HI);
Arman92 0:e97881aef140 435 spi.write(LO);
Arman92 0:e97881aef140 436 _csInOut = 1;
Arman92 0:e97881aef140 437 }
Arman92 0:e97881aef140 438
Arman92 0:e97881aef140 439
Arman92 0:e97881aef140 440 void TFT_22_ILI9225::_writeRegister(uint16_t reg, uint16_t data) {
Arman92 0:e97881aef140 441 _writeCommand(reg >> 8, reg & 255);
Arman92 0:e97881aef140 442 _writeData(data >> 8, data & 255);
Arman92 0:e97881aef140 443 }
Arman92 0:e97881aef140 444
Arman92 0:e97881aef140 445
Arman92 0:e97881aef140 446 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) {
Arman92 0:e97881aef140 447 drawLine(x1, y1, x2, y2, color);
Arman92 0:e97881aef140 448 drawLine(x2, y2, x3, y3, color);
Arman92 0:e97881aef140 449 drawLine(x3, y3, x1, y1, color);
Arman92 0:e97881aef140 450 }
Arman92 0:e97881aef140 451
Arman92 0:e97881aef140 452
Arman92 0:e97881aef140 453 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) {
Arman92 0:e97881aef140 454
Arman92 0:e97881aef140 455 uint16_t a, b, y, last;
Arman92 0:e97881aef140 456
Arman92 0:e97881aef140 457 // Sort coordinates by Y order (y3 >= y2 >= y1)
Arman92 0:e97881aef140 458 if (y1 > y2) {
Arman92 0:e97881aef140 459 _swap(y1, y2); _swap(x1, x2);
Arman92 0:e97881aef140 460 }
Arman92 0:e97881aef140 461 if (y2 > y3) {
Arman92 0:e97881aef140 462 _swap(y3, y2); _swap(x3, x2);
Arman92 0:e97881aef140 463 }
Arman92 0:e97881aef140 464 if (y1 > y2) {
Arman92 0:e97881aef140 465 _swap(y1, y2); _swap(x1, x2);
Arman92 0:e97881aef140 466 }
Arman92 0:e97881aef140 467
Arman92 0:e97881aef140 468 if (y1 == y3) { // Handle awkward all-on-same-line case as its own thing
Arman92 0:e97881aef140 469 a = b = x1;
Arman92 0:e97881aef140 470 if (x2 < a) a = x2;
Arman92 0:e97881aef140 471 else if (x2 > b) b = x2;
Arman92 0:e97881aef140 472 if (x3 < a) a = x3;
Arman92 0:e97881aef140 473 else if (x3 > b) b = x3;
Arman92 0:e97881aef140 474 drawLine(a, y1, b, y1, color);
Arman92 0:e97881aef140 475 return;
Arman92 0:e97881aef140 476 }
Arman92 0:e97881aef140 477
Arman92 0:e97881aef140 478 uint16_t dx11 = x2 - x1,
Arman92 0:e97881aef140 479 dy11 = y2 - y1,
Arman92 0:e97881aef140 480 dx12 = x3 - x1,
Arman92 0:e97881aef140 481 dy12 = y3 - y1,
Arman92 0:e97881aef140 482 dx22 = x3 - x2,
Arman92 0:e97881aef140 483 dy22 = y3 - y2,
Arman92 0:e97881aef140 484 sa = 0,
Arman92 0:e97881aef140 485 sb = 0;
Arman92 0:e97881aef140 486
Arman92 0:e97881aef140 487 // For upper part of triangle, find scanline crossings for segments
Arman92 0:e97881aef140 488 // 0-1 and 0-2. If y2=y3 (flat-bottomed triangle), the scanline y2
Arman92 0:e97881aef140 489 // is included here (and second loop will be skipped, avoiding a /0
Arman92 0:e97881aef140 490 // error there), otherwise scanline y2 is skipped here and handled
Arman92 0:e97881aef140 491 // in the second loop...which also avoids a /0 error here if y1=y2
Arman92 0:e97881aef140 492 // (flat-topped triangle).
Arman92 0:e97881aef140 493 if (y2 == y3) last = y2; // Include y2 scanline
Arman92 0:e97881aef140 494 else last = y2 - 1; // Skip it
Arman92 0:e97881aef140 495
Arman92 0:e97881aef140 496 for (y = y1; y <= last; y++) {
Arman92 0:e97881aef140 497 a = x1 + sa / dy11;
Arman92 0:e97881aef140 498 b = x1 + sb / dy12;
Arman92 0:e97881aef140 499 sa += dx11;
Arman92 0:e97881aef140 500 sb += dx12;
Arman92 0:e97881aef140 501 /* longhand:
Arman92 0:e97881aef140 502 a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
Arman92 0:e97881aef140 503 b = x1 + (x3 - x1) * (y - y1) / (y3 - y1);
Arman92 0:e97881aef140 504 */
Arman92 0:e97881aef140 505 if (a > b) _swap(a, b);
Arman92 0:e97881aef140 506 drawLine(a, y, b, y, color);
Arman92 0:e97881aef140 507 }
Arman92 0:e97881aef140 508
Arman92 0:e97881aef140 509 // For lower part of triangle, find scanline crossings for segments
Arman92 0:e97881aef140 510 // 0-2 and 1-2. This loop is skipped if y2=y3.
Arman92 0:e97881aef140 511 sa = dx22 * (y - y2);
Arman92 0:e97881aef140 512 sb = dx12 * (y - y1);
Arman92 0:e97881aef140 513 for (; y <= y3; y++) {
Arman92 0:e97881aef140 514 a = x2 + sa / dy22;
Arman92 0:e97881aef140 515 b = x1 + sb / dy12;
Arman92 0:e97881aef140 516 sa += dx22;
Arman92 0:e97881aef140 517 sb += dx12;
Arman92 0:e97881aef140 518 /* longhand:
Arman92 0:e97881aef140 519 a = x2 + (x3 - x2) * (y - y2) / (y3 - y2);
Arman92 0:e97881aef140 520 b = x1 + (x3 - x1) * (y - y1) / (y3 - y1);
Arman92 0:e97881aef140 521 */
Arman92 0:e97881aef140 522 if (a > b) _swap(a, b);
Arman92 0:e97881aef140 523 drawLine(a, y, b, y, color);
Arman92 0:e97881aef140 524 }
Arman92 0:e97881aef140 525 }
Arman92 0:e97881aef140 526
Arman92 0:e97881aef140 527
Arman92 0:e97881aef140 528 void TFT_22_ILI9225::setBackgroundColor(uint16_t color) {
Arman92 0:e97881aef140 529 _bgColor = color;
Arman92 0:e97881aef140 530 }
Arman92 0:e97881aef140 531
Arman92 0:e97881aef140 532
Arman92 0:e97881aef140 533 void TFT_22_ILI9225::setFont(uint8_t* font) {
Arman92 0:e97881aef140 534
Arman92 0:e97881aef140 535 cfont.font = font;
Arman92 0:e97881aef140 536 cfont.width = font[0];
Arman92 0:e97881aef140 537 cfont.height = font[1];
Arman92 0:e97881aef140 538 cfont.offset = font[2];
Arman92 0:e97881aef140 539 cfont.numchars = font[3];
Arman92 0:e97881aef140 540 cfont.nbrows = cfont.height / 8;
Arman92 0:e97881aef140 541
Arman92 0:e97881aef140 542 if (cfont.height % 8) cfont.nbrows++; // Set number of bytes used by height of font in multiples of 8
Arman92 0:e97881aef140 543 }
Arman92 0:e97881aef140 544
Arman92 0:e97881aef140 545
Arman92 0:e97881aef140 546 void TFT_22_ILI9225::drawText(uint16_t x, uint16_t y, char *s, uint16_t color) {
Arman92 0:e97881aef140 547
Arman92 0:e97881aef140 548 uint16_t currx = x;
Arman92 0:e97881aef140 549
Arman92 0:e97881aef140 550 // Print every character in string
Arman92 0:e97881aef140 551 for (uint8_t k = 0; k < strlen(s); k++) {
Arman92 0:e97881aef140 552 currx += drawChar(currx, y, s[k], color) + 1;
Arman92 0:e97881aef140 553 }
Arman92 0:e97881aef140 554 }
Arman92 0:e97881aef140 555
Arman92 0:e97881aef140 556
Arman92 0:e97881aef140 557 uint16_t TFT_22_ILI9225::drawChar(uint16_t x, uint16_t y, uint16_t ch, uint16_t color) {
Arman92 0:e97881aef140 558
Arman92 0:e97881aef140 559 uint8_t charData, charWidth;
Arman92 0:e97881aef140 560 uint8_t h, i, j;
Arman92 0:e97881aef140 561 uint16_t charOffset;
Arman92 0:e97881aef140 562
Arman92 0:e97881aef140 563 charOffset = (cfont.width * cfont.nbrows) + 1; // bytes used by each character
Arman92 0:e97881aef140 564 charOffset = (charOffset * (ch - cfont.offset)) + FONT_HEADER_SIZE; // char offset (add 4 for font header)
Arman92 0:e97881aef140 565 charWidth = cfont.font[charOffset]; // get font width from 1st byte
Arman92 0:e97881aef140 566 charOffset++; // increment pointer to first character data byte
Arman92 0:e97881aef140 567
Arman92 0:e97881aef140 568 for (i = 0; i <= charWidth; i++) { // each font "column" (+1 blank column for spacing)
Arman92 0:e97881aef140 569 h = 0; // keep track of char height
Arman92 0:e97881aef140 570 for (j = 0; j < cfont.nbrows; j++) { // each column byte
Arman92 0:e97881aef140 571 if (i == charWidth) charData = (uint8_t)0x0; // Insert blank column
Arman92 0:e97881aef140 572 else charData = cfont.font[charOffset];
Arman92 0:e97881aef140 573 charOffset++;
Arman92 0:e97881aef140 574
Arman92 0:e97881aef140 575 // Process every row in font character
Arman92 0:e97881aef140 576 for (uint8_t k = 0; k < 8; k++) {
Arman92 0:e97881aef140 577 if (h >= cfont.height) break; // No need to process excess bits
Arman92 0:e97881aef140 578 if (bitRead(charData, k)) drawPixel(x + i, y + (j * 8) + k, color);
Arman92 0:e97881aef140 579 else drawPixel(x + i, y + (j * 8) + k, _bgColor);
Arman92 0:e97881aef140 580 h++;
Arman92 0:e97881aef140 581 };
Arman92 0:e97881aef140 582 };
Arman92 0:e97881aef140 583 };
Arman92 0:e97881aef140 584 return charWidth;
Arman92 0:e97881aef140 585 }
Arman92 0:e97881aef140 586
Arman92 0:e97881aef140 587
Arman92 0:e97881aef140 588 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 589 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 590 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 591 // Set Farsi font color
Arman92 0:e97881aef140 592 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 593 void TFT_22_ILI9225::setFontColor(int color)
Arman92 0:e97881aef140 594 {
Arman92 0:e97881aef140 595 font_color = color;
Arman92 0:e97881aef140 596 }
Arman92 0:e97881aef140 597 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 598 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 599 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 600 // Set number format to farsi
Arman92 0:e97881aef140 601 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 602 void TFT_22_ILI9225::setNumberFormatToFa(void)
Arman92 0:e97881aef140 603 {
Arman92 0:e97881aef140 604 fa_num = 1;
Arman92 0:e97881aef140 605 }
Arman92 0:e97881aef140 606
Arman92 0:e97881aef140 607 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 608 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 609 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 610 // Set number format to english
Arman92 0:e97881aef140 611 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 612 void TFT_22_ILI9225::setNumberFormatToEn(void)
Arman92 0:e97881aef140 613 {
Arman92 0:e97881aef140 614 fa_num = 0;
Arman92 0:e97881aef140 615 }
Arman92 0:e97881aef140 616
Arman92 0:e97881aef140 617 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 618 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 619 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 620 // Set efect of the farsi font
Arman92 0:e97881aef140 621 // ef : effect number ef:1,2,...,5
Arman92 0:e97881aef140 622 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 623 void TFT_22_ILI9225::setFontEffect(int ef)
Arman92 0:e97881aef140 624 {
Arman92 0:e97881aef140 625 if (ef >= 0 && ef <= 5)
Arman92 0:e97881aef140 626 effect = ef;
Arman92 0:e97881aef140 627 }
Arman92 0:e97881aef140 628
Arman92 0:e97881aef140 629 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 630 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 631 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 632 // Enable Italic effect for farsi font
Arman92 0:e97881aef140 633 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 634 void TFT_22_ILI9225::setItalicOn(void)
Arman92 0:e97881aef140 635 {
Arman92 0:e97881aef140 636 italic = 1;
Arman92 0:e97881aef140 637 }
Arman92 0:e97881aef140 638
Arman92 0:e97881aef140 639 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 640 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 641 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 642 // Disable Italic effect for farsi font
Arman92 0:e97881aef140 643 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 644 void TFT_22_ILI9225::setItalicOff(void)
Arman92 0:e97881aef140 645 {
Arman92 0:e97881aef140 646 italic = 0;
Arman92 0:e97881aef140 647 }
Arman92 0:e97881aef140 648
Arman92 0:e97881aef140 649 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 650 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 651 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 652 // Puts a Farsi Character On The LCD Screen simlpe
Arman92 0:e97881aef140 653 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 654 void TFT_22_ILI9225::putChar(char character)
Arman92 0:e97881aef140 655 {
Arman92 0:e97881aef140 656 //x_text
Arman92 0:e97881aef140 657 int counter_x, counter_y;
Arman92 0:e97881aef140 658 char letter_length, flag_p;
Arman92 0:e97881aef140 659
Arman92 0:e97881aef140 660 letter_length = font12x16_FA[character][0] >> 12;
Arman92 0:e97881aef140 661 for (counter_y = 0; counter_y<16; counter_y++)
Arman92 0:e97881aef140 662 for (counter_x = 0; counter_x<letter_length; counter_x++)
Arman92 0:e97881aef140 663 {
Arman92 0:e97881aef140 664 flag_p = font12x16_FA[character][counter_y] >> (counter_x);
Arman92 0:e97881aef140 665 flag_p = flag_p & 0x01;
Arman92 0:e97881aef140 666 if (flag_p)
Arman92 0:e97881aef140 667 drawPixel(_maxX - 3 - (x_font + (counter_x)), y_font + counter_y, font_color);
Arman92 0:e97881aef140 668 else if (highlight)
Arman92 0:e97881aef140 669 drawPixel(_maxX - 3 - (x_font + (counter_x)), y_font + counter_y, highlight_color);
Arman92 0:e97881aef140 670 }
Arman92 0:e97881aef140 671
Arman92 0:e97881aef140 672 x_font += letter_length;
Arman92 0:e97881aef140 673 if (x_font > _maxX - 1)
Arman92 0:e97881aef140 674 {
Arman92 0:e97881aef140 675 x_font = x_base;
Arman92 0:e97881aef140 676 y_font += 16;
Arman92 0:e97881aef140 677 if (y_font > _maxY - 0)
Arman92 0:e97881aef140 678 y_font = 0;
Arman92 0:e97881aef140 679 }
Arman92 0:e97881aef140 680
Arman92 0:e97881aef140 681 }
Arman92 0:e97881aef140 682
Arman92 0:e97881aef140 683 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 684 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 685 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 686 // Description : Draws a beveled figure on the screen.
Arman92 0:e97881aef140 687 // Input : x0, y0 - coordinate position of the upper left center
Arman92 0:e97881aef140 688 // : x1, y1 - coordinate position of the lower right center
Arman92 0:e97881aef140 689 // : rad - defines the redius of the circle,
Arman92 0:e97881aef140 690 // : fill - fill yes or no
Arman92 0:e97881aef140 691 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 692 void TFT_22_ILI9225::roundRectangle(int x0, int y0, int x1, int y1, int rad, bool fill, int color)
Arman92 0:e97881aef140 693 {
Arman92 0:e97881aef140 694 signed int a, b, P;
Arman92 0:e97881aef140 695
Arman92 0:e97881aef140 696 a = 0; // increment by 1
Arman92 0:e97881aef140 697 b = rad; // decrement by 1 using P
Arman92 0:e97881aef140 698 P = 1 - rad;
Arman92 0:e97881aef140 699
Arman92 0:e97881aef140 700
Arman92 0:e97881aef140 701 if (fill)
Arman92 0:e97881aef140 702 {
Arman92 0:e97881aef140 703 fillRectangle(x0, y0 + rad, x1, y1 - rad, color);
Arman92 0:e97881aef140 704
Arman92 0:e97881aef140 705 do
Arman92 0:e97881aef140 706 {
Arman92 0:e97881aef140 707 fillRectangle(x0 - a + rad, y0 - b + rad, a + x1 - rad, y0 - b + rad, color); // 8 --> 1
Arman92 0:e97881aef140 708 fillRectangle(x0 - b + rad, y0 - a + rad, b + x1 - rad, y0 - a + rad, color); // 7 --> 2
Arman92 0:e97881aef140 709 fillRectangle(x0 - b + rad, a + y1 - rad, b + x1 - rad, a + y1 - rad, color); // 6 --> 3
Arman92 0:e97881aef140 710 fillRectangle(x0 - a + rad, b + y1 - rad, a + x1 - rad, b + y1 - rad, color); // 5 --> 4
Arman92 0:e97881aef140 711
Arman92 0:e97881aef140 712 if (P < 0)
Arman92 0:e97881aef140 713 P += 3 + 2 * a++;
Arman92 0:e97881aef140 714 else
Arman92 0:e97881aef140 715 P += 5 + 2 * (a++ - b--);
Arman92 0:e97881aef140 716
Arman92 0:e97881aef140 717 } while (a <= b);
Arman92 0:e97881aef140 718 } //fill
Arman92 0:e97881aef140 719 else
Arman92 0:e97881aef140 720 {
Arman92 0:e97881aef140 721 fillRectangle(x0 + rad, y0, x1 - rad, y0, color); // top
Arman92 0:e97881aef140 722 fillRectangle(x0 + rad, y1, x1 - rad, y1, color); // bottom
Arman92 0:e97881aef140 723 fillRectangle(x0, y0 + rad, x0, y1 - rad, color); // left
Arman92 0:e97881aef140 724 fillRectangle(x1, y0 + rad, x1, y1 - rad, color); // right
Arman92 0:e97881aef140 725
Arman92 0:e97881aef140 726 do
Arman92 0:e97881aef140 727 {
Arman92 0:e97881aef140 728 drawPixel(a + x1 - rad, y0 - b + rad, color); // `````` Segment 1
Arman92 0:e97881aef140 729 drawPixel(b + x1 - rad, y0 - a + rad, color); // `````` Segment 2
Arman92 0:e97881aef140 730
Arman92 0:e97881aef140 731 drawPixel(b + x1 - rad, a + y1 - rad, color); // `````` Segment 3
Arman92 0:e97881aef140 732 drawPixel(a + x1 - rad, b + y1 - rad, color); // `````` Segment 4
Arman92 0:e97881aef140 733
Arman92 0:e97881aef140 734 drawPixel(x0 - a + rad, b + y1 - rad, color); // `````` Segment 5
Arman92 0:e97881aef140 735 drawPixel(x0 - b + rad, a + y1 - rad, color); // `````` Segment 6
Arman92 0:e97881aef140 736
Arman92 0:e97881aef140 737 drawPixel(x0 - b + rad, y0 - a + rad, color); // `````` Segment 7
Arman92 0:e97881aef140 738 drawPixel(x0 - a + rad, y0 - b + rad, color); // `````` Segment 8
Arman92 0:e97881aef140 739
Arman92 0:e97881aef140 740 if (P < 0)
Arman92 0:e97881aef140 741 P += 3 + 2 * a++;
Arman92 0:e97881aef140 742 else
Arman92 0:e97881aef140 743 P += 5 + 2 * (a++ - b--);
Arman92 0:e97881aef140 744 } while (a <= b);
Arman92 0:e97881aef140 745 } //no fill
Arman92 0:e97881aef140 746 } //RoundRectangle
Arman92 0:e97881aef140 747
Arman92 0:e97881aef140 748
Arman92 0:e97881aef140 749
Arman92 0:e97881aef140 750 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 751 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 752 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 753 // Puts a Farsi Character On The LCD Screen with scaling
Arman92 0:e97881aef140 754 // size : Scale factor size:1,2,3,...
Arman92 0:e97881aef140 755 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 756 void TFT_22_ILI9225::putBoldChar(char character, int size)
Arman92 0:e97881aef140 757 {
Arman92 0:e97881aef140 758 int counter_x, counter_y, i, j;
Arman92 0:e97881aef140 759 char letter_length, flag_p;
Arman92 0:e97881aef140 760
Arman92 0:e97881aef140 761
Arman92 0:e97881aef140 762 letter_length = font12x16_FA[character][0] >> 12;
Arman92 0:e97881aef140 763 for (counter_y = 0; counter_y<16; counter_y++)
Arman92 0:e97881aef140 764 for (counter_x = 0; counter_x<letter_length; counter_x++)
Arman92 0:e97881aef140 765 {
Arman92 0:e97881aef140 766 flag_p = font12x16_FA[character][counter_y] >> (counter_x);
Arman92 0:e97881aef140 767 flag_p = flag_p & 0x01;
Arman92 0:e97881aef140 768
Arman92 0:e97881aef140 769
Arman92 0:e97881aef140 770 if (flag_p)
Arman92 0:e97881aef140 771 {
Arman92 0:e97881aef140 772
Arman92 0:e97881aef140 773 if (effect == 0)
Arman92 0:e97881aef140 774 for (i = 0; i<size; i++)
Arman92 0:e97881aef140 775 for (j = 0; j<size; j++)
Arman92 0:e97881aef140 776 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + i - (x_font + (size*counter_x)), y_font + size*counter_y + j, font_color);
Arman92 0:e97881aef140 777 // Very good effect (1)
Arman92 0:e97881aef140 778 else if (effect == 1)
Arman92 0:e97881aef140 779 {
Arman92 0:e97881aef140 780 // good for size = 2
Arman92 0:e97881aef140 781 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 782 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y - 1, font_color);
Arman92 0:e97881aef140 783 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 784 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 785 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 786 }
Arman92 0:e97881aef140 787 else if (effect == 2)
Arman92 0:e97881aef140 788 {
Arman92 0:e97881aef140 789 // good for size = 2
Arman92 0:e97881aef140 790 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 791 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y - 1, font_color);
Arman92 0:e97881aef140 792 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 793 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 794 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 795 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 796 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 797 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 2, font_color);
Arman92 0:e97881aef140 798 }
Arman92 0:e97881aef140 799 else if (effect == 3)
Arman92 0:e97881aef140 800 {
Arman92 0:e97881aef140 801 // good for size = 3
Arman92 0:e97881aef140 802 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 803 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y - 1, font_color);
Arman92 0:e97881aef140 804 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y - 1, font_color);
Arman92 0:e97881aef140 805 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 806 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 807 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 2 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 808 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 809 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 810 }
Arman92 0:e97881aef140 811 else if (effect == 4)
Arman92 0:e97881aef140 812 {
Arman92 0:e97881aef140 813 // good for size = 3
Arman92 0:e97881aef140 814 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 815 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y - 1, font_color);
Arman92 0:e97881aef140 816 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y - 1, font_color);
Arman92 0:e97881aef140 817 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 818 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 819 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 820 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 2 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 821 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 822 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 823 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 2 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 824 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 2, font_color);
Arman92 0:e97881aef140 825 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 2, font_color);
Arman92 0:e97881aef140 826 }
Arman92 0:e97881aef140 827 else if (effect == 5)
Arman92 0:e97881aef140 828 {
Arman92 0:e97881aef140 829 // good for size = 1,3
Arman92 0:e97881aef140 830 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 831 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 832 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 833 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, font_color);
Arman92 0:e97881aef140 834 }
Arman92 0:e97881aef140 835
Arman92 0:e97881aef140 836 //tftlcd_draw_circle(_maxX - 3 -(x_font+(size*counter_x)),y_font+size*counter_y,size,1,font_color);
Arman92 0:e97881aef140 837
Arman92 0:e97881aef140 838 }
Arman92 0:e97881aef140 839 else if (highlight)
Arman92 0:e97881aef140 840 {
Arman92 0:e97881aef140 841
Arman92 0:e97881aef140 842
Arman92 0:e97881aef140 843 if (effect == 0)
Arman92 0:e97881aef140 844 for (i = 0; i<size; i++)
Arman92 0:e97881aef140 845 for (j = 0; j<size; j++)
Arman92 0:e97881aef140 846 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + i - (x_font + (size*counter_x)), y_font + size*counter_y + j, highlight_color);
Arman92 0:e97881aef140 847 // Very good effect (1)
Arman92 0:e97881aef140 848 else if (effect == 1)
Arman92 0:e97881aef140 849 {
Arman92 0:e97881aef140 850 // good for size = 2
Arman92 0:e97881aef140 851 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, font_color);
Arman92 0:e97881aef140 852 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y - 1, highlight_color);
Arman92 0:e97881aef140 853 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 854 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 855 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 856 }
Arman92 0:e97881aef140 857 else if (effect == 2)
Arman92 0:e97881aef140 858 {
Arman92 0:e97881aef140 859 // good for size = 2
Arman92 0:e97881aef140 860 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 861 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y - 1, highlight_color);
Arman92 0:e97881aef140 862 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 863 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 864 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 865 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 866 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 867 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 2, highlight_color);
Arman92 0:e97881aef140 868 }
Arman92 0:e97881aef140 869 else if (effect == 3)
Arman92 0:e97881aef140 870 {
Arman92 0:e97881aef140 871 // good for size = 3
Arman92 0:e97881aef140 872 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 873 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y - 1, highlight_color);
Arman92 0:e97881aef140 874 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y - 1, highlight_color);
Arman92 0:e97881aef140 875 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 876 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 877 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 2 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 878 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 879 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 880 }
Arman92 0:e97881aef140 881 else if (effect == 4)
Arman92 0:e97881aef140 882 {
Arman92 0:e97881aef140 883 // good for size = 3
Arman92 0:e97881aef140 884 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 885 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y - 1, highlight_color);
Arman92 0:e97881aef140 886 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y - 1, highlight_color);
Arman92 0:e97881aef140 887 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 888 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 889 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 890 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 2 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 891 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - 1 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 892 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 893 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 2 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 894 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 2, highlight_color);
Arman92 0:e97881aef140 895 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 2, highlight_color);
Arman92 0:e97881aef140 896 }
Arman92 0:e97881aef140 897 else if (effect == 5)
Arman92 0:e97881aef140 898 {
Arman92 0:e97881aef140 899 // good for size = 1,3
Arman92 0:e97881aef140 900 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 901 drawPixel(_maxX - 3 + italic*(-counter_y + 7) - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 902 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y, highlight_color);
Arman92 0:e97881aef140 903 drawPixel(_maxX - 3 + italic*(-counter_y + 7) + 1 - (x_font + (size*counter_x)), y_font + size*counter_y + 1, highlight_color);
Arman92 0:e97881aef140 904 }
Arman92 0:e97881aef140 905
Arman92 0:e97881aef140 906
Arman92 0:e97881aef140 907
Arman92 0:e97881aef140 908 //tftlcd_draw_circle(_maxX - 3 + italic*(-counter_y+7) -(x_font+(size*counter_x)),y_font+size*counter_y,size,1,highlight_color);
Arman92 0:e97881aef140 909
Arman92 0:e97881aef140 910
Arman92 0:e97881aef140 911 }
Arman92 0:e97881aef140 912 }
Arman92 0:e97881aef140 913
Arman92 0:e97881aef140 914 x_font += size*letter_length;
Arman92 0:e97881aef140 915 if (x_font > _maxX - 1)
Arman92 0:e97881aef140 916 {
Arman92 0:e97881aef140 917 x_font = x_base;
Arman92 0:e97881aef140 918 y_font += size * 16;
Arman92 0:e97881aef140 919 if (y_font > _maxY - 0)
Arman92 0:e97881aef140 920 y_font = 0;
Arman92 0:e97881aef140 921 }
Arman92 0:e97881aef140 922
Arman92 0:e97881aef140 923 }
Arman92 0:e97881aef140 924
Arman92 0:e97881aef140 925
Arman92 0:e97881aef140 926 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 927 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 928 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 929 // Go to a specific pont for farsi font (x:0..TS_SIZE_X , y:0..TS_SIZE_Y)
Arman92 0:e97881aef140 930 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 931 void TFT_22_ILI9225::goToXY(int x, int y)
Arman92 0:e97881aef140 932 {
Arman92 0:e97881aef140 933 if ((x >= _maxX) || (x < 0))
Arman92 0:e97881aef140 934 {
Arman92 0:e97881aef140 935 x_font = 0;
Arman92 0:e97881aef140 936 x_base = 0;
Arman92 0:e97881aef140 937 }
Arman92 0:e97881aef140 938 else
Arman92 0:e97881aef140 939 {
Arman92 0:e97881aef140 940 x_font = x;
Arman92 0:e97881aef140 941 x_base = x;
Arman92 0:e97881aef140 942 }
Arman92 0:e97881aef140 943
Arman92 0:e97881aef140 944 if ((y >= _maxY) || (y < 0))
Arman92 0:e97881aef140 945 y_font = 0;
Arman92 0:e97881aef140 946 else
Arman92 0:e97881aef140 947 y_font = y;
Arman92 0:e97881aef140 948 }
Arman92 0:e97881aef140 949
Arman92 0:e97881aef140 950 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 951 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 952 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 953 // Enable Farsi font Highlight
Arman92 0:e97881aef140 954 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 955 void TFT_22_ILI9225::setTextHighlightOn(void)
Arman92 0:e97881aef140 956 {
Arman92 0:e97881aef140 957 highlight = 1;
Arman92 0:e97881aef140 958 }
Arman92 0:e97881aef140 959
Arman92 0:e97881aef140 960 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 961 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 962 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 963 // Disable Farsi font Highlight
Arman92 0:e97881aef140 964 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 965 void TFT_22_ILI9225::setTextHighlightOff(void)
Arman92 0:e97881aef140 966 {
Arman92 0:e97881aef140 967 highlight = 0;
Arman92 0:e97881aef140 968 }
Arman92 0:e97881aef140 969
Arman92 0:e97881aef140 970 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 971 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 972 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 973 // Set Farsi font Highlight color
Arman92 0:e97881aef140 974 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 975 void TFT_22_ILI9225::setTextHighlightColor(unsigned int color)
Arman92 0:e97881aef140 976 {
Arman92 0:e97881aef140 977 highlight_color = color;
Arman92 0:e97881aef140 978 }
Arman92 0:e97881aef140 979
Arman92 0:e97881aef140 980 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 981 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 982 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 983 // Show a farsi-englisg string on the LCD with specific size
Arman92 0:e97881aef140 984 // size : Scale factor size:1,2,3,...
Arman92 0:e97881aef140 985 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 986 void TFT_22_ILI9225::putMixedEnAndFaString(const unsigned char *string, int size)
Arman92 0:e97881aef140 987 {
Arman92 0:e97881aef140 988 unsigned char letter, nt_letter, pr_letter;
Arman92 0:e97881aef140 989 unsigned char CN = 0, CP = 0, pr_CN = 0, nt_CP = 0, place = 0, flag1 = 0;
Arman92 0:e97881aef140 990 unsigned char letter_counter = 0, letter_count = 0, length = 0, enter = 0;
Arman92 0:e97881aef140 991 unsigned char text_buffer[32];
Arman92 0:e97881aef140 992
Arman92 0:e97881aef140 993
Arman92 0:e97881aef140 994 flag1 = 0;
Arman92 0:e97881aef140 995
Arman92 0:e97881aef140 996 while (*string)
Arman92 0:e97881aef140 997 {
Arman92 0:e97881aef140 998 if (*string > 0x80)
Arman92 0:e97881aef140 999 {
Arman92 0:e97881aef140 1000 while (*string > 0x80)
Arman92 0:e97881aef140 1001 {
Arman92 0:e97881aef140 1002 if (flag1 == 0)
Arman92 0:e97881aef140 1003 pr_letter = 0x20;
Arman92 0:e97881aef140 1004 else
Arman92 0:e97881aef140 1005 pr_letter = *(string - 1);
Arman92 0:e97881aef140 1006
Arman92 0:e97881aef140 1007 letter = *string++;
Arman92 0:e97881aef140 1008
Arman92 0:e97881aef140 1009 if (*string == 0)
Arman92 0:e97881aef140 1010 nt_letter = 0x20;
Arman92 0:e97881aef140 1011 else
Arman92 0:e97881aef140 1012 nt_letter = *string;
Arman92 0:e97881aef140 1013
Arman92 0:e97881aef140 1014 flag1 = 1;
Arman92 0:e97881aef140 1015
Arman92 0:e97881aef140 1016 if (letter > 0x98) letter = letter;
Arman92 0:e97881aef140 1017 else if (letter == 0x98) letter = 0xBC;
Arman92 0:e97881aef140 1018 else if (letter == 0x90) letter = 0xC0;
Arman92 0:e97881aef140 1019 else if (letter == 0x8D) letter = 0xBE;
Arman92 0:e97881aef140 1020 else if (letter == 0x81) letter = 0xBD;
Arman92 0:e97881aef140 1021 else if (letter == 0x8E) letter = 0xBF;
Arman92 0:e97881aef140 1022
Arman92 0:e97881aef140 1023 if (pr_letter > 0x98) pr_letter = pr_letter;
Arman92 0:e97881aef140 1024 else if (pr_letter == 0x98) pr_letter = 0xBC;
Arman92 0:e97881aef140 1025 else if (pr_letter == 0x90) pr_letter = 0xC0;
Arman92 0:e97881aef140 1026 else if (pr_letter == 0x8D) pr_letter = 0xBE;
Arman92 0:e97881aef140 1027 else if (pr_letter == 0x81) pr_letter = 0xBD;
Arman92 0:e97881aef140 1028 else if (pr_letter == 0x8E) pr_letter = 0xBF;
Arman92 0:e97881aef140 1029
Arman92 0:e97881aef140 1030 if (nt_letter > 0x98) nt_letter = nt_letter;
Arman92 0:e97881aef140 1031 else if (nt_letter == 0x98) nt_letter = 0xBC;
Arman92 0:e97881aef140 1032 else if (nt_letter == 0x90) nt_letter = 0xC0;
Arman92 0:e97881aef140 1033 else if (nt_letter == 0x8D) nt_letter = 0xBE;
Arman92 0:e97881aef140 1034 else if (nt_letter == 0x81) nt_letter = 0xBD;
Arman92 0:e97881aef140 1035 else if (nt_letter == 0x8E) nt_letter = 0xBF;
Arman92 0:e97881aef140 1036
Arman92 0:e97881aef140 1037
Arman92 0:e97881aef140 1038
Arman92 0:e97881aef140 1039 if (pr_letter > 0x80)
Arman92 0:e97881aef140 1040 pr_CN = ((FAmap[(pr_letter - 0xBC)][5]) == 1);
Arman92 0:e97881aef140 1041 else
Arman92 0:e97881aef140 1042 pr_CN = 0;
Arman92 0:e97881aef140 1043
Arman92 0:e97881aef140 1044 if (nt_letter > 0x80)
Arman92 0:e97881aef140 1045 nt_CP = ((FAmap[(nt_letter - 0xBC)][4]) == 1);
Arman92 0:e97881aef140 1046 else
Arman92 0:e97881aef140 1047 nt_CP = 0;
Arman92 0:e97881aef140 1048
Arman92 0:e97881aef140 1049 if (letter > 0x80)
Arman92 0:e97881aef140 1050 CP = ((FAmap[(letter - 0xBC)][4]) == 1);
Arman92 0:e97881aef140 1051 else
Arman92 0:e97881aef140 1052 CP = 0;
Arman92 0:e97881aef140 1053
Arman92 0:e97881aef140 1054 if (letter > 0x80)
Arman92 0:e97881aef140 1055 CN = ((FAmap[(letter - 0xBC)][5]) == 1);
Arman92 0:e97881aef140 1056 else
Arman92 0:e97881aef140 1057 CN = 0;
Arman92 0:e97881aef140 1058
Arman92 0:e97881aef140 1059 CP = pr_CN && CP;
Arman92 0:e97881aef140 1060 CN = CN && nt_CP;
Arman92 0:e97881aef140 1061 place = (CP << 1) | CN;
Arman92 0:e97881aef140 1062
Arman92 0:e97881aef140 1063 text_buffer[letter_counter++] = FAmap[(letter - 0xBC)][place];
Arman92 0:e97881aef140 1064
Arman92 0:e97881aef140 1065 length += size*(font12x16_FA[FAmap[(letter - 0xBC)][place]][1] >> 12);
Arman92 0:e97881aef140 1066 }
Arman92 0:e97881aef140 1067
Arman92 0:e97881aef140 1068
Arman92 0:e97881aef140 1069
Arman92 0:e97881aef140 1070 if (length < _maxX - x_font - 3)
Arman92 0:e97881aef140 1071 for (letter_count = 0; letter_count<letter_counter; letter_count++)
Arman92 0:e97881aef140 1072 putBoldChar(text_buffer[letter_count], size);
Arman92 0:e97881aef140 1073 else
Arman92 0:e97881aef140 1074 {
Arman92 0:e97881aef140 1075
Arman92 0:e97881aef140 1076 x_font = x_base;
Arman92 0:e97881aef140 1077 y_font += size * 16;
Arman92 0:e97881aef140 1078 if (y_font > _maxY - size * 16)
Arman92 0:e97881aef140 1079 y_font = 0;
Arman92 0:e97881aef140 1080
Arman92 0:e97881aef140 1081 for (letter_count = 0; letter_count<letter_counter; letter_count++)
Arman92 0:e97881aef140 1082 putBoldChar(text_buffer[letter_count], size);
Arman92 0:e97881aef140 1083 }
Arman92 0:e97881aef140 1084 letter_counter = 0;
Arman92 0:e97881aef140 1085 length = 0;
Arman92 0:e97881aef140 1086 }
Arman92 0:e97881aef140 1087 else if (*string == 0x20) //Space detect
Arman92 0:e97881aef140 1088 putBoldChar(*string++, size);
Arman92 0:e97881aef140 1089 else //English letter & Number & Enter detect
Arman92 0:e97881aef140 1090 {
Arman92 0:e97881aef140 1091 if (*string == 0x0D) //Enter detect
Arman92 0:e97881aef140 1092 {
Arman92 0:e97881aef140 1093 x_font = x_base;
Arman92 0:e97881aef140 1094 y_font += size * 16;
Arman92 0:e97881aef140 1095 if (y_font > _maxY - size * 16)
Arman92 0:e97881aef140 1096 y_font = 0;
Arman92 0:e97881aef140 1097
Arman92 0:e97881aef140 1098 string += 2;
Arman92 0:e97881aef140 1099 goto p1;
Arman92 0:e97881aef140 1100 }
Arman92 0:e97881aef140 1101 //letter_counter = 0;
Arman92 0:e97881aef140 1102 while ((*string < 0x81) && (*(string + 1) < 0x81) && (*string != 0x00))
Arman92 0:e97881aef140 1103 {
Arman92 0:e97881aef140 1104
Arman92 0:e97881aef140 1105 if (fa_num)
Arman92 0:e97881aef140 1106 {
Arman92 0:e97881aef140 1107 if ((*string > 0x2F) && (*string < 0x3A) && (*string != 0x00))
Arman92 0:e97881aef140 1108 {
Arman92 0:e97881aef140 1109 letter = (*string) - 0x20;
Arman92 0:e97881aef140 1110 text_buffer[letter_counter++] = letter;
Arman92 0:e97881aef140 1111 string++;
Arman92 0:e97881aef140 1112 goto P2;
Arman92 0:e97881aef140 1113 }
Arman92 0:e97881aef140 1114 }
Arman92 0:e97881aef140 1115 text_buffer[letter_counter++] = *string++;
Arman92 0:e97881aef140 1116 P2:
Arman92 0:e97881aef140 1117 if ((*string == 0x20) && ((letter_counter * size * 8) < (_maxX - x_font - 1)))
Arman92 0:e97881aef140 1118 flag1 = letter_counter;
Arman92 0:e97881aef140 1119
Arman92 0:e97881aef140 1120 if ((letter_counter * size * 8) > (_maxX - x_font - 1))
Arman92 0:e97881aef140 1121 {
Arman92 0:e97881aef140 1122 string -= (letter_counter - flag1 + 1);
Arman92 0:e97881aef140 1123 letter_counter = flag1 - 1;
Arman92 0:e97881aef140 1124 enter = 1;
Arman92 0:e97881aef140 1125
Arman92 0:e97881aef140 1126 break;
Arman92 0:e97881aef140 1127 }
Arman92 0:e97881aef140 1128
Arman92 0:e97881aef140 1129 }
Arman92 0:e97881aef140 1130 if ((letter_counter * size * 8) < (_maxX - x_font - 1))
Arman92 0:e97881aef140 1131 {
Arman92 0:e97881aef140 1132 for (letter_count = (letter_counter); letter_count>0; letter_count--)
Arman92 0:e97881aef140 1133 putBoldChar(text_buffer[letter_count - 1], size);
Arman92 0:e97881aef140 1134
Arman92 0:e97881aef140 1135 if (enter)
Arman92 0:e97881aef140 1136 {
Arman92 0:e97881aef140 1137 enter = 0;
Arman92 0:e97881aef140 1138 x_font = x_base;
Arman92 0:e97881aef140 1139 y_font += size * 16;
Arman92 0:e97881aef140 1140 if (y_font > _maxY - size * 16)
Arman92 0:e97881aef140 1141 y_font = 0;
Arman92 0:e97881aef140 1142 }
Arman92 0:e97881aef140 1143 }
Arman92 0:e97881aef140 1144 p1:
Arman92 0:e97881aef140 1145 letter_counter = 0;
Arman92 0:e97881aef140 1146 flag1 = 0;
Arman92 0:e97881aef140 1147
Arman92 0:e97881aef140 1148 }
Arman92 0:e97881aef140 1149 }
Arman92 0:e97881aef140 1150 flag1 = 0;
Arman92 0:e97881aef140 1151
Arman92 0:e97881aef140 1152 }
Arman92 0:e97881aef140 1153
Arman92 0:e97881aef140 1154 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 1155 //************************************* ECA 2.8 inch LCD Module **************************************
Arman92 0:e97881aef140 1156 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 1157 // Make an ascii string from an unicode string
Arman92 0:e97881aef140 1158 //----------------------------------------------------------------------------------------------------
Arman92 0:e97881aef140 1159
Arman92 0:e97881aef140 1160 void TFT_22_ILI9225::unicode2ascii(char *uni_str, char *ascii_str)
Arman92 0:e97881aef140 1161 {
Arman92 0:e97881aef140 1162 int counter = 0;
Arman92 0:e97881aef140 1163 int Uch = 0;
Arman92 0:e97881aef140 1164 char chl, chh;
Arman92 0:e97881aef140 1165
Arman92 0:e97881aef140 1166
Arman92 0:e97881aef140 1167 while (*uni_str)
Arman92 0:e97881aef140 1168 {
Arman92 0:e97881aef140 1169 chl = *uni_str++;
Arman92 0:e97881aef140 1170 chh = *uni_str++;
Arman92 0:e97881aef140 1171
Arman92 0:e97881aef140 1172 Uch = 0;
Arman92 0:e97881aef140 1173 Uch = ((Uch | chh) << 8) | chl;
Arman92 0:e97881aef140 1174
Arman92 0:e97881aef140 1175 if (Uch > 1574 && Uch < 1591)
Arman92 0:e97881aef140 1176 *(ascii_str + counter) = (char)(Uch - 1376);
Arman92 0:e97881aef140 1177 else if (Uch > 1590 && Uch < 1595)
Arman92 0:e97881aef140 1178 *(ascii_str + counter) = (char)(Uch - 1375);
Arman92 0:e97881aef140 1179 else if (Uch > 1600 && Uch < 1603)
Arman92 0:e97881aef140 1180 *(ascii_str + counter) = (char)(Uch - 1380);
Arman92 0:e97881aef140 1181 else if (Uch == 1705)
Arman92 0:e97881aef140 1182 *(ascii_str + counter) = (char)(Uch - 1482);
Arman92 0:e97881aef140 1183 else if (Uch == 1604)
Arman92 0:e97881aef140 1184 *(ascii_str + counter) = (char)(Uch - 1379);
Arman92 0:e97881aef140 1185 else if (Uch > 1604 && Uch < 1609)
Arman92 0:e97881aef140 1186 *(ascii_str + counter) = (char)(Uch - 1378);
Arman92 0:e97881aef140 1187 else if (Uch == 1740)
Arman92 0:e97881aef140 1188 *(ascii_str + counter) = (char)(Uch - 1503);
Arman92 0:e97881aef140 1189 else if (Uch == 1574)
Arman92 0:e97881aef140 1190 *(ascii_str + counter) = (char)(Uch - 1381);
Arman92 0:e97881aef140 1191 else if (Uch == 1662)
Arman92 0:e97881aef140 1192 *(ascii_str + counter) = (char)(Uch - 1533);
Arman92 0:e97881aef140 1193 else if (Uch == 1670)
Arman92 0:e97881aef140 1194 *(ascii_str + counter) = (char)(Uch - 1529);
Arman92 0:e97881aef140 1195 else if (Uch == 1688)
Arman92 0:e97881aef140 1196 *(ascii_str + counter) = (char)(Uch - 1546);
Arman92 0:e97881aef140 1197 else if (Uch == 1711)
Arman92 0:e97881aef140 1198 *(ascii_str + counter) = (char)(Uch - 1567);
Arman92 0:e97881aef140 1199 else if (Uch == 1570)
Arman92 0:e97881aef140 1200 *(ascii_str + counter) = (char)(Uch - 1376);
Arman92 0:e97881aef140 1201 else if (Uch > 1631 && Uch < 1642)
Arman92 0:e97881aef140 1202 *(ascii_str + counter) = (char)(Uch - 1584);
Arman92 0:e97881aef140 1203 else if (Uch == 65536)
Arman92 0:e97881aef140 1204 *(ascii_str + counter) = NULL;
Arman92 0:e97881aef140 1205 else
Arman92 0:e97881aef140 1206 *(ascii_str + counter) = (char)Uch;
Arman92 0:e97881aef140 1207
Arman92 0:e97881aef140 1208
Arman92 0:e97881aef140 1209 counter++;
Arman92 0:e97881aef140 1210
Arman92 0:e97881aef140 1211 }
Arman92 0:e97881aef140 1212 *(ascii_str + counter) = NULL;
Arman92 0:e97881aef140 1213
Arman92 0:e97881aef140 1214 }
Arman92 0:e97881aef140 1215