Library for SeeedStudioTFTv2 2.8 Zoll 240x360 pixel touch SD card
Dependents: SeeedStudioTFTv2_HelloWorld SeeedTouchLCD Seeed_TFT_Touch_Shield_v2_HelloWorld
Fork of SeeedStudioTFTv2 by
Revision 4:4542d1ff81e4, committed 2013-10-19
- Comitter:
- mazgch
- Date:
- Sat Oct 19 20:51:48 2013 +0000
- Parent:
- 3:1e05b273008a
- Child:
- 5:366bdc7a8315
- Commit message:
- SeeedStudioTFTv2 shield with Touch support
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SPI_TFT_ILI9341.lib Sat Oct 19 20:51:48 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/dreschpe/code/SPI_TFT_ILI9341/#f018e272220b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SeeedStudioTFTv2.cpp Sat Oct 19 20:51:48 2013 +0000 @@ -0,0 +1,193 @@ +/* mbed library for resistive touch pads + * uses 4 pins - 2 IO and 2 Analog + + * c 2011 Peter Drescher - DC2PD + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "mbed.h" +#include "SeeedStudioTFTv2.h" + +SeeedStudioTFTv2::SeeedStudioTFTv2(PinName xp, PinName xm, PinName yp, PinName ym, + PinName mosi, PinName miso, PinName sclk, + PinName csTft, PinName rstTft, PinName dcTft, PinName blTft, + PinName csSd): + SPI_TFT_ILI9341(mosi,miso,sclk,csTft,rstTft,dcTft, "tft") +#ifdef USE_SDCARD + ,SDFileSystem(mosi,miso,sclk,csSd, "sdc") +#endif +{ +#ifndef USE_SDCARD + // sd card + DigitalOut cs(csSd); + cs = 1; +#endif + // backlight + DigitalOut bl(blTft); + bl = 1; + // touch screen pins + _xp = xp; + _yp = yp; + _xm = xm; + _ym = ym; + // default touch calibration + // orientation // 0 1 2 3 + x_off = 108000; // 17252 16605 108755 108000 + y_off = 22000; // 22330 105819 97167 22000 + pp_tx = -291; // 378 289 -390 -291 + pp_ty = 356; // 261 -355 -239 356 +} + +int SeeedStudioTFTv2::readTouch(PinName p, PinName m, PinName a, PinName i) +{ + DigitalOut _p(p); + _p = 1; + DigitalOut _m(m); + _m = 0; + AnalogIn _a(a); + DigitalIn _i(i); + wait_us(10); + return _a.read_u16(); +} + +SeeedStudioTFTv2::TOUCH SeeedStudioTFTv2::getTouch(point& p) +{ + int y2 = readTouch(_xp,_xm,_yp,_ym); + int x2 = readTouch(_yp,_ym,_xp,_xm); + int y1 = readTouch(_xp,_xm,_yp,_ym); + int x1 = readTouch(_yp,_ym,_xp,_xm); + int xd = x1 - x2; + int yd = y1 - y2; + xd = (xd > 0) ? xd : -xd; + yd = (yd > 0) ? xd : -xd; + p.x = x1 + x2; + p.y = y1 + y2; +#if 0 + DigitalOut _p(_xp); + _p = 1; + DigitalOut _m(_ym); + _m = 0; + AnalogIn _ax(_xm); + AnalogIn _ay(_yp); + wait_us(20); + int ax = _ax.read_u16(); + int ay = _ay.read_u16(); + float z = 0; + z = (float)ay / ax / x / 2 * 0x10000; +#endif + const int th = 8000; + const int df = 100; + TOUCH touch; + if (x1 < th || x2 < th || + y1 < th || y2 < th) { + p.x = 0; + p.y = 0; + touch = NO; + } else if (xd > df || yd > df) { + touch = MAYBE; + } else { + touch = YES; + } + //locate(0,50); + //printf("x: %6i y: %6i",p.x,p.y); + return touch; +} + +void SeeedStudioTFTv2::calibrate(void) +{ + int i; + int a = 0,b = 0,c = 0, d = 0; + int pos_x, pos_y; + point p; + + cls(); + foreground(White); // set chars to white + line(0,3,6,3,White); + line(3,0,3,6,White); + // get the center of the screen + pos_x = columns() / 2 - 3; + pos_x = pos_x * font[1]; + pos_y = (rows() / 2) - 1; + pos_y = pos_y * font[2]; + locate(pos_x,pos_y); + printf("press cross "); + locate(pos_x,pos_y + font[2]); + printf("to calibrate "); + for (i=0; i<5; i++) { + while (getTouch(p) != YES) + /*nothing*/; + a += p.x; + b += p.y; + } + a = a / 5; + b = b / 5; + locate(pos_x,pos_y); + printf("ok "); + locate(pos_x,pos_y + font[2]); + printf("release touch "); + while (getTouch(p) != NO) + /*nothing*/; + cls(); + line(width() -5, height() - 8,width() - 5,height() -1,White); // paint cross + line(width() - 8,height() - 5,width() - 1,height() - 5,White); + locate(pos_x,pos_y); + printf("press cross "); + locate(pos_x,pos_y + font[2]); + printf("to calibrate "); + for (i=0; i<5; i++) { + while (getTouch(p) != YES) + /*nothing*/; + c+= p.x; + d+= p.y; + } + c = c / 5; + d = d / 5; + locate(pos_x, pos_y); + + x_off = a; + y_off = b; + i = c-a; // delta x + pp_tx = i / (width() - 6); + i = d-b; // delta y + pp_ty = i / (height() - 6); + + locate(pos_x,pos_y); + printf("Calibrated "); + locate(pos_x,pos_y + font[2]); + printf("x %6i %4i", x_off, pp_tx); + locate(pos_x,pos_y + 2*font[2]); + printf("y %6i %4i", y_off, pp_ty); + while (getTouch(p) != NO) + /*nothing*/; + cls(); +} + +point SeeedStudioTFTv2::toPixel(point p) +{ + p.x -= x_off; + p.x /= pp_tx; + int w = width(); + if (p.x > w) p.x = w; + if (p.x < 0) p.x = 0; + p.y -= y_off; + p.y /= pp_ty; + int h = height(); + if (p.y > h) p.y = h; + if (p.y < 0) p.y = 0; + return (p); +} + +bool SeeedStudioTFTv2::getPixel(point& p) +{ + TOUCH touch = getTouch(p); + p = toPixel(p); + return touch == YES; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SeeedStudioTFTv2.h Sat Oct 19 20:51:48 2013 +0000 @@ -0,0 +1,85 @@ +/* mbed library for touchscreen connected to 4 mbed pins + * derive from SPI_TFT lib + * Copyright (c) 2011 Peter Drescher - DC2PD + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MBED_TOUCH_H +#define MBED_TOUCH_H + +#include "mbed.h" +#include "SPI_TFT_ILI9341.h" +#ifdef USE_SDCARD +#include "SDFileSystem.h" +#endif + +struct point { + int x; + int y; +}; + +class SeeedStudioTFTv2 : public SPI_TFT_ILI9341 +#ifdef USE_SDCARD + , SDFileSystem +#endif +{ +public: + /** create a TFT with touch object connected to the pins: + * + * @param pin xp resistiv touch x+ + * @param pin xm resistiv touch x- + * @param pin yp resistiv touch y+ + * @param pin ym resistiv touch y- + * @param mosi,miso,sclk SPI connection to TFT + * @param cs pin connected to CS of display + * @param reset pin connected to RESET of display + * based on my SPI_TFT lib + */ + SeeedStudioTFTv2(PinName xp, PinName xm, PinName yp, PinName ym, + PinName mosi, PinName miso, PinName sclk, + PinName csTft, PinName rstTft, PinName dcTft, PinName blTft, + PinName csSd); + + /** calibrate the touch display + * + * User is asked to touch on two points on the screen + */ + void calibrate(void); + + /** read x and y coord on screen + * + * @returns point(x,y) + */ + bool + getPixel(point& p); + + /** calculate coord on screen + * + * @param a_point point(analog x, analog y) + * @returns point(pixel x, pixel y) + * + */ + point toPixel(point p); + +protected: + PinName _xm; + PinName _ym; + PinName _xp; + PinName _yp; + + typedef enum { YES, MAYBE, NO } TOUCH; + TOUCH getTouch(point& p); + int readTouch(PinName p, PinName m, PinName a, PinName i); + + int x_off,y_off; + int pp_tx,pp_ty; +}; + +#endif
--- a/touch_tft.cpp Fri Oct 18 18:29:09 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,195 +0,0 @@ -/* mbed library for resistive touch pads - * uses 4 pins - 2 IO and 2 Analog - - * c 2011 Peter Drescher - DC2PD - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -#include "touch_tft.h" -#include "mbed.h" - -#define threshold 0x2000 // threshold to detect pressed - -touch_tft::touch_tft(PinName xp, PinName xm, PinName yp, PinName ym, - PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset,PinName dc,const char* name): - _xp(xp),_xm(xm),_yp(yp),_ym(ym),_ax(xp),_ay(yp), - SPI_TFT_ILI9341(mosi,miso,sclk,cs,reset,dc,name) { - xa = xp; - ya = yp; - -} - -point touch_tft::get_touch() { - unsigned short x1 = 0,x2 = 0, y1 = 0, y2 = 0; - unsigned int s1 = 0,s2 = 0,d1 , d2; - point p; - - do { - // read y voltage - _xp.output(); - _xm.output(); - switch (orientation) { - case(0): - case(3): - _xp = 1; - _xm = 0; - break; - case(1): - case(2): - _xp = 0; - _xm = 1; - break; - } - _ym.input(); // y- have to be passive - AnalogIn Ay(ya); // we have to call the constructor to switch to analog mode - wait_us(10); - y1 = Ay.read_u16(); // get y voltage - d1 = (y1 > y2)? (y1-y2) : (y2-y1); - if (((y1 < 8000) && (d1 < 2000)) || ((y1 > 8000) && (d1 < 150))) s1 ++; - else { - if (s1 > 0) s1 --; - } - y2 = y1; - // debug - /**/locate(1,7); - /**/this->printf("d: %4d y: %5d s1: %4d",d1,y1,s1); - - // read x voltage - _yp.output(); - _ym.output(); - switch (orientation) { - case(0): - case(1): - _yp = 1; - _ym = 0; - break; - case(2): - case(3): - _yp = 0; - _ym = 1; - break; - } - _xm.input(); // x- have to be passive - AnalogIn Ax(xa); // we have to call the constructor to switch to analog mode - wait_us(10); - x1 = Ax.read_u16(); // get x voltage - d2 = (x1 > x2)? (x1-x2) : (x2-x1); - if (((x1 < 8000) && (d2 < 2000)) || ((x1 > 8000) && (d2 < 150))) s2 ++; - else { - if (s2 > 0) s2 --; - } - x2 = x1; - // debug - /**/locate(1,8); - /**/this->printf("d: %4d x: %5d s2: %4d",d2,x1,s2); - - } while (s1 < 3 || s2 < 3); // read until we have three samples close together - switch (orientation) { - case(0): - case(2): - p.y = (x1+x2) / 2; // average of two sample - p.x = (y1+y2) / 2; - break; - case(1): - case(3): - p.x = (x1+x2) / 2; // average of two sample - p.y = (y1+y2) / 2; - break; - } - return(p); -} - -void touch_tft::calibrate(void) { - int i; - int a = 0,b = 0,c = 0, d = 0; - int pos_x, pos_y; - point p; - - cls(); - foreground(White); // set chars to white - line(0,3,6,3,White); - line(3,0,3,6,White); - - // get the center of the screen - pos_x = columns() / 2 - 3; - pos_x = pos_x * font[1]; - pos_y = (rows() / 2) - 1; - pos_y = pos_y * font[2]; - - locate(pos_x,pos_y); - this->printf("press cross"); - locate(pos_x,pos_y + font[2]); - this->printf("to calibrate"); - for (i=0; i<5; i++) { - do { - p = get_touch(); - } while (p.x < 0x2000 | p.y < 0x2000); // wait for touch - a += p.x; - b += p.y; - } - a = a / 5; - b = b / 5; - locate(pos_x,pos_y); - this->printf("OK "); - do { - p = get_touch(); - } while (p.y > 0x2000 | p.x > 0x2000); // wait for no touch - - cls(); - line(width() -5, height() - 8,width() - 5,height() -1,White); // paint cross - line(width() - 8,height() - 5,width() - 1,height() - 5,White); - locate(pos_x,pos_y); - this->printf("press cross"); - locate(pos_x,pos_y + font[2]); - this->printf("to calibrate"); - for (i=0; i<5; i++) { - do { - p = get_touch(); - } while (p.y < 0x2000 | p.x < 0x2000); // wait for touch - c+= p.x; - d+= p.y; - } - c = c / 5; - d = d / 5; - - locate(pos_x, pos_y); - this->printf("OK "); - do { - p = get_touch(); - } while (p.y > 0x2000 | p.x > 0x2000); // wait for no touch - - cls(); - - x_off = a; - y_off = b; - - i = c-a; // delta x - pp_tx = i / (width() - 6); - - i = d-b; // delta y - pp_ty = i / (height() - 6); -} - - -point touch_tft::to_pixel(point a_point) { - point p; - - p.x = (a_point.x - x_off) / pp_tx; - if (p.x > width()) p.x = width(); - p.y = (a_point.y - y_off) / pp_ty; - if (p.y > height()) p.y = height(); - return (p); -} - -bool touch_tft::is_touched(point a) { - if (a.x > threshold & a.y > threshold) return(true); - else return(false); -}
--- a/touch_tft.h Fri Oct 18 18:29:09 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -/* mbed library for touchscreen connected to 4 mbed pins - * derive from SPI_TFT lib - * Copyright (c) 2011 Peter Drescher - DC2PD - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef MBED_TOUCH_H -#define MBED_TOUCH_H - -#include "mbed.h" -#include "SPI_TFT_ILI9341.h" - -struct point{ - unsigned short x; - unsigned short y; - }; - - -/** touchscreen control class, based on SPI_TFT - * - * Example: - * @code - * - * #include "mbed.h" - * #include "SPI_TFT.h" - * #include "Arial12x12.h" - * #include "Arial28x28.h" - * #include "touch_tft.h" - * // the TFT is connected to SPI pin 5-7 - * // the touch is connected to 19,20,16,17 - * - * touch_tft tt(p19,p20,p16,p17, &tft); // x+,x-,y+,y-,mosi, miso, sclk, cs, reset - * - * int main() { - * point p; - * - * tt.claim(stdout); // send stdout to the TFT display - * tt.background(Black); // set background to black - * tt.foreground(White); // set chars to white - * tt.cls(); // clear the screen - * tt.set_font((unsigned char*) Arial12x12); // select the font - * tt.set_orientation(1); - * - * tt.calibrate(); // calibrate the touch - * while (1) { - * p = tt.get_touch(); // read analog pos. - * if (tt.is_touched(p)) { // test if touched - * p = tt.to_pixel(p); // convert to pixel pos - * tt.fillcircle(p.x,p.y,3,Blue); // print a blue dot on the screen - * } - * } - * @endcode - */ -class touch_tft : public SPI_TFT_ILI9341 { -public: - /** create a TFT with touch object connected to the pins: - * - * @param pin xp resistiv touch x+ - * @param pin xm resistiv touch x- - * @param pin yp resistiv touch y+ - * @param pin ym resistiv touch y- - * @param mosi,miso,sclk SPI connection to TFT - * @param cs pin connected to CS of display - * @param reset pin connected to RESET of display - * based on my SPI_TFT lib - */ - touch_tft(PinName xp, PinName xm, PinName yp, PinName ym,PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset, PinName dc, const char* name ="TFT"); - - /** calibrate the touch display - * - * User is asked to touch on two points on the screen - */ - void calibrate(void); - - /** read x and y analog samples - * - * @returns point(x,y) - */ - point get_touch(void); - - /** calculate coord on screen - * - * @param a_point point(analog x, analog y) - * @returns point(pixel x, pixel y) - * - */ - point to_pixel(point a_point); - - /** test if screen is touched - * - * @param point analog x,y - * @returns true is touched - * - */ - bool is_touched(point a); - -protected: - DigitalInOut _xp; - DigitalInOut _xm; - DigitalInOut _yp; - DigitalInOut _ym; - AnalogIn _ax; - AnalogIn _ay; - PinName xa; - PinName ya; - - - unsigned short x_a,y_a; - unsigned short x_off,y_off; - unsigned short pp_tx,pp_ty; - - - - }; - -#endif \ No newline at end of file