Differential pressure meter

Dependencies:   TFT_Touch_WaveShare

Committer:
igbt6
Date:
Tue Apr 03 20:13:35 2018 +0000
Revision:
1:c311d5f59c8b
Parent:
0:619824763516
Differential pressure meter

Who changed what in which revision?

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