Sample TFT to KL25Z program.

Dependencies:   SPI_STMPE610 TFT_fonts UniGraphic mbed

Fork of TFT_test_frdm-kl25z by Motoo Tanaka

Revision:
5:449dc35a29bd
Parent:
3:34d8706e1614
--- a/main.cpp	Sat Aug 08 12:27:57 2015 +0000
+++ b/main.cpp	Tue Feb 13 20:21:30 2018 +0000
@@ -1,401 +1,194 @@
-/* mbed main.cpp to test adafruit 2.8" TFT LCD shiled w Touchscreen
- * Copyright (c) 2014 Motoo Tanaka @ Design Methodology Lab
+/*******************************************************************
+ * TFT Sample program for STEM project
+ * By Henry Foley, Feb 2017
  *
- * 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.
+ * Hardware: Freedom KL25Z uC development board with a TFT 2.8"
+ * resistive touch display shield from Adafruit (1651).
+ *
  */
- 
- /* 
-  * Note: This program is derived from the SeeeStudioTFTv2 program.
-  * Although both program share same ILI9341 TFT driver,
-  * the touch sensor was not same with the Display I purchased from Akizuki.
-  * http://akizukidenshi.com/catalog/g/gM-07747/
-  * The touch sensor on the display is STMPE610,
-  * so I hacked the minimum spi driver for it (polling mode only).
-  */
 
 #include "mbed.h"
-#include "MMA8451Q.h"
-#include "TSISensor.h"
-#include <math.h>
 #include "ILI9341.h"
 #include "SPI_STMPE610.h"
 #include "Arial12x12.h"
 #include "Arial24x23.h"
 #include "Arial28x28.h"
-#include "Arial43x48_numb.h"
-
+#include "Verdana22x21-16.h"
 
 #define PIN_XP          PTB3
 #define PIN_XM          PTB1
 #define PIN_YP          PTB2
 #define PIN_YM          PTB0
 #define PIN_MOSI        PTD2
-#define PIN_MISO        PTD3 
-#define PIN_SCLK        PTD1 
-#define PIN_CS_TFT      PTD0 
-#define PIN_DC_TFT      PTD5 
-#define PIN_BL_TFT      PTC9 
-#define PIN_CS_SD       PTA4 
+#define PIN_MISO        PTD3
+#define PIN_SCLK        PTD1
+#define PIN_CS_TFT      PTD0
+#define PIN_DC_TFT      PTD5
+#define PIN_BL_TFT      PTC9
+#define PIN_CS_SD       PTA4
 #define PIN_CS_TSC      PTA13
-#define PIN_TSC_INTR    PTC9
-#define PIN_RESET_TFT   PTB10
+#define PIN_RESET_TFT   PTB10  
 
-#define MMA8451_I2C_ADDRESS (0x1d<<1)
-MMA8451Q *acc = 0 ;
-TSISensor tsi;
+
 
 DigitalOut backlight(PTA12) ;
-ILI9341 TFT(SPI_8, 10000000, 
-    PIN_MOSI, PIN_MISO,  PIN_SCLK, 
-    PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8") ;
+
 SPI_STMPE610 TSC(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TSC) ;
 
-DigitalIn pinD7(PTC9) ;
+ILI9341 TFT(SPI_8, 10000000,
+            PIN_MOSI, PIN_MISO,  PIN_SCLK,
+            PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8") ;
+            
+void initTFT(void);
+void drawScreen(void);
+uint16_t map(uint16_t, uint16_t, uint16_t, uint16_t, uint16_t);
+void display_xy(void);
+
+int main()
+{
+    static uint16_t x, y, z ;
+    uint16_t temp_x;
+    int touched = 0;
+
+    initTFT() ;
 
-int page = 0 ;
-int numPage = 5 ;
-
-extern void doMaze(void) ;
+    drawScreen();
+     
+    while(true)
+    {
+        touched = TSC.getRAWPoint(&x, &y, &z);
+        
+        if(touched)  // any touch
+        {
+                
+            // scale the raw values to match the screen orentation and 320(x = horiz) 240(y = vert) size, 0,0 = upper left corner
+            temp_x = x;
+            x = map(y,180, 3800,0,320);
+            y = map(temp_x,3800,280,0,240);
+            if( (x > 0 && x < 320) && ( y > 0 && y < 240 ))  // if valid values
+            {
+                drawScreen();
+                
+                TFT.BusEnable(true) ;
+                TFT.background(Blue);
+                wait(0.2);
+                TFT.foreground(White);
+                TFT.locate(120, 160);
+                TFT.printf("x%3d", x);
+                TFT.locate(120, 190);
+                TFT.printf("y%3d", y);                
+                TFT.BusEnable(false) ;
+                wait(0.5); // to reduce mutiple hits from one touch
+            }
+        
+        } 
+    }
+} // end of main()
 
 void initTFT(void)
 {
     //Configure the display driver
     TFT.BusEnable(true) ;
-    TFT.FastWindow(true) ;
-    TFT.background(Black);
+    TFT.set_orientation(1);
+    backlight = 1 ;
+    TFT.background(Blue);
+    wait(0.2);
     TFT.foreground(White);
-    wait(0.01) ;
+    wait(0.2);
     TFT.cls();
+    wait(0.2);
+    TFT.set_font((unsigned char*) Arial28x28);
+    wait(0.2);
+    TFT.locate(15, 10);
+    TFT.printf("  TFT Test  ");
+    TFT.locate(15, 100);
+    TFT.BusEnable(false);
+    wait(5);
+}
+
+
+void drawScreen(void)
+{
+    TFT.BusEnable(true);
+    TFT.foreground(White);  // Set default text colors
+    TFT.background(Blue);
+    TFT.cls();              // wipe the screen clean and set bg colors
+    wait(0.1);
+
+    TFT.foreground(Black);
+    TFT.set_font((unsigned char*) Arial24x23);
+    TFT.fillcircle(  60, 175, 50, Yellow);
+    TFT.background(Yellow) ;
+    TFT.locate(25, 160);
+    TFT.printf(" A ");
+
+    TFT.fillcircle( 160, 105, 50, Cyan);
+    TFT.background(Cyan) ;
+    TFT.locate(127, 92);
+    TFT.printf(" B ");
+
+    TFT.fillcircle( 260, 175, 50, Green);
+    TFT.background(Green) ;
+    TFT.locate(222, 160);
+    TFT.printf("  C  ");
+    
+    TFT.fillcircle( 60, 60, 50, Orange);
+    TFT.background(Orange) ;
+    TFT.locate(15, 50);
+    TFT.printf("  D  ");
+    
+    TFT.fillcircle( 260, 60, 50, GreenYellow);
+    TFT.background(GreenYellow) ;
+    TFT.locate(225, 50);
+    TFT.printf("  E  ");   
+
     TFT.BusEnable(false) ;
 }
 
-void screen1(void) // Welcome Screen
-{
-    TFT.BusEnable(true) ;
-    backlight = 0 ;
-    TFT.background(White) ;
-    wait(0.1) ;
-    TFT.cls() ;
-    wait(0.1) ;
-    
-    TFT.set_font((unsigned char*) Arial24x23);
-    TFT.foreground(Red) ;
-    TFT.locate(80, 40) ;
-    TFT.printf("MBED") ;
-    TFT.foreground(Blue);
-    TFT.locate(60, 80) ;
-    TFT.printf("2.8\"TFT") ; 
-    TFT.locate(40, 120) ;
-    TFT.printf("with touch") ;
-    TFT.foreground(Black);
-    TFT.set_font((unsigned char*) Arial12x12);
-    TFT.foreground(Blue) ;
-    TFT.locate(30, 180) ;
-    TFT.printf("This program is running on") ;
-    TFT.locate(30, 200) ;
-    TFT.printf("freescale FRDM-KL25Z with") ;
-    TFT.locate(30, 220) ;
-    TFT.printf("a program developed in mbed") ;
-    TFT.foreground(Green) ;
-    TFT.locate(30, 260) ;
-    TFT.printf("To advance demo page, touch") ;
-    TFT.locate(30, 280) ;
-    TFT.printf("and hold right side of screen") ;
-    TFT.locate(30, 300) ;
-    TFT.printf("until the next screen starts") ;
-    TFT.BusEnable(false) ;
-    backlight = 1 ;
-}
-
-void screen2(void) // Graphics
+// mapping function to change the orentation of the screen to horizontal
+uint16_t map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max)
 {
-    //Draw some graphics
-    int i, x[2], y[2] ;
-    backlight = 0 ;
-    TFT.BusEnable(true) ;
-    TFT.background(Black);
-    wait(0.1) ;
-    TFT.foreground(White);
-    wait(0.1) ;
-    TFT.cls() ;
-    wait(0.1) ;
-    TFT.set_font((unsigned char*) Arial12x12);
-    TFT.locate(90,0);
-    TFT.printf("Graphics");
-    
-    x[0] = 25 ; x[1] = 224 ;
-    y[0] = 20 ; y[1] = 219 ;
-    for (i = 20 ; i < 220 ; i += 10) {
-        TFT.line(i+5, y[0], i+5, y[1], Blue) ;
-        TFT.line(x[0], i, x[1], i, Blue) ;
-    }
-    TFT.line(125, y[0], 125, y[1], Green) ;
-    TFT.line(x[0], 120, x[1], 120, Green) ;
-    TFT.rect(x[0],y[0], x[1], y[1], Green) ;
-    TFT.locate(10, 20) ;
-    TFT.printf("V") ;
-    TFT.locate(0, 115) ;
-    TFT.printf("0.0") ;
-    TFT.locate(115, 225) ;
-    TFT.printf("0.0") ;
-    TFT.locate(215, 225) ;
-    TFT.printf("T") ;
-
-    double s;
-    for (int i = x[0]; i < 225; i++) {
-        s = 40 * sin((long double)i / 20);
-        TFT.pixel(i, 120 + (int)s, White);
-    }
-    
-    TFT.fillrect(10, 240, 229, 309, White) ;
-    TFT.rect(10, 240, 229, 309, Red) ;
-    TFT.rect(11, 241, 228, 308, Red) ;
-    
-    TFT.background(White) ;
-    TFT.foreground(Black) ;
-    TFT.locate(20, 250) ;
-    TFT.printf("With QVGA resolution") ;
-    TFT.locate(20, 270) ;
-    TFT.printf("simple graphics drawing") ;
-    TFT.locate(20, 290) ;
-    TFT.printf("capability is provided") ;
-    TFT.BusEnable(false) ;
-    backlight = 1 ;
-}    
-
-double clip(double src)
-{
-    double value ;
-    value = src ;
-    if (value < 0.0) {
-        value = 0.0 ;
-    } else if (value > 2.0) {
-        value = 2.0 ;
-    }
-    return( value ) ;
+    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
 }
 
-void screen3(void)
+// Code used to debug screen orentation and touch pad
+void display_xy(void)
 {
-    int t = 0 ;
-    int pt = 0 ; // previous t 
-    int i, x, y ;
-    unsigned int data[3] ; // for x, y, z 
-    unsigned int prev[3] ;
-    unsigned short signalHeight = 39 ;
-    unsigned short xoffset = 30 ;
-    unsigned short yoffset = 120 ;
-    unsigned short zoffset = 210 ;
-    unsigned short paneX[2] = {20, 235} ;
-    unsigned short paneH = 81 ;
- 
-    backlight = 1 ;
-    TFT.BusEnable(true) ;
-    TFT.background(Black) ;
-    TFT.foreground(White) ;
-//    TFT.cls() ;
+    static uint16_t x, y, z ;
+    uint16_t temp_x;
+    int touched = 0;
+
+    while(true) {
+        touched = TSC.getRAWPoint(&x, &y, &z);
 
+        x = x & 0x7f;
+        y = y & 0x7f;
+        
+        if(x) { // any touch
+            wait(0.5);
+            TFT.BusEnable(true);
+            TFT.locate(5, 40);
+            TFT.printf("x= %5d x=%4X", x, x);
+            TFT.locate(5, 80);
+            TFT.printf("y= %5d y=%4X", y, y);
+ //           TFT.locate(5, 120);
+ //           TFT.printf("raw z%6d  z%4X", z, z);           
+
+            // scale the raw values to match the screen orentation and 320(x = horiz) 240(y = vert) size
+            // 0,0 = upper left corner
+            temp_x = x;
+            x = map(y,180, 3800,0,320);              // TFT.set_orientation(1);
+            y = map(temp_x,3800,280,0,240);
+
+//          x = map(y,3800, 180,0,320);              // TFT.set_orientation(3);
+//          y = map(temp_x,280,3800,0,240);
+
+            TFT.locate(5, 120);
+            TFT.printf("map x%5d y%5d", x, y);
  
-    TFT.fillrect(paneX[0], xoffset, paneX[1], xoffset+paneH, Black) ;
-    TFT.fillrect(paneX[0], yoffset, paneX[1], yoffset+paneH, Black) ;
-    TFT.fillrect(paneX[0], zoffset, paneX[1], zoffset+paneH, Black) ;
-    TFT.fillrect(paneX[0], xoffset, paneX[1], xoffset+paneH, Black) ;
-    for (i = 0 ; i < 10 ; i++ ) {
-        y = i * 8 ;
-        TFT.line(paneX[0], xoffset + y, paneX[1], xoffset + y, Blue) ;
-        TFT.line(paneX[0], yoffset + y, paneX[1], yoffset + y, Blue) ;
-        TFT.line(paneX[0], zoffset + y, paneX[1], zoffset + y, Blue) ;
-    }
-    for (x = 30 ; x < paneX[1] ; x += 10 ) {
-        TFT.line(x, xoffset, x, xoffset+paneH, Blue) ;
-        TFT.line(x, yoffset, x, yoffset+paneH, Blue) ;
-        TFT.line(x, zoffset, x, zoffset+paneH, Blue) ;
-    } 
-    TFT.rect(paneX[0], xoffset, paneX[1], xoffset+paneH, White) ;
-    TFT.rect(paneX[0], yoffset, paneX[1], yoffset+paneH, White) ;
-    TFT.rect(paneX[0], zoffset, paneX[1], zoffset+paneH, White) ;
-    TFT.set_font((unsigned char*) Arial12x12);
-    TFT.locate(5, xoffset+30) ;
-    TFT.printf("X") ;
-    TFT.locate(5, yoffset+30) ;
-    TFT.printf("Y") ;
-    TFT.locate(5, zoffset+30) ;
-    TFT.printf("Z") ;
-    TFT.locate(50, 10) ;
-    TFT.printf("Xtrinsic Accelerometer") ;
-    TFT.locate(90, 300) ;
-    TFT.printf("MMA8451Q") ;
-    
-    prev[0] = xoffset + (signalHeight * clip((1.0 + acc->getAccX()))) ;
-    prev[1] = yoffset + (signalHeight * clip((1.0 + acc->getAccY()))) ;
-    prev[2] = zoffset + (signalHeight * clip((1.0 + acc->getAccZ()))) ;
-    pt = paneX[0] ;
-    backlight = 1 ;
-    for(t = 21 ; t < paneX[1] ; t++) {
-        data[0] = xoffset + (signalHeight * clip((1.0 + acc->getAccX()))) ;
-        data[1] = yoffset + (signalHeight * clip((1.0 + acc->getAccY()))) ;
-        data[2] = zoffset + (signalHeight * clip((1.0 + acc->getAccZ()))) ;
-        TFT.line(pt, prev[0], t, data[0], Red) ;
-        TFT.line(pt, prev[1], t, data[1], Green) ;
-        TFT.line(pt, prev[2], t, data[2], Yellow) ;
-        prev[0] = data[0] ;
-        prev[1] = data[1] ;
-        prev[2] = data[2] ;
-        pt = t ;
-        wait(0.01) ;
-    }
-    TFT.BusEnable(false) ;
-}
-
-void screen4(void)
-{
-    int dx, px ;
-    float delta = 0.0 ;
-    dx = 0 ;
-    px = 0 ;
-    backlight = 0 ;
-    TFT.BusEnable(true) ;
-    TFT.background(Black);
-    wait(0.1) ;
-    TFT.foreground(White);
-    wait(0.1) ;
-    TFT.cls() ;
-    wait(0.1) ;
-
-    TFT.set_font((unsigned char*) Arial12x12);
-    TFT.foreground(Blue) ;
-    TFT.locate(60, 10) ;
-    TFT.printf("<< TSI demo >>") ;
-    TFT.locate(30, 280) ;
-    TFT.printf("Use FRDM touch slider") ;
-    TFT.locate(30, 300) ;
-    TFT.printf("Touch right edge to end") ;
-    
-    TFT.fillcircle(120, 160, 100, Green) ;
-    TFT.fillcircle(60, 160, 50, Black) ;
-    TFT.fillcircle(60, 160, 45, White) ;
-    TFT.fillcircle(180, 160, 50, Black) ;
-    TFT.fillcircle(180, 160, 45, White) ;
-    TFT.fillcircle(60, 160, 5, Black) ;
-    TFT.fillcircle(180, 160, 5, Black) ;
-    backlight = 1 ;
-
-    while(dx < 38) {
-      delta = (80.0 * (tsi.readPercentage()-0.5)) ;
-      dx = (int)(delta + 0.5) ;
-      TFT.fillcircle(60+px, 160, 5, White) ;
-      TFT.fillcircle(180+px, 160, 5, White) ;
-      TFT.fillcircle(60+dx, 160, 5, Black) ;
-      TFT.fillcircle(180+dx, 160, 5, Black) ;
-      px = dx ;
-      wait(0.1) ;
-    }
-    TFT.fillcircle(60+px, 160, 5, White) ;
-    TFT.fillcircle(180+px, 160, 5, White) ;
-    TFT.line(15, 160, 105, 160, Black) ;
-    TFT.line(135, 160, 225, 160, Black) ;
-    TFT.foreground(Yellow) ;
-    TFT.locate(30, 300) ;
-//    TFT.printf("Use FRDM touch slider") ;
-    TFT.printf("       Wake Up!          ") ;
-    TFT.locate(5, 300) ;
-    TFT.printf("<< Prev") ;
-    TFT.locate(180, 300) ;
-    TFT.printf("Next >>") ;
-    TFT.BusEnable(false) ;
-}
-
-void incPage(void)
-{
-    page++ ;
-    if (page >= numPage) {
-        page = 0 ;
+            TFT.BusEnable(false);
+            wait(0.5);
+        }
     }
 }
-
-void decPage(void) 
-{
-    page-- ;
-    if (page < 0) {
-        page = numPage - 1 ;
-    }
-}
-    
-int main()
-{
-    uint16_t x, y, z ;
-    int prevPage = 99 ;
-    bool waitTouch = false ;
-    
-    acc = new MMA8451Q(PTE25, PTE24, MMA8451_I2C_ADDRESS) ;
-    
-    initTFT() ;
-    
- //   screen0() ;
-        
-    printf("Program Started!\n\r") ;
-    
-    for(;;) {
-//        printf("TFT width = %d, height = %d\n\r", TFT.width(), TFT.height()) ;
-        switch(page) {
-        case 0:
-            if (prevPage != page) {
-                screen1() ;
-            }
-            waitTouch = true ;
-            break ;
-        case 1:
-            if (prevPage != page) {
-                screen2() ; 
-            }
-            waitTouch = true ;
-            break ;
-        case 2:
-            if (prevPage != page) {
-                TFT.BusEnable(true) ;
-                TFT.background(Black) ;
-                TFT.foreground(White) ;
-                TFT.cls() ;
-                TFT.BusEnable(false) ;
-            }
-            screen3() ; 
-            waitTouch = false ;
-            break ;
-        case 3:
-//            if (prevPage != page) {
-                screen4() ;
-                waitTouch = true ;
-//            }
-            break ;
-        case 4:
-//            if (prevPage != page) {
-                doMaze() ;
-                waitTouch = true ;
-//            }
-            break ;
-        default:
-            page = 0 ; 
-            break ;
-        }
-        prevPage = page ;
-
-        do {
-            TSC.getRAWPoint(&x, &y, &z) ;
-            if ((x != 0)||(y != 0) || (z != 0)) {
-                if (x < 1000) { // left
-                    decPage() ;
-                } else if (x > 3000) { // right
-                    incPage() ;
-                }
-                waitTouch = false ;
-            }
-        } while(waitTouch != false) ;
-//        wait(1) ;
-    }
-}
+    
\ No newline at end of file