aitendo SX032QVGA008
Dependencies: SPI_TFT_ILI9341ext
SX032QVGA008.cpp@1:6304deb80cc2, 2015-04-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |