TFT working with Nucleo L476
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
