Library files for using Seeed Studio TFT Touch Shield for Arduino (ST7781R controller) together with ELMICRO TestBed for mbed. Featuring a short example program of how to calibrate the touch screen. Some basic drawing functions are also included (circle, rectangle, lines, text).

Dependencies:   mbed

Committer:
elmicro
Date:
Thu Jun 28 10:12:07 2012 +0000
Revision:
0:db0d63650413

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmicro 0:db0d63650413 1 /*###########################################################
elmicro 0:db0d63650413 2 Interface library and example program for
elmicro 0:db0d63650413 3 Seeed Studio's TFT Touch Shield
elmicro 0:db0d63650413 4
elmicro 0:db0d63650413 5 ---
elmicro 0:db0d63650413 6
elmicro 0:db0d63650413 7 !DESOLDERING OF TESTBED PARTS NEEDED!
elmicro 0:db0d63650413 8 To use the touch input, desolder C3 and R34
elmicro 0:db0d63650413 9 This disables the analogue trimmer R36!
elmicro 0:db0d63650413 10
elmicro 0:db0d63650413 11 ---
elmicro 0:db0d63650413 12 (C) 2012 Stefan Guenther
elmicro 0:db0d63650413 13 Elektronikladen | ELMICRO
elmicro 0:db0d63650413 14 ########################################################### */
elmicro 0:db0d63650413 15
elmicro 0:db0d63650413 16 #include "mbed.h"
elmicro 0:db0d63650413 17 #include "shortcuts.h"
elmicro 0:db0d63650413 18 #include "TFT.h"
elmicro 0:db0d63650413 19 #include "2d_draw.h"
elmicro 0:db0d63650413 20 #include "touch.h"
elmicro 0:db0d63650413 21
elmicro 0:db0d63650413 22
elmicro 0:db0d63650413 23 /* ===================================================================
elmicro 0:db0d63650413 24 routine: IntToChars
elmicro 0:db0d63650413 25 purpose: Converts integer value into char array with
elmicro 0:db0d63650413 26 selectable number base
elmicro 0:db0d63650413 27 parameters: <*buffer> pointer to character array
elmicro 0:db0d63650413 28 <value> integer value to convert
elmicro 0:db0d63650413 29 <spaceonbuffer> max nr. of characters in buffer
elmicro 0:db0d63650413 30 <countbase> e.g. 16->HEX formatted string
elmicro 0:db0d63650413 31 2->BIN formatted string
elmicro 0:db0d63650413 32 10->DEC formatted string
elmicro 0:db0d63650413 33 date: 2007-05-07
elmicro 0:db0d63650413 34 author: Phantomix
elmicro 0:db0d63650413 35 http://www.roboternetz.de/community/archive/index.php
elmicro 0:db0d63650413 36 /t-26986.html?s=c3edf0ef1df246f02c67dfa7f316a03f
elmicro 0:db0d63650413 37 -------------------------------------------------------------------*/
elmicro 0:db0d63650413 38 void IntToChars (char* buffer, int value, int spaceonbuffer, int countbase)
elmicro 0:db0d63650413 39 {
elmicro 0:db0d63650413 40 int workvalue = value;
elmicro 0:db0d63650413 41 int i;
elmicro 0:db0d63650413 42 int valuetowrite;
elmicro 0:db0d63650413 43 int end_i = 0;
elmicro 0:db0d63650413 44
elmicro 0:db0d63650413 45 if (value < 0)
elmicro 0:db0d63650413 46 {
elmicro 0:db0d63650413 47 workvalue = -value;
elmicro 0:db0d63650413 48 end_i = 1;
elmicro 0:db0d63650413 49 buffer[0] = '-';
elmicro 0:db0d63650413 50 }
elmicro 0:db0d63650413 51
elmicro 0:db0d63650413 52 for (i = spaceonbuffer - 1; i >= end_i; i--)
elmicro 0:db0d63650413 53 {
elmicro 0:db0d63650413 54 valuetowrite = (workvalue % countbase);
elmicro 0:db0d63650413 55 if (workvalue == 0)
elmicro 0:db0d63650413 56 {
elmicro 0:db0d63650413 57 if (i == (spaceonbuffer - 1))
elmicro 0:db0d63650413 58 {
elmicro 0:db0d63650413 59 buffer[i] = 48; // ASCII 0
elmicro 0:db0d63650413 60 } else {
elmicro 0:db0d63650413 61 buffer[i] = 32; // ASCII SPACE
elmicro 0:db0d63650413 62 }
elmicro 0:db0d63650413 63 } else {
elmicro 0:db0d63650413 64 if (valuetowrite > 9)
elmicro 0:db0d63650413 65 {
elmicro 0:db0d63650413 66 buffer[i] = valuetowrite + 55; // ASCII A-Z
elmicro 0:db0d63650413 67 } else {
elmicro 0:db0d63650413 68 buffer[i] = valuetowrite + 48; // ASCII of that character
elmicro 0:db0d63650413 69 }
elmicro 0:db0d63650413 70 };
elmicro 0:db0d63650413 71 workvalue = (workvalue - valuetowrite) / countbase;
elmicro 0:db0d63650413 72 }
elmicro 0:db0d63650413 73 }
elmicro 0:db0d63650413 74
elmicro 0:db0d63650413 75
elmicro 0:db0d63650413 76
elmicro 0:db0d63650413 77 int main() {
elmicro 0:db0d63650413 78
elmicro 0:db0d63650413 79 unsigned int x, y, z;
elmicro 0:db0d63650413 80 unsigned int X1, X2, Y1, Y2;
elmicro 0:db0d63650413 81 unsigned int x_old = 0;
elmicro 0:db0d63650413 82 unsigned int y_old = 0;
elmicro 0:db0d63650413 83
elmicro 0:db0d63650413 84 char charX[] = "1111"; //dummy init values
elmicro 0:db0d63650413 85 char charY[] = "2222";
elmicro 0:db0d63650413 86 char charZ[] = "2222";
elmicro 0:db0d63650413 87
elmicro 0:db0d63650413 88 Init(); //prepare mbed's I/Os for use with TFT Touch Shield
elmicro 0:db0d63650413 89 TouchInit(); //prepare ADC inputs for touch input
elmicro 0:db0d63650413 90
elmicro 0:db0d63650413 91
elmicro 0:db0d63650413 92 /* CALIBRATE TOUCH SCREEN */
elmicro 0:db0d63650413 93 /* Alignment of touch input sensor with TFT display
elmicro 0:db0d63650413 94 using 2 touch inputs from opposite edges of screen
elmicro 0:db0d63650413 95 (10% distance to each borders)*/
elmicro 0:db0d63650413 96
elmicro 0:db0d63650413 97 DrawString("CALIBRATION SEQUENCE", 30, 140, 1, YELLOW);
elmicro 0:db0d63650413 98 DrawString("Please tap the circles!", 10, 150, 1, YELLOW);
elmicro 0:db0d63650413 99 DrawCircle(24, 32, 10, WHITE); //draw circle 10% right and 10% down from
elmicro 0:db0d63650413 100 //upper left corner
elmicro 0:db0d63650413 101 int ret = 0;
elmicro 0:db0d63650413 102 do //repeat until touch is recognized
elmicro 0:db0d63650413 103 {
elmicro 0:db0d63650413 104 ret = GetRawTouch(&x, &y, &z);
elmicro 0:db0d63650413 105 } while(ret == 0);
elmicro 0:db0d63650413 106
elmicro 0:db0d63650413 107 IntToChars(charX, x, 4, 10); //convert raw touch input coordinates
elmicro 0:db0d63650413 108 IntToChars(charY, y, 4, 10); //into character string for verbose
elmicro 0:db0d63650413 109 IntToChars(charZ, z, 4, 10); //display
elmicro 0:db0d63650413 110
elmicro 0:db0d63650413 111 DrawCircle(24, 32, 10, BLACK); //let first circle disappear
elmicro 0:db0d63650413 112 X1 = x; //save coordinates of first touch
elmicro 0:db0d63650413 113 Y1 = y;
elmicro 0:db0d63650413 114 wait(1);
elmicro 0:db0d63650413 115
elmicro 0:db0d63650413 116 DrawString(charX, 10, 17, 1, RED); //output read values
elmicro 0:db0d63650413 117 DrawString(charY, 10, 32, 1, RED);
elmicro 0:db0d63650413 118 DrawString(charZ, 10, 47, 1, RED);
elmicro 0:db0d63650413 119
elmicro 0:db0d63650413 120 DrawCircle(216, 288, 10, WHITE); //display next circle, 90% right and 90% down
elmicro 0:db0d63650413 121 //from upper left corner
elmicro 0:db0d63650413 122 ret=0;
elmicro 0:db0d63650413 123 do //do the same for second touch point
elmicro 0:db0d63650413 124 {
elmicro 0:db0d63650413 125 ret=GetRawTouch(&x, &y, &z);
elmicro 0:db0d63650413 126 } while(ret == 0);
elmicro 0:db0d63650413 127
elmicro 0:db0d63650413 128
elmicro 0:db0d63650413 129 IntToChars(charX, x, 4, 10);
elmicro 0:db0d63650413 130 IntToChars(charY, y, 4, 10);
elmicro 0:db0d63650413 131 IntToChars(charZ, z, 4, 10);
elmicro 0:db0d63650413 132
elmicro 0:db0d63650413 133 DrawCircle(216, 288, 10, BLACK);
elmicro 0:db0d63650413 134 X2 = x;
elmicro 0:db0d63650413 135 Y2 = y;
elmicro 0:db0d63650413 136 wait(1);
elmicro 0:db0d63650413 137
elmicro 0:db0d63650413 138 DrawString(charX, 200,273, 1, RED);
elmicro 0:db0d63650413 139 DrawString(charY, 200,288, 1, RED);
elmicro 0:db0d63650413 140 DrawString(charZ, 200,303, 1, RED);
elmicro 0:db0d63650413 141
elmicro 0:db0d63650413 142 TFTData.Xmin = (9 * X1 - X2) / 8; //start calculation of scale and alignment values
elmicro 0:db0d63650413 143 TFTData.Xmax = (9 * X2 - X1) / 8; //and save them into TFT parameter structure
elmicro 0:db0d63650413 144 TFTData.Ymin = (9 * Y1 - Y2) / 8; //this structure should be saved into non-volatile
elmicro 0:db0d63650413 145 TFTData.Ymax = (9 * Y2 - Y1) / 8; //(e.g. mbed's on-board 2MB flash chip)
elmicro 0:db0d63650413 146
elmicro 0:db0d63650413 147 TFTData.Xscale = ( (TFTData.Xmax - TFTData.Xmin) * 1000 ) / TFTData.XRes;
elmicro 0:db0d63650413 148 TFTData.Xscale = ( (TFTData.Ymax - TFTData.Ymin) * 1000 ) / TFTData.YRes;
elmicro 0:db0d63650413 149
elmicro 0:db0d63650413 150 DrawString("Please tap the circles!", 10, 150, 1, BLACK);
elmicro 0:db0d63650413 151 DrawString("COMPLETED", 30, 150, 1, YELLOW);
elmicro 0:db0d63650413 152 wait(1);
elmicro 0:db0d63650413 153
elmicro 0:db0d63650413 154 ClearScreen(BLACK);
elmicro 0:db0d63650413 155 wait(0.3);
elmicro 0:db0d63650413 156
elmicro 0:db0d63650413 157 DrawString("DEMO MODE", 30, 140, 1, YELLOW);
elmicro 0:db0d63650413 158 DrawString("Touch the screen...", 10, 150, 1, YELLOW);
elmicro 0:db0d63650413 159
elmicro 0:db0d63650413 160
elmicro 0:db0d63650413 161 while(1)
elmicro 0:db0d63650413 162 {
elmicro 0:db0d63650413 163 wait_ms(1);
elmicro 0:db0d63650413 164
elmicro 0:db0d63650413 165 if(GetPoint(&x, &y)==1) //check if touch appears
elmicro 0:db0d63650413 166 {
elmicro 0:db0d63650413 167 DrawCircle(x_old, y_old, 15, BLACK); //clear last touch indicator circle
elmicro 0:db0d63650413 168 DrawString("DEMO MODE", 30, 140, 1, YELLOW);
elmicro 0:db0d63650413 169 DrawString("Touch the screen...", 10, 150, 1, YELLOW);
elmicro 0:db0d63650413 170 DrawCircle(x, y, 15, YELLOW); //set new indicator circle
elmicro 0:db0d63650413 171
elmicro 0:db0d63650413 172 x_old=x; //rescue current touch values for next cycle
elmicro 0:db0d63650413 173 y_old=y;
elmicro 0:db0d63650413 174 }
elmicro 0:db0d63650413 175 }
elmicro 0:db0d63650413 176 }
elmicro 0:db0d63650413 177
elmicro 0:db0d63650413 178