![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Paint for the FRDM-KL25Z
Dependencies: mbed TFT_fonts SPI_TFT_ILI9341
main.cpp
- Committer:
- ecowboy
- Date:
- 2019-01-10
- Revision:
- 3:1396bac4ae71
- Parent:
- 2:fe018965e46c
- Child:
- 4:87b40e5986e7
File content as of revision 3:1396bac4ae71:
#include "mbed.h" #include "SPI_TFT_ILI9341.h" #include "Arial12x12.h" #include "BMP565.h" #include "stdio.h" #include "touch.h" #define PIN_XP PTB3 #define PIN_XM PTB2 #define PIN_YP PTB1 #define PIN_YM PTB0 #define PIN_MOSI PTD2 #define PIN_MISO PTD3 #define PIN_SCLK PTD1 #define PIN_CS_TFT PTA5 #define PIN_DC_TFT PTC8 #define PIN_BL_TFT PTC9 #define PIN_CS_SD PTA4 SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_BL_TFT, PIN_DC_TFT, "TFT"); TouchScreen tft(PIN_XP, PIN_YP, PIN_XM, PIN_YM); //init TouchScreen port pins // Paint application - Demonstate both TFT and Touch Screen int ColorPaletteHigh = 15; int color = White; //Paint brush color unsigned int colors[16] = {Red, Green, Blue, Cyan, Yellow, Purple, Pink, Black, Orange, Brown, BlueGreen, White, LightPink, DarkGrey, DarkGreen, Mustard}; int RXPLATE = 350; int Q = 1024; //10 bit TSC Resolution struct point { int x; int y; int z; }; typedef struct point Point; Point point(int xx, int yy, int zz){ Point p; p.x = xx; p.y = yy; p.z = zz; return p; } int Read_X(){ AnalogIn _yp(PTB2); AnalogIn _ym(PTB0); DigitalOut _xp(PTB3); DigitalOut _xm(PTB1); //uint16_t x1=1; //uint16_t x2=0; int x1=1; int x2=0; _xp = 1; _xm = 0; wait_us(50); //while(x1 != x2){ x1 = _yp.read_u16(); wait_us(50); x2 = _yp.read_u16(); wait_us(50); //} _xp=0; return (x1+x2)/2; } int Read_Y(){ //AnalogIn _xp(xp); AnalogIn _xp(PTB3); AnalogIn _xm(PTB1); DigitalOut _yp(PTB2); DigitalOut _ym(PTB0); //uint16_t y1=1; //uint16_t y2=0; int y1=1; int y2=0; _yp = 1; _ym = 0; wait_us(50); //while(y1 != y2){ y1 = _xp.read_u16(); wait_us(50); y2 = _xp.read_u16(); wait_us(50); //} _yp=0; return (y1+y2)/2; } int Read_Z1(){ AnalogIn _ym(PTB0); AnalogIn _xp(PTB3); DigitalOut _yp(PTB2); DigitalOut _xm(PTB1); //uint16_t y1=1; //uint16_t y2=0; int y1=1; int y2=0; _yp = 1; _xm = 0; wait_us(50); //while(y1 != y2){ int z1 = _xp.read_u16(); wait_us(50); int z2 = _xp.read_u16(); wait_us(50); //} _yp=0; return (z1+z2)/2; } int Read_Z2(){ AnalogIn _ym(PTB0); AnalogIn _xp(PTB3); DigitalOut _yp(PTB2); DigitalOut _xm(PTB1); //uint16_t y1=1; //uint16_t y2=0; int y1=1; int y2=0; _yp = 1; _xm = 0; wait_us(50); //while(y1 != y2){ int z1 = _ym.read_u16(); wait_us(50); int z2 = _ym.read_u16(); wait_us(50); //} _yp=0; return (z1+z2)/2; } Point getPoint(){ //PinName _yp, _ym, _xm, _xp; float z; int y2 = Read_Y(); int x2 = Read_X(); int z1 = Read_Z1(); int z2 = Read_Z2(); //int y2 = tft.readTouch(_yp,_ym,_xp,_xm); /*int x2 = tft.readTouch(_xp,_xm,_yp,_ym); int y1 = tft.readTouch(_yp,_ym,_xm,_xp); int x1 = tft.readTouch(_xp,_xm,_ym,_yp); int z2 = tft.readTouch(_yp,_xm,_ym,_xp); int z1 = tft.readTouch(_yp,_xm,_xp,_ym);*/ //int y2 = 700; //int x2 = 600; //int z2 = 110; //int z1 = 100; if (z1!=0){ z = (float)z2/(float)z1; }else{ z = 0; } int x = x2; int y = y2; return point(x,y,z); } int main(){ TFT.claim(stdout); // send stdout to the TFT display TFT.set_orientation(0); //TFT.Bitmap(28,90,265,65,p1); //wait(1); //TFT.cls(); TFT.set_font((unsigned char*) Arial12x12); TFT.foreground(Cyan); // set chars to Cyan TFT.background(Purple); // set background to Purple TFT.locate(80,90); //printf("Initializing z...\r\n"); for(int i = 0; i<16; i++){ TFT.fillrect(i*15, 0, 15*(i+1), ColorPaletteHigh, colors[i]); } float TS_MINX = 5500; float TS_MAXX = 58100; float TS_MINY = 4700; float TS_MAXY = 57600; int PRESSURE = 200; while(1){ // a point object holds x y and z coordinates. //TFT.BusEnable(false); Point p = getPoint(); //TFT.BusEnable(true); //map the ADC value read to into pixel co-ordinates p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240); p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320); p.z = p.x * RXPLATE / Q * (p.z -1); // we have some minimum pressure we consider 'valid' // pressure of 0 means no pressing! /*TFT.locate(60,90); printf("x = %d \r\n", p.x); TFT.locate(60,110); printf("y = %d \r\n", p.y); TFT.locate(60,130); printf("z = %d \r\n", p.z); //TFT.locate(60,170);*/ //printf("Initializing z...%d \r\n",zx); if (p.z > 40 && p.z < PRESSURE) { // Detect paint brush color change if(int(p.y) < ColorPaletteHigh+2){ color = colors[int(p.x)/15]; }else{ TFT.fillcircle(int(p.x),int(p.y),2,color); } } } }