A general demonstration color etch-a-sketch program using the QVGA TFT with HX8347D controller, Orange Board. Saves touchscreen calibaration data saved in tft.ini. Creates /local/tft.ini if missing. Also included is an Ethernet NTP client to update the RTC. Assumes all other Orange Board devices attached: Text LCD, SDHC Flash, Ethernet.

Dependencies:   EthernetNetIf TextLCD mbed

Committer:
loopsva
Date:
Mon Aug 01 16:29:58 2011 +0000
Revision:
0:e065ca40f28a
Inititial Release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:e065ca40f28a 1 /* mbed library for 240*320 pixel display TFT based on HX8347D LCD Controller
loopsva 0:e065ca40f28a 2 * Copyright (c) 2011 Peter Drescher - DC2PD
loopsva 0:e065ca40f28a 3 *
loopsva 0:e065ca40f28a 4 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
loopsva 0:e065ca40f28a 5 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
loopsva 0:e065ca40f28a 6 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
loopsva 0:e065ca40f28a 7 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
loopsva 0:e065ca40f28a 8 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
loopsva 0:e065ca40f28a 9 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
loopsva 0:e065ca40f28a 10 * THE SOFTWARE.
loopsva 0:e065ca40f28a 11 */
loopsva 0:e065ca40f28a 12
loopsva 0:e065ca40f28a 13 #include "SPI_TFT.h"
loopsva 0:e065ca40f28a 14 #include "mbed.h"
loopsva 0:e065ca40f28a 15
loopsva 0:e065ca40f28a 16
loopsva 0:e065ca40f28a 17 #define BPP 16 // Bits per pixel
loopsva 0:e065ca40f28a 18
loopsva 0:e065ca40f28a 19
loopsva 0:e065ca40f28a 20
loopsva 0:e065ca40f28a 21 SPI_TFT::SPI_TFT(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset, const char *name)
loopsva 0:e065ca40f28a 22 : _spi(mosi, miso, sclk), _cs(cs), _reset(reset),GraphicsDisplay(name) {
loopsva 0:e065ca40f28a 23 tft_reset();
loopsva 0:e065ca40f28a 24 orientation = 0;
loopsva 0:e065ca40f28a 25 char_x = 0;
loopsva 0:e065ca40f28a 26 }
loopsva 0:e065ca40f28a 27
loopsva 0:e065ca40f28a 28 int SPI_TFT::width() {
loopsva 0:e065ca40f28a 29 if (orientation == 0 || orientation == 2) return 240;
loopsva 0:e065ca40f28a 30 else return 320;
loopsva 0:e065ca40f28a 31 }
loopsva 0:e065ca40f28a 32
loopsva 0:e065ca40f28a 33
loopsva 0:e065ca40f28a 34 int SPI_TFT::height() {
loopsva 0:e065ca40f28a 35 if (orientation == 0 || orientation == 2) return 320;
loopsva 0:e065ca40f28a 36 else return 240;
loopsva 0:e065ca40f28a 37 }
loopsva 0:e065ca40f28a 38
loopsva 0:e065ca40f28a 39
loopsva 0:e065ca40f28a 40
loopsva 0:e065ca40f28a 41 void SPI_TFT::set_orientation(unsigned int o) {
loopsva 0:e065ca40f28a 42 orientation = o;
loopsva 0:e065ca40f28a 43 switch (orientation) {
loopsva 0:e065ca40f28a 44 case 0:
loopsva 0:e065ca40f28a 45 wr_reg(0x16, 0x0008);
loopsva 0:e065ca40f28a 46 break;
loopsva 0:e065ca40f28a 47 case 1:
loopsva 0:e065ca40f28a 48 wr_reg(0x16, 0x0068);
loopsva 0:e065ca40f28a 49 break;
loopsva 0:e065ca40f28a 50 case 2:
loopsva 0:e065ca40f28a 51 wr_reg(0x16, 0x00C8);
loopsva 0:e065ca40f28a 52 break;
loopsva 0:e065ca40f28a 53 case 3:
loopsva 0:e065ca40f28a 54 wr_reg(0x16, 0x00A8);
loopsva 0:e065ca40f28a 55 break;
loopsva 0:e065ca40f28a 56 }
loopsva 0:e065ca40f28a 57 }
loopsva 0:e065ca40f28a 58
loopsva 0:e065ca40f28a 59
loopsva 0:e065ca40f28a 60
loopsva 0:e065ca40f28a 61 void SPI_TFT::wr_cmd(int cmd) {
loopsva 0:e065ca40f28a 62 _cs = 0;
loopsva 0:e065ca40f28a 63 _spi.write(SPI_START | SPI_WR | SPI_INDEX); /* Write : RS = 0, RW = 0 */
loopsva 0:e065ca40f28a 64 _spi.write(cmd);
loopsva 0:e065ca40f28a 65 _cs = 1;
loopsva 0:e065ca40f28a 66 }
loopsva 0:e065ca40f28a 67
loopsva 0:e065ca40f28a 68
loopsva 0:e065ca40f28a 69
loopsva 0:e065ca40f28a 70 void SPI_TFT::wr_dat(int dat) {
loopsva 0:e065ca40f28a 71 _cs = 0;
loopsva 0:e065ca40f28a 72 _spi.write(SPI_START | SPI_WR | SPI_DATA); // Write : RS = 1, RW = 0
loopsva 0:e065ca40f28a 73 _spi.format(16,3); // switch to 16 bit Mode 3
loopsva 0:e065ca40f28a 74 _spi.write(dat); // Write D0..D15
loopsva 0:e065ca40f28a 75 _spi.format(8,3); // 8 bit Mode 3
loopsva 0:e065ca40f28a 76 _cs = 1;
loopsva 0:e065ca40f28a 77 }
loopsva 0:e065ca40f28a 78
loopsva 0:e065ca40f28a 79
loopsva 0:e065ca40f28a 80
loopsva 0:e065ca40f28a 81 void SPI_TFT::wr_dat_start(void) {
loopsva 0:e065ca40f28a 82 _cs = 0;
loopsva 0:e065ca40f28a 83 _spi.write(SPI_START | SPI_WR | SPI_DATA); /* Write : RS = 1, RW = 0 */
loopsva 0:e065ca40f28a 84 }
loopsva 0:e065ca40f28a 85
loopsva 0:e065ca40f28a 86
loopsva 0:e065ca40f28a 87
loopsva 0:e065ca40f28a 88 void SPI_TFT::wr_dat_stop (void) {
loopsva 0:e065ca40f28a 89 _cs = 1;
loopsva 0:e065ca40f28a 90 }
loopsva 0:e065ca40f28a 91
loopsva 0:e065ca40f28a 92
loopsva 0:e065ca40f28a 93
loopsva 0:e065ca40f28a 94 void SPI_TFT::wr_dat_only (unsigned short dat) {
loopsva 0:e065ca40f28a 95
loopsva 0:e065ca40f28a 96 _spi.format(16,3); // switch to 16 bit Mode 3
loopsva 0:e065ca40f28a 97 _spi.write(dat); // Write D0..D15
loopsva 0:e065ca40f28a 98 _spi.format(8,3); // 8 bit Mode 3
loopsva 0:e065ca40f28a 99 }
loopsva 0:e065ca40f28a 100
loopsva 0:e065ca40f28a 101
loopsva 0:e065ca40f28a 102
loopsva 0:e065ca40f28a 103 unsigned short SPI_TFT::rd_dat (void) {
loopsva 0:e065ca40f28a 104 unsigned short val = 0;
loopsva 0:e065ca40f28a 105
loopsva 0:e065ca40f28a 106 _cs = 0;
loopsva 0:e065ca40f28a 107 _spi.write(SPI_START | SPI_RD | SPI_DATA); /* Read: RS = 1, RW = 1 */
loopsva 0:e065ca40f28a 108 _spi.write(0); /* Dummy read 1 */
loopsva 0:e065ca40f28a 109 val = _spi.write(0); /* Read D8..D15 */
loopsva 0:e065ca40f28a 110 val <<= 8;
loopsva 0:e065ca40f28a 111 val |= _spi.write(0); /* Read D0..D7 */
loopsva 0:e065ca40f28a 112 _cs = 1;
loopsva 0:e065ca40f28a 113 return (val);
loopsva 0:e065ca40f28a 114 }
loopsva 0:e065ca40f28a 115
loopsva 0:e065ca40f28a 116
loopsva 0:e065ca40f28a 117
loopsva 0:e065ca40f28a 118 void SPI_TFT::wr_reg (unsigned char reg, unsigned short val) {
loopsva 0:e065ca40f28a 119
loopsva 0:e065ca40f28a 120 wr_cmd(reg);
loopsva 0:e065ca40f28a 121 wr_dat(val);
loopsva 0:e065ca40f28a 122 }
loopsva 0:e065ca40f28a 123
loopsva 0:e065ca40f28a 124
loopsva 0:e065ca40f28a 125
loopsva 0:e065ca40f28a 126 unsigned short SPI_TFT::rd_reg (unsigned char reg) {
loopsva 0:e065ca40f28a 127
loopsva 0:e065ca40f28a 128 wr_cmd(reg);
loopsva 0:e065ca40f28a 129 return(rd_dat());
loopsva 0:e065ca40f28a 130 }
loopsva 0:e065ca40f28a 131
loopsva 0:e065ca40f28a 132
loopsva 0:e065ca40f28a 133
loopsva 0:e065ca40f28a 134 void SPI_TFT::tft_reset() {
loopsva 0:e065ca40f28a 135 static unsigned short driverCode;
loopsva 0:e065ca40f28a 136 _spi.format(8,3); // 8 bit spi mode 3
loopsva 0:e065ca40f28a 137 _spi.frequency(48000000); // 48Mhz SPI clock
loopsva 0:e065ca40f28a 138 _reset = 0; // reset
loopsva 0:e065ca40f28a 139 _cs = 1;
loopsva 0:e065ca40f28a 140 wait_us(50);
loopsva 0:e065ca40f28a 141 _reset = 1; // end reset
loopsva 0:e065ca40f28a 142 wait_ms(5);
loopsva 0:e065ca40f28a 143
loopsva 0:e065ca40f28a 144 driverCode = rd_reg(0x00); // read controller ID
loopsva 0:e065ca40f28a 145 //printf("Disp_ID = %x",driverCode);
loopsva 0:e065ca40f28a 146
loopsva 0:e065ca40f28a 147 /* Start Initial Sequence ----------------------------------------------------*/
loopsva 0:e065ca40f28a 148 wr_reg(0xEA, 0x0000); /* Reset Power Control 1 */
loopsva 0:e065ca40f28a 149 wr_reg(0xEB, 0x0020); /* Power Control 2 */
loopsva 0:e065ca40f28a 150 wr_reg(0xEC, 0x000C); /* Power Control 3 */
loopsva 0:e065ca40f28a 151 wr_reg(0xED, 0x00C4); /* Power Control 4 */
loopsva 0:e065ca40f28a 152 wr_reg(0xE8, 0x0040); /* Source OPON_N */
loopsva 0:e065ca40f28a 153 wr_reg(0xE9, 0x0038); /* Source OPON_I */
loopsva 0:e065ca40f28a 154 wr_reg(0xF1, 0x0001); /* */
loopsva 0:e065ca40f28a 155 wr_reg(0xF2, 0x0010); /* */
loopsva 0:e065ca40f28a 156 wr_reg(0x27, 0x00A3); /* Display Control 2 */
loopsva 0:e065ca40f28a 157
loopsva 0:e065ca40f28a 158 /* Power On sequence ---------------------------------------------------------*/
loopsva 0:e065ca40f28a 159 wr_reg(0x1B, 0x001B); /* Power Control 2 */
loopsva 0:e065ca40f28a 160 wr_reg(0x1A, 0x0001); /* Power Control 1 */
loopsva 0:e065ca40f28a 161 wr_reg(0x24, 0x002F); /* Vcom Control 2 */
loopsva 0:e065ca40f28a 162 wr_reg(0x25, 0x0057); /* Vcom Control 3 */
loopsva 0:e065ca40f28a 163 wr_reg(0x23, 0x008D); /* Vcom Control 1 */
loopsva 0:e065ca40f28a 164
loopsva 0:e065ca40f28a 165 /* Gamma settings -----------------------------------------------------------*/
loopsva 0:e065ca40f28a 166 wr_reg(0x40,0x00); //
loopsva 0:e065ca40f28a 167 wr_reg(0x41,0x00); //
loopsva 0:e065ca40f28a 168 wr_reg(0x42,0x01); //
loopsva 0:e065ca40f28a 169 wr_reg(0x43,0x13); //
loopsva 0:e065ca40f28a 170 wr_reg(0x44,0x10); //
loopsva 0:e065ca40f28a 171 wr_reg(0x45,0x26); //
loopsva 0:e065ca40f28a 172 wr_reg(0x46,0x08); //
loopsva 0:e065ca40f28a 173 wr_reg(0x47,0x51); //
loopsva 0:e065ca40f28a 174 wr_reg(0x48,0x02); //
loopsva 0:e065ca40f28a 175 wr_reg(0x49,0x12); //
loopsva 0:e065ca40f28a 176 wr_reg(0x4A,0x18); //
loopsva 0:e065ca40f28a 177 wr_reg(0x4B,0x19); //
loopsva 0:e065ca40f28a 178 wr_reg(0x4C,0x14); //
loopsva 0:e065ca40f28a 179 wr_reg(0x50,0x19); //
loopsva 0:e065ca40f28a 180 wr_reg(0x51,0x2F); //
loopsva 0:e065ca40f28a 181 wr_reg(0x52,0x2C); //
loopsva 0:e065ca40f28a 182 wr_reg(0x53,0x3E); //
loopsva 0:e065ca40f28a 183 wr_reg(0x54,0x3F); //
loopsva 0:e065ca40f28a 184 wr_reg(0x55,0x3F); //
loopsva 0:e065ca40f28a 185 wr_reg(0x56,0x2E); //
loopsva 0:e065ca40f28a 186 wr_reg(0x57,0x77); //
loopsva 0:e065ca40f28a 187 wr_reg(0x58,0x0B); //
loopsva 0:e065ca40f28a 188 wr_reg(0x59,0x06); //
loopsva 0:e065ca40f28a 189 wr_reg(0x5A,0x07); //
loopsva 0:e065ca40f28a 190 wr_reg(0x5B,0x0D); //
loopsva 0:e065ca40f28a 191 wr_reg(0x5C,0x1D); //
loopsva 0:e065ca40f28a 192 wr_reg(0x5D,0xCC); //
loopsva 0:e065ca40f28a 193
loopsva 0:e065ca40f28a 194 /* Power + Osc ---------------------------------------------------------------*/
loopsva 0:e065ca40f28a 195 wr_reg(0x18, 0x0036); /* OSC Control 1 */
loopsva 0:e065ca40f28a 196 wr_reg(0x19, 0x0001); /* OSC Control 2 */
loopsva 0:e065ca40f28a 197 wr_reg(0x01, 0x0000); /* Display Mode Control */
loopsva 0:e065ca40f28a 198 wr_reg(0x1F, 0x0088); /* Power Control 6 */
loopsva 0:e065ca40f28a 199 wait_ms(5); /* Delay 5 ms */
loopsva 0:e065ca40f28a 200 wr_reg(0x1F, 0x0080); /* Power Control 6 */
loopsva 0:e065ca40f28a 201 wait_ms(5); /* Delay 5 ms */
loopsva 0:e065ca40f28a 202 wr_reg(0x1F, 0x0090); /* Power Control 6 */
loopsva 0:e065ca40f28a 203 wait_ms(5); /* Delay 5 ms */
loopsva 0:e065ca40f28a 204 wr_reg(0x1F, 0x00D0); /* Power Control 6 */
loopsva 0:e065ca40f28a 205 wait_ms(5); /* Delay 5 ms */
loopsva 0:e065ca40f28a 206
loopsva 0:e065ca40f28a 207 wr_reg(0x17, 0x0005); /* Colmod 16Bit/Pixel */
loopsva 0:e065ca40f28a 208
loopsva 0:e065ca40f28a 209 wr_reg(0x36, 0x0000); /* Panel Characteristic */
loopsva 0:e065ca40f28a 210 wr_reg(0x28, 0x0038); /* Display Control 3 */
loopsva 0:e065ca40f28a 211 wait_ms(40);
loopsva 0:e065ca40f28a 212 wr_reg(0x28, 0x003C); /* Display Control 3 */
loopsva 0:e065ca40f28a 213 switch (orientation) {
loopsva 0:e065ca40f28a 214 case 0:
loopsva 0:e065ca40f28a 215 wr_reg(0x16, 0x0008);
loopsva 0:e065ca40f28a 216 break;
loopsva 0:e065ca40f28a 217 case 1:
loopsva 0:e065ca40f28a 218 wr_reg(0x16, 0x0068);
loopsva 0:e065ca40f28a 219 break;
loopsva 0:e065ca40f28a 220 case 2:
loopsva 0:e065ca40f28a 221 wr_reg(0x16, 0x00C8);
loopsva 0:e065ca40f28a 222 break;
loopsva 0:e065ca40f28a 223 case 3:
loopsva 0:e065ca40f28a 224 wr_reg(0x16, 0x00A8);
loopsva 0:e065ca40f28a 225 break;
loopsva 0:e065ca40f28a 226 }
loopsva 0:e065ca40f28a 227
loopsva 0:e065ca40f28a 228 WindowMax ();
loopsva 0:e065ca40f28a 229 }
loopsva 0:e065ca40f28a 230
loopsva 0:e065ca40f28a 231
loopsva 0:e065ca40f28a 232
loopsva 0:e065ca40f28a 233
loopsva 0:e065ca40f28a 234 void SPI_TFT::pixel(int x, int y, int color) {
loopsva 0:e065ca40f28a 235 wr_reg(0x03, (x >> 0));
loopsva 0:e065ca40f28a 236 wr_reg(0x02, (x >> 8));
loopsva 0:e065ca40f28a 237 wr_reg(0x07, (y >> 0));
loopsva 0:e065ca40f28a 238 wr_reg(0x06, (y >> 8));
loopsva 0:e065ca40f28a 239 wr_cmd(0x22);
loopsva 0:e065ca40f28a 240 wr_dat(color);
loopsva 0:e065ca40f28a 241 }
loopsva 0:e065ca40f28a 242
loopsva 0:e065ca40f28a 243
loopsva 0:e065ca40f28a 244
loopsva 0:e065ca40f28a 245
loopsva 0:e065ca40f28a 246 void SPI_TFT::window (unsigned int x, unsigned int y, unsigned int w, unsigned int h) {
loopsva 0:e065ca40f28a 247 wr_reg(0x03, (x >> 0));
loopsva 0:e065ca40f28a 248 wr_reg(0x02, (x >> 8));
loopsva 0:e065ca40f28a 249 wr_reg(0x05, (x+w-1 >> 0));
loopsva 0:e065ca40f28a 250 wr_reg(0x04, (x+w-1 >> 8));
loopsva 0:e065ca40f28a 251 wr_reg(0x07, ( y >> 0));
loopsva 0:e065ca40f28a 252 wr_reg(0x06, ( y >> 8));
loopsva 0:e065ca40f28a 253 wr_reg(0x09, ( y+h-1 >> 0));
loopsva 0:e065ca40f28a 254 wr_reg(0x08, ( y+h-1 >> 8));
loopsva 0:e065ca40f28a 255 //wr_cmd(0x22);
loopsva 0:e065ca40f28a 256 }
loopsva 0:e065ca40f28a 257
loopsva 0:e065ca40f28a 258
loopsva 0:e065ca40f28a 259 void SPI_TFT::WindowMax (void) {
loopsva 0:e065ca40f28a 260 window (0, 0, width(), height());
loopsva 0:e065ca40f28a 261 }
loopsva 0:e065ca40f28a 262
loopsva 0:e065ca40f28a 263
loopsva 0:e065ca40f28a 264 void SPI_TFT::cls (void) {
loopsva 0:e065ca40f28a 265 unsigned int i;
loopsva 0:e065ca40f28a 266 WindowMax();
loopsva 0:e065ca40f28a 267 wr_cmd(0x22);
loopsva 0:e065ca40f28a 268 wr_dat_start();
loopsva 0:e065ca40f28a 269 _spi.format(16,3); // 16 bit Mode 3
loopsva 0:e065ca40f28a 270 for (i = 0; i < ( width() * height()); i++)
loopsva 0:e065ca40f28a 271 _spi.write(_background);
loopsva 0:e065ca40f28a 272 _spi.format(8,3); // 8 bit Mode 3
loopsva 0:e065ca40f28a 273 wr_dat_stop();
loopsva 0:e065ca40f28a 274 }
loopsva 0:e065ca40f28a 275
loopsva 0:e065ca40f28a 276
loopsva 0:e065ca40f28a 277 void SPI_TFT::circle(int x0, int y0, int r, int color) {
loopsva 0:e065ca40f28a 278
loopsva 0:e065ca40f28a 279 int draw_x0, draw_y0;
loopsva 0:e065ca40f28a 280 int draw_x1, draw_y1;
loopsva 0:e065ca40f28a 281 int draw_x2, draw_y2;
loopsva 0:e065ca40f28a 282 int draw_x3, draw_y3;
loopsva 0:e065ca40f28a 283 int draw_x4, draw_y4;
loopsva 0:e065ca40f28a 284 int draw_x5, draw_y5;
loopsva 0:e065ca40f28a 285 int draw_x6, draw_y6;
loopsva 0:e065ca40f28a 286 int draw_x7, draw_y7;
loopsva 0:e065ca40f28a 287 int xx, yy;
loopsva 0:e065ca40f28a 288 int di;
loopsva 0:e065ca40f28a 289 WindowMax();
loopsva 0:e065ca40f28a 290 if (r == 0) { /* no radius */
loopsva 0:e065ca40f28a 291 return;
loopsva 0:e065ca40f28a 292 }
loopsva 0:e065ca40f28a 293
loopsva 0:e065ca40f28a 294 draw_x0 = draw_x1 = x0;
loopsva 0:e065ca40f28a 295 draw_y0 = draw_y1 = y0 + r;
loopsva 0:e065ca40f28a 296 if (draw_y0 < height()) {
loopsva 0:e065ca40f28a 297 pixel(draw_x0, draw_y0, color); /* 90 degree */
loopsva 0:e065ca40f28a 298 }
loopsva 0:e065ca40f28a 299
loopsva 0:e065ca40f28a 300 draw_x2 = draw_x3 = x0;
loopsva 0:e065ca40f28a 301 draw_y2 = draw_y3 = y0 - r;
loopsva 0:e065ca40f28a 302 if (draw_y2 >= 0) {
loopsva 0:e065ca40f28a 303 pixel(draw_x2, draw_y2, color); /* 270 degree */
loopsva 0:e065ca40f28a 304 }
loopsva 0:e065ca40f28a 305
loopsva 0:e065ca40f28a 306 draw_x4 = draw_x6 = x0 + r;
loopsva 0:e065ca40f28a 307 draw_y4 = draw_y6 = y0;
loopsva 0:e065ca40f28a 308 if (draw_x4 < width()) {
loopsva 0:e065ca40f28a 309 pixel(draw_x4, draw_y4, color); /* 0 degree */
loopsva 0:e065ca40f28a 310 }
loopsva 0:e065ca40f28a 311
loopsva 0:e065ca40f28a 312 draw_x5 = draw_x7 = x0 - r;
loopsva 0:e065ca40f28a 313 draw_y5 = draw_y7 = y0;
loopsva 0:e065ca40f28a 314 if (draw_x5>=0) {
loopsva 0:e065ca40f28a 315 pixel(draw_x5, draw_y5, color); /* 180 degree */
loopsva 0:e065ca40f28a 316 }
loopsva 0:e065ca40f28a 317
loopsva 0:e065ca40f28a 318 if (r == 1) {
loopsva 0:e065ca40f28a 319 return;
loopsva 0:e065ca40f28a 320 }
loopsva 0:e065ca40f28a 321
loopsva 0:e065ca40f28a 322 di = 3 - 2*r;
loopsva 0:e065ca40f28a 323 xx = 0;
loopsva 0:e065ca40f28a 324 yy = r;
loopsva 0:e065ca40f28a 325 while (xx < yy) {
loopsva 0:e065ca40f28a 326
loopsva 0:e065ca40f28a 327 if (di < 0) {
loopsva 0:e065ca40f28a 328 di += 4*xx + 6;
loopsva 0:e065ca40f28a 329 } else {
loopsva 0:e065ca40f28a 330 di += 4*(xx - yy) + 10;
loopsva 0:e065ca40f28a 331 yy--;
loopsva 0:e065ca40f28a 332 draw_y0--;
loopsva 0:e065ca40f28a 333 draw_y1--;
loopsva 0:e065ca40f28a 334 draw_y2++;
loopsva 0:e065ca40f28a 335 draw_y3++;
loopsva 0:e065ca40f28a 336 draw_x4--;
loopsva 0:e065ca40f28a 337 draw_x5++;
loopsva 0:e065ca40f28a 338 draw_x6--;
loopsva 0:e065ca40f28a 339 draw_x7++;
loopsva 0:e065ca40f28a 340 }
loopsva 0:e065ca40f28a 341 xx++;
loopsva 0:e065ca40f28a 342 draw_x0++;
loopsva 0:e065ca40f28a 343 draw_x1--;
loopsva 0:e065ca40f28a 344 draw_x2++;
loopsva 0:e065ca40f28a 345 draw_x3--;
loopsva 0:e065ca40f28a 346 draw_y4++;
loopsva 0:e065ca40f28a 347 draw_y5++;
loopsva 0:e065ca40f28a 348 draw_y6--;
loopsva 0:e065ca40f28a 349 draw_y7--;
loopsva 0:e065ca40f28a 350
loopsva 0:e065ca40f28a 351 if ( (draw_x0 <= width()) && (draw_y0>=0) ) {
loopsva 0:e065ca40f28a 352 pixel(draw_x0, draw_y0, color);
loopsva 0:e065ca40f28a 353 }
loopsva 0:e065ca40f28a 354
loopsva 0:e065ca40f28a 355 if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) {
loopsva 0:e065ca40f28a 356 pixel(draw_x1, draw_y1, color);
loopsva 0:e065ca40f28a 357 }
loopsva 0:e065ca40f28a 358
loopsva 0:e065ca40f28a 359 if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) {
loopsva 0:e065ca40f28a 360 pixel(draw_x2, draw_y2, color);
loopsva 0:e065ca40f28a 361 }
loopsva 0:e065ca40f28a 362
loopsva 0:e065ca40f28a 363 if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) {
loopsva 0:e065ca40f28a 364 pixel(draw_x3, draw_y3, color);
loopsva 0:e065ca40f28a 365 }
loopsva 0:e065ca40f28a 366
loopsva 0:e065ca40f28a 367 if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) {
loopsva 0:e065ca40f28a 368 pixel(draw_x4, draw_y4, color);
loopsva 0:e065ca40f28a 369 }
loopsva 0:e065ca40f28a 370
loopsva 0:e065ca40f28a 371 if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) {
loopsva 0:e065ca40f28a 372 pixel(draw_x5, draw_y5, color);
loopsva 0:e065ca40f28a 373 }
loopsva 0:e065ca40f28a 374 if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) {
loopsva 0:e065ca40f28a 375 pixel(draw_x6, draw_y6, color);
loopsva 0:e065ca40f28a 376 }
loopsva 0:e065ca40f28a 377 if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) {
loopsva 0:e065ca40f28a 378 pixel(draw_x7, draw_y7, color);
loopsva 0:e065ca40f28a 379 }
loopsva 0:e065ca40f28a 380 }
loopsva 0:e065ca40f28a 381 return;
loopsva 0:e065ca40f28a 382 }
loopsva 0:e065ca40f28a 383
loopsva 0:e065ca40f28a 384 void SPI_TFT::fillcircle(int x, int y, int r, int color){
loopsva 0:e065ca40f28a 385 int i;
loopsva 0:e065ca40f28a 386 for (i = 0;i <= r; i++)
loopsva 0:e065ca40f28a 387 circle(x,y,i,color);
loopsva 0:e065ca40f28a 388 }
loopsva 0:e065ca40f28a 389
loopsva 0:e065ca40f28a 390
loopsva 0:e065ca40f28a 391
loopsva 0:e065ca40f28a 392 void SPI_TFT::hline(int x0, int x1, int y, int color) {
loopsva 0:e065ca40f28a 393 int w;
loopsva 0:e065ca40f28a 394 w = x1 - x0 + 1;
loopsva 0:e065ca40f28a 395 window(x0,y,w,1);
loopsva 0:e065ca40f28a 396 wr_cmd(0x22);
loopsva 0:e065ca40f28a 397 wr_dat_start();
loopsva 0:e065ca40f28a 398 _spi.format(16,3); // pixel are send in 16 bit mode to speed up
loopsva 0:e065ca40f28a 399 for (int x=0; x<w; x++) {
loopsva 0:e065ca40f28a 400 _spi.write(color);
loopsva 0:e065ca40f28a 401 }
loopsva 0:e065ca40f28a 402 _spi.format(8,3);
loopsva 0:e065ca40f28a 403 wr_dat_stop();
loopsva 0:e065ca40f28a 404 return;
loopsva 0:e065ca40f28a 405 }
loopsva 0:e065ca40f28a 406
loopsva 0:e065ca40f28a 407
loopsva 0:e065ca40f28a 408
loopsva 0:e065ca40f28a 409 void SPI_TFT::vline(int x, int y0, int y1, int color) {
loopsva 0:e065ca40f28a 410 int h;
loopsva 0:e065ca40f28a 411 h = y1 - y0 + 1;
loopsva 0:e065ca40f28a 412 window(x,y0,1,h);
loopsva 0:e065ca40f28a 413 wr_cmd(0x22);
loopsva 0:e065ca40f28a 414 wr_dat_start();
loopsva 0:e065ca40f28a 415 _spi.format(16,3); // pixel are send in 16 bit mode to speed up
loopsva 0:e065ca40f28a 416 for (int y=0; y<h; y++) {
loopsva 0:e065ca40f28a 417 _spi.write(color);
loopsva 0:e065ca40f28a 418 }
loopsva 0:e065ca40f28a 419 _spi.format(8,3);
loopsva 0:e065ca40f28a 420 wr_dat_stop();
loopsva 0:e065ca40f28a 421 return;
loopsva 0:e065ca40f28a 422 }
loopsva 0:e065ca40f28a 423
loopsva 0:e065ca40f28a 424
loopsva 0:e065ca40f28a 425
loopsva 0:e065ca40f28a 426 void SPI_TFT::line(int x0, int y0, int x1, int y1, int color) {
loopsva 0:e065ca40f28a 427 WindowMax();
loopsva 0:e065ca40f28a 428 int dx = 0, dy = 0;
loopsva 0:e065ca40f28a 429 int dx_sym = 0, dy_sym = 0;
loopsva 0:e065ca40f28a 430 int dx_x2 = 0, dy_x2 = 0;
loopsva 0:e065ca40f28a 431 int di = 0;
loopsva 0:e065ca40f28a 432
loopsva 0:e065ca40f28a 433 dx = x1-x0;
loopsva 0:e065ca40f28a 434 dy = y1-y0;
loopsva 0:e065ca40f28a 435
loopsva 0:e065ca40f28a 436 if (dx == 0) { /* vertical line */
loopsva 0:e065ca40f28a 437 if (y1 > y0) vline(x0,y0,y1,color);
loopsva 0:e065ca40f28a 438 else vline(x0,y1,y0,color);
loopsva 0:e065ca40f28a 439 return;
loopsva 0:e065ca40f28a 440 }
loopsva 0:e065ca40f28a 441
loopsva 0:e065ca40f28a 442 if (dx > 0) {
loopsva 0:e065ca40f28a 443 dx_sym = 1;
loopsva 0:e065ca40f28a 444 } else {
loopsva 0:e065ca40f28a 445 dx_sym = -1;
loopsva 0:e065ca40f28a 446 }
loopsva 0:e065ca40f28a 447 if (dy == 0) { /* horizontal line */
loopsva 0:e065ca40f28a 448 if (x1 > x0) hline(x0,x1,y0,color);
loopsva 0:e065ca40f28a 449 else hline(x1,x0,y0,color);
loopsva 0:e065ca40f28a 450 return;
loopsva 0:e065ca40f28a 451 }
loopsva 0:e065ca40f28a 452
loopsva 0:e065ca40f28a 453 if (dy > 0) {
loopsva 0:e065ca40f28a 454 dy_sym = 1;
loopsva 0:e065ca40f28a 455 } else {
loopsva 0:e065ca40f28a 456 dy_sym = -1;
loopsva 0:e065ca40f28a 457 }
loopsva 0:e065ca40f28a 458
loopsva 0:e065ca40f28a 459 dx = dx_sym*dx;
loopsva 0:e065ca40f28a 460 dy = dy_sym*dy;
loopsva 0:e065ca40f28a 461
loopsva 0:e065ca40f28a 462 dx_x2 = dx*2;
loopsva 0:e065ca40f28a 463 dy_x2 = dy*2;
loopsva 0:e065ca40f28a 464
loopsva 0:e065ca40f28a 465 if (dx >= dy) {
loopsva 0:e065ca40f28a 466 di = dy_x2 - dx;
loopsva 0:e065ca40f28a 467 while (x0 != x1) {
loopsva 0:e065ca40f28a 468
loopsva 0:e065ca40f28a 469 pixel(x0, y0, color);
loopsva 0:e065ca40f28a 470 x0 += dx_sym;
loopsva 0:e065ca40f28a 471 if (di<0) {
loopsva 0:e065ca40f28a 472 di += dy_x2;
loopsva 0:e065ca40f28a 473 } else {
loopsva 0:e065ca40f28a 474 di += dy_x2 - dx_x2;
loopsva 0:e065ca40f28a 475 y0 += dy_sym;
loopsva 0:e065ca40f28a 476 }
loopsva 0:e065ca40f28a 477 }
loopsva 0:e065ca40f28a 478 pixel(x0, y0, color);
loopsva 0:e065ca40f28a 479 } else {
loopsva 0:e065ca40f28a 480 di = dx_x2 - dy;
loopsva 0:e065ca40f28a 481 while (y0 != y1) {
loopsva 0:e065ca40f28a 482 pixel(x0, y0, color);
loopsva 0:e065ca40f28a 483 y0 += dy_sym;
loopsva 0:e065ca40f28a 484 if (di < 0) {
loopsva 0:e065ca40f28a 485 di += dx_x2;
loopsva 0:e065ca40f28a 486 } else {
loopsva 0:e065ca40f28a 487 di += dx_x2 - dy_x2;
loopsva 0:e065ca40f28a 488 x0 += dx_sym;
loopsva 0:e065ca40f28a 489 }
loopsva 0:e065ca40f28a 490 }
loopsva 0:e065ca40f28a 491 pixel(x0, y0, color);
loopsva 0:e065ca40f28a 492 }
loopsva 0:e065ca40f28a 493 return;
loopsva 0:e065ca40f28a 494 }
loopsva 0:e065ca40f28a 495
loopsva 0:e065ca40f28a 496
loopsva 0:e065ca40f28a 497
loopsva 0:e065ca40f28a 498
loopsva 0:e065ca40f28a 499 void SPI_TFT::rect(int x0, int y0, int x1, int y1, int color) {
loopsva 0:e065ca40f28a 500
loopsva 0:e065ca40f28a 501 if (x1 > x0) hline(x0,x1,y0,color);
loopsva 0:e065ca40f28a 502 else hline(x1,x0,y0,color);
loopsva 0:e065ca40f28a 503
loopsva 0:e065ca40f28a 504 if (y1 > y0) vline(x0,y0,y1,color);
loopsva 0:e065ca40f28a 505 else vline(x0,y1,y0,color);
loopsva 0:e065ca40f28a 506
loopsva 0:e065ca40f28a 507 if (x1 > x0) hline(x0,x1,y1,color);
loopsva 0:e065ca40f28a 508 else hline(x1,x0,y1,color);
loopsva 0:e065ca40f28a 509
loopsva 0:e065ca40f28a 510 if (y1 > y0) vline(x1,y0,y1,color);
loopsva 0:e065ca40f28a 511 else vline(x1,y1,y0,color);
loopsva 0:e065ca40f28a 512
loopsva 0:e065ca40f28a 513 return;
loopsva 0:e065ca40f28a 514 }
loopsva 0:e065ca40f28a 515
loopsva 0:e065ca40f28a 516
loopsva 0:e065ca40f28a 517
loopsva 0:e065ca40f28a 518 void SPI_TFT::fillrect(int x0, int y0, int x1, int y1, int color) {
loopsva 0:e065ca40f28a 519
loopsva 0:e065ca40f28a 520 int h = y1 - y0 + 1;
loopsva 0:e065ca40f28a 521 int w = x1 - x0 + 1;
loopsva 0:e065ca40f28a 522 int pixel = h * w;
loopsva 0:e065ca40f28a 523 window(x0,y0,w,h);
loopsva 0:e065ca40f28a 524 wr_cmd(0x22);
loopsva 0:e065ca40f28a 525 wr_dat_start();
loopsva 0:e065ca40f28a 526 _spi.format(16,3); // pixel are send in 16 bit mode to speed up
loopsva 0:e065ca40f28a 527 for (int p=0; p<pixel; p++) {
loopsva 0:e065ca40f28a 528 _spi.write(color);
loopsva 0:e065ca40f28a 529 }
loopsva 0:e065ca40f28a 530 _spi.format(8,3);
loopsva 0:e065ca40f28a 531 wr_dat_stop();
loopsva 0:e065ca40f28a 532 return;
loopsva 0:e065ca40f28a 533 }
loopsva 0:e065ca40f28a 534
loopsva 0:e065ca40f28a 535
loopsva 0:e065ca40f28a 536
loopsva 0:e065ca40f28a 537 void SPI_TFT::locate(int column, int row) {
loopsva 0:e065ca40f28a 538 _column = column;
loopsva 0:e065ca40f28a 539 char_x = font[1] * column; // get the horz. size of the actual font
loopsva 0:e065ca40f28a 540 _row = row;
loopsva 0:e065ca40f28a 541 }
loopsva 0:e065ca40f28a 542
loopsva 0:e065ca40f28a 543
loopsva 0:e065ca40f28a 544
loopsva 0:e065ca40f28a 545 int SPI_TFT::columns() {
loopsva 0:e065ca40f28a 546 return width() / font[1];
loopsva 0:e065ca40f28a 547 }
loopsva 0:e065ca40f28a 548
loopsva 0:e065ca40f28a 549
loopsva 0:e065ca40f28a 550
loopsva 0:e065ca40f28a 551 int SPI_TFT::rows() {
loopsva 0:e065ca40f28a 552 return height() / font[2];
loopsva 0:e065ca40f28a 553 }
loopsva 0:e065ca40f28a 554
loopsva 0:e065ca40f28a 555
loopsva 0:e065ca40f28a 556
loopsva 0:e065ca40f28a 557 int SPI_TFT::_putc(int value) {
loopsva 0:e065ca40f28a 558 if (value == '\n') {
loopsva 0:e065ca40f28a 559 _column = 0;
loopsva 0:e065ca40f28a 560 char_x = 0;
loopsva 0:e065ca40f28a 561 _row++;
loopsva 0:e065ca40f28a 562 if (_row >= rows()) {
loopsva 0:e065ca40f28a 563 _row = 0;
loopsva 0:e065ca40f28a 564 }
loopsva 0:e065ca40f28a 565 } else {
loopsva 0:e065ca40f28a 566 character(_column, _row, value);
loopsva 0:e065ca40f28a 567 _column++;
loopsva 0:e065ca40f28a 568 }
loopsva 0:e065ca40f28a 569 return value;
loopsva 0:e065ca40f28a 570 }
loopsva 0:e065ca40f28a 571
loopsva 0:e065ca40f28a 572
loopsva 0:e065ca40f28a 573
loopsva 0:e065ca40f28a 574
loopsva 0:e065ca40f28a 575 void SPI_TFT::character(int col, int row, int c) {
loopsva 0:e065ca40f28a 576 unsigned int hor,vert,offset,bpl,j,i,b;
loopsva 0:e065ca40f28a 577 unsigned char* zeichen;
loopsva 0:e065ca40f28a 578 unsigned char z,w;
loopsva 0:e065ca40f28a 579
loopsva 0:e065ca40f28a 580 if ((c < 31) || (c > 127)) return; // test char range
loopsva 0:e065ca40f28a 581
loopsva 0:e065ca40f28a 582 // read font parameter from start of array
loopsva 0:e065ca40f28a 583 offset = font[0]; // bytes / char
loopsva 0:e065ca40f28a 584 hor = font[1]; // get hor size of font
loopsva 0:e065ca40f28a 585 vert = font[2]; // get vert size of font
loopsva 0:e065ca40f28a 586 bpl = font[3]; // bytes per line
loopsva 0:e065ca40f28a 587
loopsva 0:e065ca40f28a 588 if (char_x + hor > width()) {
loopsva 0:e065ca40f28a 589 char_x = 0;
loopsva 0:e065ca40f28a 590 _column = 0;
loopsva 0:e065ca40f28a 591 _row ++;
loopsva 0:e065ca40f28a 592 row++;
loopsva 0:e065ca40f28a 593 if (_row >= rows()) {
loopsva 0:e065ca40f28a 594 _row = 0;
loopsva 0:e065ca40f28a 595 row=0;
loopsva 0:e065ca40f28a 596 }
loopsva 0:e065ca40f28a 597 }
loopsva 0:e065ca40f28a 598
loopsva 0:e065ca40f28a 599 window(char_x, row * vert,hor,vert); // char box
loopsva 0:e065ca40f28a 600 wr_cmd(0x22);
loopsva 0:e065ca40f28a 601 wr_dat_start();
loopsva 0:e065ca40f28a 602 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
loopsva 0:e065ca40f28a 603 w = zeichen[0]; // width of actual char
loopsva 0:e065ca40f28a 604 _spi.format(16,3); // pixel are 16 bit
loopsva 0:e065ca40f28a 605
loopsva 0:e065ca40f28a 606 for (j=0; j<vert; j++) { // vert line
loopsva 0:e065ca40f28a 607 for (i=0; i<hor; i++) { // horz line
loopsva 0:e065ca40f28a 608 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
loopsva 0:e065ca40f28a 609 b = 1 << (j & 0x07);
loopsva 0:e065ca40f28a 610 if (( z & b ) == 0x00) {
loopsva 0:e065ca40f28a 611 _spi.write(_background);
loopsva 0:e065ca40f28a 612 } else {
loopsva 0:e065ca40f28a 613 _spi.write(_foreground);
loopsva 0:e065ca40f28a 614 }
loopsva 0:e065ca40f28a 615 }
loopsva 0:e065ca40f28a 616 }
loopsva 0:e065ca40f28a 617 _spi.format(8,3); // 8 bit
loopsva 0:e065ca40f28a 618 wr_dat_stop();
loopsva 0:e065ca40f28a 619 if ((w + 2) < hor) { // x offset to next char
loopsva 0:e065ca40f28a 620 char_x += w + 2;
loopsva 0:e065ca40f28a 621 } else char_x += hor;
loopsva 0:e065ca40f28a 622 }
loopsva 0:e065ca40f28a 623
loopsva 0:e065ca40f28a 624
loopsva 0:e065ca40f28a 625
loopsva 0:e065ca40f28a 626
loopsva 0:e065ca40f28a 627
loopsva 0:e065ca40f28a 628 void SPI_TFT::set_font(unsigned char* f) {
loopsva 0:e065ca40f28a 629 font = f;
loopsva 0:e065ca40f28a 630 }
loopsva 0:e065ca40f28a 631
loopsva 0:e065ca40f28a 632
loopsva 0:e065ca40f28a 633
loopsva 0:e065ca40f28a 634 void SPI_TFT::Bitmap(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap) {
loopsva 0:e065ca40f28a 635 unsigned int i,j;
loopsva 0:e065ca40f28a 636 unsigned short *bitmap_ptr = (unsigned short *)bitmap;
loopsva 0:e065ca40f28a 637 window(x, y, w, h);
loopsva 0:e065ca40f28a 638 wr_cmd(0x22);
loopsva 0:e065ca40f28a 639 wr_dat_start();
loopsva 0:e065ca40f28a 640 _spi.format(16,3);
loopsva 0:e065ca40f28a 641 bitmap_ptr += ((h - 1)*w);
loopsva 0:e065ca40f28a 642 for (j = 0; j < h; j++) { //Lines
loopsva 0:e065ca40f28a 643 for (i = 0; i < w; i++) { // copy pixel data to TFT
loopsva 0:e065ca40f28a 644 _spi.write(*bitmap_ptr); // one line
loopsva 0:e065ca40f28a 645 bitmap_ptr++;
loopsva 0:e065ca40f28a 646 }
loopsva 0:e065ca40f28a 647 bitmap_ptr -= 2*w;
loopsva 0:e065ca40f28a 648 }
loopsva 0:e065ca40f28a 649 _spi.format(8,3);
loopsva 0:e065ca40f28a 650 wr_dat_stop();
loopsva 0:e065ca40f28a 651 }