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).
main.cpp@0:db0d63650413, 2012-06-28 (annotated)
- Committer:
- elmicro
- Date:
- Thu Jun 28 10:12:07 2012 +0000
- Revision:
- 0:db0d63650413
Who changed what in which revision?
User | Revision | Line number | New 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 |