aitendo SX032QVGA008

Dependencies:   SPI_TFT_ILI9341ext

Committer:
king33jp
Date:
Tue Apr 14 05:54:58 2015 +0000
Revision:
1:6304deb80cc2
Parent:
0:7db6d9893ccb
http://developer.mbed.org/users/king33jp/code/SPI_TFT_ILI9341ext/

Who changed what in which revision?

UserRevisionLine numberNew contents of line
king33jp 0:7db6d9893ccb 1 /* mbed library for aitendo SX032QVGA08 TFT module with resistive touch panel.
king33jp 0:7db6d9893ccb 2 * Original library is "SpeedStudioTFT" by 2014 Copyright (c) Seeed Technology Inc.
king33jp 0:7db6d9893ccb 3 * I made by it to the reference.
king33jp 0:7db6d9893ccb 4 *
king33jp 0:7db6d9893ccb 5 * (1) Because there was some mistake in the source, I was corrected.
king33jp 0:7db6d9893ccb 6 * (2) Also, I changed to the source you have to assume FRDM
king33jp 0:7db6d9893ccb 7 * (3) I changed BackLight is PWM controlled.
king33jp 0:7db6d9893ccb 8 */
king33jp 0:7db6d9893ccb 9
king33jp 0:7db6d9893ccb 10
king33jp 0:7db6d9893ccb 11 #include "mbed.h"
king33jp 0:7db6d9893ccb 12 #include "SX032QVGA008.h"
king33jp 0:7db6d9893ccb 13
king33jp 0:7db6d9893ccb 14 SX032QVGA008::SX032QVGA008(PinName xp, PinName xm, PinName yp, PinName ym,
king33jp 0:7db6d9893ccb 15 PinName mosi, PinName miso, PinName sclk,
king33jp 0:7db6d9893ccb 16 PinName csTft, PinName dcTft, PinName resTft, PinName blTft,
king33jp 0:7db6d9893ccb 17 PinName csSd):
king33jp 0:7db6d9893ccb 18 #ifdef USE_SDCARD
king33jp 0:7db6d9893ccb 19 SDFileSystem(mosi,miso,sclk,csSd, "sdc"),
king33jp 0:7db6d9893ccb 20 #endif
king33jp 0:7db6d9893ccb 21 SPI_TFT_ILI9341ext(mosi,miso,sclk,csTft,resTft,dcTft, "tft"),
king33jp 0:7db6d9893ccb 22 bl(blTft)
king33jp 0:7db6d9893ccb 23 {
king33jp 0:7db6d9893ccb 24 #ifndef USE_SDCARD
king33jp 0:7db6d9893ccb 25 // sd card
king33jp 0:7db6d9893ccb 26 DigitalOut cs(csSd);
king33jp 0:7db6d9893ccb 27 cs = 1;
king33jp 0:7db6d9893ccb 28 #endif
king33jp 0:7db6d9893ccb 29 // backlight PWM controll
king33jp 0:7db6d9893ccb 30 bl.period(0.002);
king33jp 0:7db6d9893ccb 31 font = NULL;
king33jp 0:7db6d9893ccb 32 // touch screen pins
king33jp 0:7db6d9893ccb 33 _xp = xp;
king33jp 0:7db6d9893ccb 34 _yp = yp;
king33jp 0:7db6d9893ccb 35 _xm = xm;
king33jp 0:7db6d9893ccb 36 _ym = ym;
king33jp 0:7db6d9893ccb 37 // default touch calibration
king33jp 0:7db6d9893ccb 38 // orientation // 0 1 2 3
king33jp 0:7db6d9893ccb 39 x_off = 108000; // 17252 16605 108755 108000
king33jp 0:7db6d9893ccb 40 y_off = 22000; // 22330 105819 97167 22000
king33jp 0:7db6d9893ccb 41 pp_tx = -291; // 378 289 -390 -291
king33jp 0:7db6d9893ccb 42 pp_ty = 356; // 261 -355 -239 356
king33jp 0:7db6d9893ccb 43 }
king33jp 0:7db6d9893ccb 44
king33jp 0:7db6d9893ccb 45 void SX032QVGA008::setBacklight(float duty)
king33jp 0:7db6d9893ccb 46 {
king33jp 0:7db6d9893ccb 47 bl = duty;
king33jp 0:7db6d9893ccb 48 }
king33jp 0:7db6d9893ccb 49
king33jp 0:7db6d9893ccb 50 int SX032QVGA008::readTouch(PinName p, PinName m, PinName a, PinName i)
king33jp 0:7db6d9893ccb 51 {
king33jp 0:7db6d9893ccb 52 DigitalOut _p(p);
king33jp 0:7db6d9893ccb 53 _p = 1;
king33jp 0:7db6d9893ccb 54 DigitalOut _m(m);
king33jp 0:7db6d9893ccb 55 _m = 0;
king33jp 0:7db6d9893ccb 56 AnalogIn _a(a);
king33jp 0:7db6d9893ccb 57 AnalogIn _i(i); // this pin has to be high Z (DigitalIn may also work)
king33jp 0:7db6d9893ccb 58 wait_us(10);
king33jp 0:7db6d9893ccb 59 return _a.read_u16();
king33jp 0:7db6d9893ccb 60 }
king33jp 0:7db6d9893ccb 61
king33jp 0:7db6d9893ccb 62 SX032QVGA008::TOUCH SX032QVGA008::getTouch(point& p)
king33jp 0:7db6d9893ccb 63 {
king33jp 0:7db6d9893ccb 64 int y2 = readTouch(_xp,_xm,_yp,_ym);
king33jp 0:7db6d9893ccb 65 int x2 = readTouch(_yp,_ym,_xp,_xm);
king33jp 0:7db6d9893ccb 66 int y1 = readTouch(_xp,_xm,_yp,_ym);
king33jp 0:7db6d9893ccb 67 int x1 = readTouch(_yp,_ym,_xp,_xm);
king33jp 0:7db6d9893ccb 68 int xd = x1 - x2;
king33jp 0:7db6d9893ccb 69 int yd = y1 - y2;
king33jp 0:7db6d9893ccb 70 xd = (xd > 0) ? xd : -xd;
king33jp 0:7db6d9893ccb 71 // yd = (yd > 0) ? xd : -xd;
king33jp 0:7db6d9893ccb 72 yd = (yd > 0) ? yd : -yd;
king33jp 0:7db6d9893ccb 73 p.x = x1 + x2;
king33jp 0:7db6d9893ccb 74 p.y = y1 + y2;
king33jp 0:7db6d9893ccb 75 #if 0
king33jp 0:7db6d9893ccb 76 DigitalOut _p(_xp);
king33jp 0:7db6d9893ccb 77 _p = 1;
king33jp 0:7db6d9893ccb 78 DigitalOut _m(_ym);
king33jp 0:7db6d9893ccb 79 _m = 0;
king33jp 0:7db6d9893ccb 80 AnalogIn _ax(_xm);
king33jp 0:7db6d9893ccb 81 AnalogIn _ay(_yp);
king33jp 0:7db6d9893ccb 82 wait_us(20);
king33jp 0:7db6d9893ccb 83 int ax = _ax.read_u16();
king33jp 0:7db6d9893ccb 84 int ay = _ay.read_u16();
king33jp 0:7db6d9893ccb 85 float z = 0;
king33jp 0:7db6d9893ccb 86 z = (float)ay / ax / x / 2 * 0x10000;
king33jp 0:7db6d9893ccb 87 #endif
king33jp 0:7db6d9893ccb 88 const int th = 8000;
king33jp 0:7db6d9893ccb 89 const int df = 100;
king33jp 0:7db6d9893ccb 90 TOUCH touch;
king33jp 0:7db6d9893ccb 91 if (x1 < th || x2 < th ||
king33jp 0:7db6d9893ccb 92 y1 < th || y2 < th) {
king33jp 0:7db6d9893ccb 93 p.x = 0;
king33jp 0:7db6d9893ccb 94 p.y = 0;
king33jp 0:7db6d9893ccb 95 touch = NO;
king33jp 0:7db6d9893ccb 96 } else if (xd > df || yd > df) {
king33jp 0:7db6d9893ccb 97 touch = MAYBE;
king33jp 0:7db6d9893ccb 98 } else {
king33jp 0:7db6d9893ccb 99 touch = YES;
king33jp 0:7db6d9893ccb 100 }
king33jp 0:7db6d9893ccb 101 //locate(0,50);
king33jp 0:7db6d9893ccb 102 //printf("x: %6i y: %6i",p.x,p.y);
king33jp 0:7db6d9893ccb 103 return touch;
king33jp 0:7db6d9893ccb 104 }
king33jp 0:7db6d9893ccb 105
king33jp 0:7db6d9893ccb 106 void SX032QVGA008::calibrate(void)
king33jp 0:7db6d9893ccb 107 {
king33jp 0:7db6d9893ccb 108 int i;
king33jp 0:7db6d9893ccb 109 int a = 0,b = 0,c = 0, d = 0;
king33jp 0:7db6d9893ccb 110 int pos_x = 0, pos_y = 0;
king33jp 0:7db6d9893ccb 111 point p;
king33jp 0:7db6d9893ccb 112
king33jp 0:7db6d9893ccb 113 cls();
king33jp 0:7db6d9893ccb 114 foreground(White); // set chars to white
king33jp 0:7db6d9893ccb 115 line(0,3,6,3,White);
king33jp 0:7db6d9893ccb 116 line(3,0,3,6,White);
king33jp 0:7db6d9893ccb 117 if (font)
king33jp 0:7db6d9893ccb 118 {
king33jp 0:7db6d9893ccb 119 // get the center of the screen
king33jp 0:7db6d9893ccb 120 pos_x = columns() / 2 - 3;
king33jp 0:7db6d9893ccb 121 pos_x = pos_x * font[1];
king33jp 0:7db6d9893ccb 122 pos_y = (rows() / 2) - 1;
king33jp 0:7db6d9893ccb 123 pos_y = pos_y * font[2];
king33jp 0:7db6d9893ccb 124 locate(pos_x,pos_y);
king33jp 0:7db6d9893ccb 125 printf("press cross ");
king33jp 0:7db6d9893ccb 126 locate(pos_x,pos_y + font[2]);
king33jp 0:7db6d9893ccb 127 printf("to calibrate ");
king33jp 0:7db6d9893ccb 128 }
king33jp 0:7db6d9893ccb 129 for (i=0; i<5; i++) {
king33jp 0:7db6d9893ccb 130 while (getTouch(p) != YES)
king33jp 0:7db6d9893ccb 131 /*nothing*/;
king33jp 0:7db6d9893ccb 132 a += p.x;
king33jp 0:7db6d9893ccb 133 b += p.y;
king33jp 0:7db6d9893ccb 134 }
king33jp 0:7db6d9893ccb 135 a = a / 5;
king33jp 0:7db6d9893ccb 136 b = b / 5;
king33jp 0:7db6d9893ccb 137 if (font)
king33jp 0:7db6d9893ccb 138 {
king33jp 0:7db6d9893ccb 139 locate(pos_x,pos_y);
king33jp 0:7db6d9893ccb 140 printf("ok ");
king33jp 0:7db6d9893ccb 141 locate(pos_x,pos_y + font[2]);
king33jp 0:7db6d9893ccb 142 printf("release touch ");
king33jp 0:7db6d9893ccb 143 }
king33jp 0:7db6d9893ccb 144 while (getTouch(p) != NO)
king33jp 0:7db6d9893ccb 145 /*nothing*/;
king33jp 0:7db6d9893ccb 146 cls();
king33jp 0:7db6d9893ccb 147 line(width() -5, height() - 8,width() - 5,height() -1,White); // paint cross
king33jp 0:7db6d9893ccb 148 line(width() - 8,height() - 5,width() - 1,height() - 5,White);
king33jp 0:7db6d9893ccb 149 if (font)
king33jp 0:7db6d9893ccb 150 {
king33jp 0:7db6d9893ccb 151 locate(pos_x,pos_y);
king33jp 0:7db6d9893ccb 152 printf("press cross ");
king33jp 0:7db6d9893ccb 153 locate(pos_x,pos_y + font[2]);
king33jp 0:7db6d9893ccb 154 printf("to calibrate ");
king33jp 0:7db6d9893ccb 155 }
king33jp 0:7db6d9893ccb 156 for (i=0; i<5; i++) {
king33jp 0:7db6d9893ccb 157 while (getTouch(p) != YES)
king33jp 0:7db6d9893ccb 158 /*nothing*/;
king33jp 0:7db6d9893ccb 159 c+= p.x;
king33jp 0:7db6d9893ccb 160 d+= p.y;
king33jp 0:7db6d9893ccb 161 }
king33jp 0:7db6d9893ccb 162 c = c / 5;
king33jp 0:7db6d9893ccb 163 d = d / 5;
king33jp 0:7db6d9893ccb 164 x_off = a;
king33jp 0:7db6d9893ccb 165 y_off = b;
king33jp 0:7db6d9893ccb 166 i = c-a; // delta x
king33jp 0:7db6d9893ccb 167 pp_tx = i / (width() - 6);
king33jp 0:7db6d9893ccb 168 i = d-b; // delta y
king33jp 0:7db6d9893ccb 169 pp_ty = i / (height() - 6);
king33jp 0:7db6d9893ccb 170 if (font)
king33jp 0:7db6d9893ccb 171 {
king33jp 0:7db6d9893ccb 172 locate(pos_x,pos_y);
king33jp 0:7db6d9893ccb 173 printf("Calibrated ");
king33jp 0:7db6d9893ccb 174 locate(pos_x,pos_y + font[2]);
king33jp 0:7db6d9893ccb 175 printf("x %6i %4i", x_off, pp_tx);
king33jp 0:7db6d9893ccb 176 locate(pos_x,pos_y + 2*font[2]);
king33jp 0:7db6d9893ccb 177 printf("y %6i %4i", y_off, pp_ty);
king33jp 0:7db6d9893ccb 178 }
king33jp 0:7db6d9893ccb 179 while (getTouch(p) != NO)
king33jp 0:7db6d9893ccb 180 /*nothing*/;
king33jp 0:7db6d9893ccb 181 cls();
king33jp 0:7db6d9893ccb 182 }
king33jp 0:7db6d9893ccb 183
king33jp 0:7db6d9893ccb 184 point SX032QVGA008::toPixel(point p)
king33jp 0:7db6d9893ccb 185 {
king33jp 0:7db6d9893ccb 186 p.x -= x_off;
king33jp 0:7db6d9893ccb 187 p.x /= pp_tx;
king33jp 0:7db6d9893ccb 188 int w = width();
king33jp 0:7db6d9893ccb 189 if (p.x > w) p.x = w;
king33jp 0:7db6d9893ccb 190 if (p.x < 0) p.x = 0;
king33jp 0:7db6d9893ccb 191 p.y -= y_off;
king33jp 0:7db6d9893ccb 192 p.y /= pp_ty;
king33jp 0:7db6d9893ccb 193 int h = height();
king33jp 0:7db6d9893ccb 194 if (p.y > h) p.y = h;
king33jp 0:7db6d9893ccb 195 if (p.y < 0) p.y = 0;
king33jp 0:7db6d9893ccb 196 return (p);
king33jp 0:7db6d9893ccb 197 }
king33jp 0:7db6d9893ccb 198
king33jp 0:7db6d9893ccb 199 bool SX032QVGA008::getPixel(point& p)
king33jp 0:7db6d9893ccb 200 {
king33jp 0:7db6d9893ccb 201 TOUCH touch = getTouch(p);
king33jp 0:7db6d9893ccb 202 p = toPixel(p);
king33jp 0:7db6d9893ccb 203 return touch == YES;
king33jp 0:7db6d9893ccb 204 }