Library for MI0283QT-2 LCD

Committer:
clemente
Date:
Wed May 23 06:25:31 2012 +0000
Revision:
0:7ad454fed160

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
clemente 0:7ad454fed160 1 /* mbed TouchScreen ADS7846 library.
clemente 0:7ad454fed160 2
clemente 0:7ad454fed160 3 Copyright (c) 2011 NXP 3803
clemente 0:7ad454fed160 4
clemente 0:7ad454fed160 5 Permission is hereby granted, free of charge, to any person obtaining a copy
clemente 0:7ad454fed160 6 of this software and associated documentation files (the "Software"), to deal
clemente 0:7ad454fed160 7 in the Software without restriction, including without limitation the rights
clemente 0:7ad454fed160 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
clemente 0:7ad454fed160 9 copies of the Software, and to permit persons to whom the Software is
clemente 0:7ad454fed160 10 furnished to do so, subject to the following conditions:
clemente 0:7ad454fed160 11
clemente 0:7ad454fed160 12 The above copyright notice and this permission notice shall be included in
clemente 0:7ad454fed160 13 all copies or substantial portions of the Software.
clemente 0:7ad454fed160 14
clemente 0:7ad454fed160 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
clemente 0:7ad454fed160 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
clemente 0:7ad454fed160 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
clemente 0:7ad454fed160 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
clemente 0:7ad454fed160 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
clemente 0:7ad454fed160 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
clemente 0:7ad454fed160 21 THE SOFTWARE.
clemente 0:7ad454fed160 22 */
clemente 0:7ad454fed160 23
clemente 0:7ad454fed160 24 #include "mbed.h"
clemente 0:7ad454fed160 25 #include "string.h"
clemente 0:7ad454fed160 26 #include "Touchlib.h"
clemente 0:7ad454fed160 27 #include "calibrate.h"
clemente 0:7ad454fed160 28 #include "crocino.h"
clemente 0:7ad454fed160 29
clemente 0:7ad454fed160 30 /* */
clemente 0:7ad454fed160 31 unsigned char TSCmd[cTS_CMDSIZE] = {
clemente 0:7ad454fed160 32 cTS_GETY, 0x00, cTS_GETY, 0x00, /* y */
clemente 0:7ad454fed160 33 cTS_GETZ1, 0x00, cTS_GETZ1, 0x00, /* z1 */
clemente 0:7ad454fed160 34 cTS_GETZ2, 0x00, cTS_GETZ2, 0x00, /* z2 */
clemente 0:7ad454fed160 35 cTS_GETX, 0x00, cTS_END, 0x00, 0x00 /* x */
clemente 0:7ad454fed160 36 };
clemente 0:7ad454fed160 37
clemente 0:7ad454fed160 38 #define cTS_SAMPLE 8
clemente 0:7ad454fed160 39 #define MODE12 0
clemente 0:7ad454fed160 40
clemente 0:7ad454fed160 41 POINT crocino_coord[3] = {
clemente 0:7ad454fed160 42 {80,120},
clemente 0:7ad454fed160 43 {240,60},
clemente 0:7ad454fed160 44 {240,180}
clemente 0:7ad454fed160 45 };
clemente 0:7ad454fed160 46
clemente 0:7ad454fed160 47 MATRIX TS_Matrix;
clemente 0:7ad454fed160 48
clemente 0:7ad454fed160 49 unsigned char TSValue[cTS_CMDSIZE];
clemente 0:7ad454fed160 50 unsigned int tap_debounce;
clemente 0:7ad454fed160 51
clemente 0:7ad454fed160 52 DigitalOut TS_DBG_LED(LED4);
clemente 0:7ad454fed160 53
clemente 0:7ad454fed160 54 TOUCHS::TOUCHS( PinName mosi, PinName miso, PinName sclk, PinName cs, PinName penirq) : _spi( mosi, miso, sclk), _cs( cs), _penirq( penirq) {
clemente 0:7ad454fed160 55 // defaults params
clemente 0:7ad454fed160 56
clemente 0:7ad454fed160 57 }
clemente 0:7ad454fed160 58
clemente 0:7ad454fed160 59 unsigned int TOUCHS::setcalibration( _TS_COORD *ts)
clemente 0:7ad454fed160 60 {
clemente 0:7ad454fed160 61 POINT screen[3];
clemente 0:7ad454fed160 62 /* from struct TS_COORD to struct POINT. */
clemente 0:7ad454fed160 63 screen[0].x=ts[0].x;
clemente 0:7ad454fed160 64 screen[0].y=ts[0].y;
clemente 0:7ad454fed160 65 screen[1].x=ts[1].x;
clemente 0:7ad454fed160 66 screen[1].y=ts[1].y;
clemente 0:7ad454fed160 67 screen[2].x=ts[2].x;
clemente 0:7ad454fed160 68 screen[2].y=ts[2].y;
clemente 0:7ad454fed160 69 /* Now start the calibration process. */
clemente 0:7ad454fed160 70 ts_val.calibration_done=!setCalibrationMatrix( &crocino_coord[0], &screen[0], &TS_Matrix);
clemente 0:7ad454fed160 71 /* Return the result. */
clemente 0:7ad454fed160 72 return( ts_val.calibration_done);
clemente 0:7ad454fed160 73 }
clemente 0:7ad454fed160 74
clemente 0:7ad454fed160 75 unsigned int TOUCHS::calibrate( void)
clemente 0:7ad454fed160 76 {
clemente 0:7ad454fed160 77 POINT ts_tmp, coord;
clemente 0:7ad454fed160 78
clemente 0:7ad454fed160 79 coord.x=ts_val.coord.x;
clemente 0:7ad454fed160 80 coord.y=ts_val.coord.y;
clemente 0:7ad454fed160 81 // see calibrate.c
clemente 0:7ad454fed160 82 getDisplayPoint( &ts_tmp, &coord, &TS_Matrix);
clemente 0:7ad454fed160 83 //
clemente 0:7ad454fed160 84 ts_val.coord.x = ts_tmp.x;
clemente 0:7ad454fed160 85 ts_val.coord.y = ts_tmp.y;
clemente 0:7ad454fed160 86
clemente 0:7ad454fed160 87 return 0;
clemente 0:7ad454fed160 88 }
clemente 0:7ad454fed160 89
clemente 0:7ad454fed160 90 unsigned int TOUCHS::crocino_size( void)
clemente 0:7ad454fed160 91 {
clemente 0:7ad454fed160 92 return( cTS_CROCINO);
clemente 0:7ad454fed160 93 }
clemente 0:7ad454fed160 94
clemente 0:7ad454fed160 95 unsigned int TOUCHS::getcrocino_x( unsigned char idx)
clemente 0:7ad454fed160 96 {
clemente 0:7ad454fed160 97 if ( idx > 3)
clemente 0:7ad454fed160 98 idx=3;
clemente 0:7ad454fed160 99
clemente 0:7ad454fed160 100 return ( crocino_coord[idx].x);
clemente 0:7ad454fed160 101 }
clemente 0:7ad454fed160 102
clemente 0:7ad454fed160 103 unsigned int TOUCHS::getcrocino_y( unsigned char idx)
clemente 0:7ad454fed160 104 {
clemente 0:7ad454fed160 105 if ( idx > 3)
clemente 0:7ad454fed160 106 idx=3;
clemente 0:7ad454fed160 107
clemente 0:7ad454fed160 108 return ( crocino_coord[idx].y);
clemente 0:7ad454fed160 109 }
clemente 0:7ad454fed160 110
clemente 0:7ad454fed160 111 unsigned int TOUCHS::gettsmatrixsize( void)
clemente 0:7ad454fed160 112 {
clemente 0:7ad454fed160 113 return( sizeof( TS_Matrix));
clemente 0:7ad454fed160 114 }
clemente 0:7ad454fed160 115
clemente 0:7ad454fed160 116 void TOUCHS::gettsmatrix( unsigned char *pmatrix)
clemente 0:7ad454fed160 117 {
clemente 0:7ad454fed160 118
clemente 0:7ad454fed160 119 *pmatrix++=((unsigned char*)&TS_Matrix.An)[0];
clemente 0:7ad454fed160 120 *pmatrix++=((unsigned char*)&TS_Matrix.An)[1];
clemente 0:7ad454fed160 121 *pmatrix++=((unsigned char*)&TS_Matrix.An)[2];
clemente 0:7ad454fed160 122 *pmatrix++=((unsigned char*)&TS_Matrix.An)[3];
clemente 0:7ad454fed160 123 *pmatrix++=((unsigned char*)&TS_Matrix.Bn)[0];
clemente 0:7ad454fed160 124 *pmatrix++=((unsigned char*)&TS_Matrix.Bn)[1];
clemente 0:7ad454fed160 125 *pmatrix++=((unsigned char*)&TS_Matrix.Bn)[2];
clemente 0:7ad454fed160 126 *pmatrix++=((unsigned char*)&TS_Matrix.Bn)[3];
clemente 0:7ad454fed160 127 *pmatrix++=((unsigned char*)&TS_Matrix.Cn)[0];
clemente 0:7ad454fed160 128 *pmatrix++=((unsigned char*)&TS_Matrix.Cn)[1];
clemente 0:7ad454fed160 129 *pmatrix++=((unsigned char*)&TS_Matrix.Cn)[2];
clemente 0:7ad454fed160 130 *pmatrix++=((unsigned char*)&TS_Matrix.Cn)[3];
clemente 0:7ad454fed160 131 *pmatrix++=((unsigned char*)&TS_Matrix.Dn)[0];
clemente 0:7ad454fed160 132 *pmatrix++=((unsigned char*)&TS_Matrix.Dn)[1];
clemente 0:7ad454fed160 133 *pmatrix++=((unsigned char*)&TS_Matrix.Dn)[2];
clemente 0:7ad454fed160 134 *pmatrix++=((unsigned char*)&TS_Matrix.Dn)[3];
clemente 0:7ad454fed160 135 *pmatrix++=((unsigned char*)&TS_Matrix.En)[0];
clemente 0:7ad454fed160 136 *pmatrix++=((unsigned char*)&TS_Matrix.En)[1];
clemente 0:7ad454fed160 137 *pmatrix++=((unsigned char*)&TS_Matrix.En)[2];
clemente 0:7ad454fed160 138 *pmatrix++=((unsigned char*)&TS_Matrix.En)[3];
clemente 0:7ad454fed160 139 *pmatrix++=((unsigned char*)&TS_Matrix.Fn)[0];
clemente 0:7ad454fed160 140 *pmatrix++=((unsigned char*)&TS_Matrix.Fn)[1];
clemente 0:7ad454fed160 141 *pmatrix++=((unsigned char*)&TS_Matrix.Fn)[2];
clemente 0:7ad454fed160 142 *pmatrix++=((unsigned char*)&TS_Matrix.Fn)[3];
clemente 0:7ad454fed160 143 *pmatrix++=((unsigned char*)&TS_Matrix.Divider)[0];
clemente 0:7ad454fed160 144 *pmatrix++=((unsigned char*)&TS_Matrix.Divider)[1];
clemente 0:7ad454fed160 145 *pmatrix++=((unsigned char*)&TS_Matrix.Divider)[2];
clemente 0:7ad454fed160 146 *pmatrix++=((unsigned char*)&TS_Matrix.Divider)[3];
clemente 0:7ad454fed160 147
clemente 0:7ad454fed160 148 }
clemente 0:7ad454fed160 149
clemente 0:7ad454fed160 150 void TOUCHS::settsmatrix( unsigned char *pmatrix)
clemente 0:7ad454fed160 151 {
clemente 0:7ad454fed160 152
clemente 0:7ad454fed160 153 ((unsigned char*)&TS_Matrix.An)[0]=*pmatrix++;
clemente 0:7ad454fed160 154 ((unsigned char*)&TS_Matrix.An)[1]=*pmatrix++;
clemente 0:7ad454fed160 155 ((unsigned char*)&TS_Matrix.An)[2]=*pmatrix++;
clemente 0:7ad454fed160 156 ((unsigned char*)&TS_Matrix.An)[3]=*pmatrix++;
clemente 0:7ad454fed160 157 ((unsigned char*)&TS_Matrix.Bn)[0]=*pmatrix++;
clemente 0:7ad454fed160 158 ((unsigned char*)&TS_Matrix.Bn)[1]=*pmatrix++;
clemente 0:7ad454fed160 159 ((unsigned char*)&TS_Matrix.Bn)[2]=*pmatrix++;
clemente 0:7ad454fed160 160 ((unsigned char*)&TS_Matrix.Bn)[3]=*pmatrix++;
clemente 0:7ad454fed160 161 ((unsigned char*)&TS_Matrix.Cn)[0]=*pmatrix++;
clemente 0:7ad454fed160 162 ((unsigned char*)&TS_Matrix.Cn)[1]=*pmatrix++;
clemente 0:7ad454fed160 163 ((unsigned char*)&TS_Matrix.Cn)[2]=*pmatrix++;
clemente 0:7ad454fed160 164 ((unsigned char*)&TS_Matrix.Cn)[3]=*pmatrix++;
clemente 0:7ad454fed160 165 ((unsigned char*)&TS_Matrix.Dn)[0]=*pmatrix++;
clemente 0:7ad454fed160 166 ((unsigned char*)&TS_Matrix.Dn)[1]=*pmatrix++;
clemente 0:7ad454fed160 167 ((unsigned char*)&TS_Matrix.Dn)[2]=*pmatrix++;
clemente 0:7ad454fed160 168 ((unsigned char*)&TS_Matrix.Dn)[3]=*pmatrix++;
clemente 0:7ad454fed160 169 ((unsigned char*)&TS_Matrix.En)[0]=*pmatrix++;
clemente 0:7ad454fed160 170 ((unsigned char*)&TS_Matrix.En)[1]=*pmatrix++;
clemente 0:7ad454fed160 171 ((unsigned char*)&TS_Matrix.En)[2]=*pmatrix++;
clemente 0:7ad454fed160 172 ((unsigned char*)&TS_Matrix.En)[3]=*pmatrix++;
clemente 0:7ad454fed160 173 ((unsigned char*)&TS_Matrix.Fn)[0]=*pmatrix++;
clemente 0:7ad454fed160 174 ((unsigned char*)&TS_Matrix.Fn)[1]=*pmatrix++;
clemente 0:7ad454fed160 175 ((unsigned char*)&TS_Matrix.Fn)[2]=*pmatrix++;
clemente 0:7ad454fed160 176 ((unsigned char*)&TS_Matrix.Fn)[3]=*pmatrix++;
clemente 0:7ad454fed160 177 ((unsigned char*)&TS_Matrix.Divider)[0]=*pmatrix++;
clemente 0:7ad454fed160 178 ((unsigned char*)&TS_Matrix.Divider)[1]=*pmatrix++;
clemente 0:7ad454fed160 179 ((unsigned char*)&TS_Matrix.Divider)[2]=*pmatrix++;
clemente 0:7ad454fed160 180 ((unsigned char*)&TS_Matrix.Divider)[3]=*pmatrix++;
clemente 0:7ad454fed160 181
clemente 0:7ad454fed160 182 ts_val.calibration_done=1;
clemente 0:7ad454fed160 183
clemente 0:7ad454fed160 184 }
clemente 0:7ad454fed160 185
clemente 0:7ad454fed160 186 void TOUCHS::init( void)
clemente 0:7ad454fed160 187 {
clemente 0:7ad454fed160 188 _spi.format( 8, BUS_MODE);
clemente 0:7ad454fed160 189 _spi.frequency( TS_SPEED);
clemente 0:7ad454fed160 190
clemente 0:7ad454fed160 191 }
clemente 0:7ad454fed160 192
clemente 0:7ad454fed160 193
clemente 0:7ad454fed160 194 void TOUCHS::do_tap( void)
clemente 0:7ad454fed160 195 {
clemente 0:7ad454fed160 196 unsigned int i, x, y;
clemente 0:7ad454fed160 197
clemente 0:7ad454fed160 198 if ( TOUCHS::pressure() && ts_val.touched==0) {
clemente 0:7ad454fed160 199 printf("press: %d\r\n", tap_debounce );
clemente 0:7ad454fed160 200 tap_debounce++;
clemente 0:7ad454fed160 201 if ( tap_debounce>= cTS_DEBOUNCE) {
clemente 0:7ad454fed160 202 tap_debounce=0;
clemente 0:7ad454fed160 203 ts_val.touched=1;
clemente 0:7ad454fed160 204 for ( i=4, x=0,y=0; i!=0; i--) {
clemente 0:7ad454fed160 205 TOUCHS::read( &ts_val.coord);
clemente 0:7ad454fed160 206 x+=ts_val.coord.x;
clemente 0:7ad454fed160 207 y+=ts_val.coord.y;
clemente 0:7ad454fed160 208 }
clemente 0:7ad454fed160 209 ts_val.coord.x=x>>2;
clemente 0:7ad454fed160 210 ts_val.coord.y=y>>2;
clemente 0:7ad454fed160 211 // If the calibration process was successful complited...
clemente 0:7ad454fed160 212 if ( ts_val.calibration_done) {
clemente 0:7ad454fed160 213 // ...run the convertion from touch to screen coord.
clemente 0:7ad454fed160 214 TOUCHS::calibrate();
clemente 0:7ad454fed160 215 }
clemente 0:7ad454fed160 216 }
clemente 0:7ad454fed160 217 }
clemente 0:7ad454fed160 218 }
clemente 0:7ad454fed160 219
clemente 0:7ad454fed160 220 unsigned int TOUCHS::pressure( void)
clemente 0:7ad454fed160 221 {
clemente 0:7ad454fed160 222 unsigned char pressure;
clemente 0:7ad454fed160 223 unsigned char iZ2, iZ1;
clemente 0:7ad454fed160 224
clemente 0:7ad454fed160 225 _spi.frequency( TS_SPEED);
clemente 0:7ad454fed160 226
clemente 0:7ad454fed160 227 _cs = 0; /* Seleziono il CS del TS */
clemente 0:7ad454fed160 228
clemente 0:7ad454fed160 229 _spi.write( 0xB0);
clemente 0:7ad454fed160 230 iZ1 = _spi.write( 0x00);
clemente 0:7ad454fed160 231 //
clemente 0:7ad454fed160 232 _spi.write( 0xC0);
clemente 0:7ad454fed160 233 iZ2 = 127-_spi.write( 0x00);
clemente 0:7ad454fed160 234 _cs = 1; /* De-Seleziono il CS del TS */
clemente 0:7ad454fed160 235
clemente 0:7ad454fed160 236 pressure=iZ1+iZ2;
clemente 0:7ad454fed160 237
clemente 0:7ad454fed160 238 if ( pressure > 3) {
clemente 0:7ad454fed160 239 // ts_val.touched=1;
clemente 0:7ad454fed160 240 return( 1);
clemente 0:7ad454fed160 241 } else {
clemente 0:7ad454fed160 242 // ts_val.touched=0;
clemente 0:7ad454fed160 243 return( 0);
clemente 0:7ad454fed160 244 }
clemente 0:7ad454fed160 245
clemente 0:7ad454fed160 246 }
clemente 0:7ad454fed160 247
clemente 0:7ad454fed160 248 /* Read the value from the touch. Write the raw value inside the struct TS_COORD. */
clemente 0:7ad454fed160 249 void TOUCHS::read( _TS_COORD *ts)
clemente 0:7ad454fed160 250 {
clemente 0:7ad454fed160 251 unsigned int i, idx;
clemente 0:7ad454fed160 252 unsigned int iZ1, iZ2;
clemente 0:7ad454fed160 253
clemente 0:7ad454fed160 254 _spi.frequency( TS_SPEED);
clemente 0:7ad454fed160 255
clemente 0:7ad454fed160 256 idx=0;
clemente 0:7ad454fed160 257 while( 1) {
clemente 0:7ad454fed160 258 //
clemente 0:7ad454fed160 259 i=0;
clemente 0:7ad454fed160 260 _cs = 0; /* Assert the CS */
clemente 0:7ad454fed160 261
clemente 0:7ad454fed160 262 while ( i<cTS_CMDSIZE) {
clemente 0:7ad454fed160 263 TSValue[i] = _spi.write( TSCmd[i]);
clemente 0:7ad454fed160 264 /* */
clemente 0:7ad454fed160 265 i++;
clemente 0:7ad454fed160 266 }
clemente 0:7ad454fed160 267
clemente 0:7ad454fed160 268 _cs = 1; /* Deasser the CS */
clemente 0:7ad454fed160 269
clemente 0:7ad454fed160 270 /* */
clemente 0:7ad454fed160 271 ts->x = ((unsigned int)TSValue[15]<<5) | (TSValue[16]>>3);
clemente 0:7ad454fed160 272 ts->y = ((unsigned int)TSValue[3]<<5) | (TSValue[4]>>3);
clemente 0:7ad454fed160 273 iZ2 = ((unsigned int)TSValue[11]<<5) | (TSValue[12]>>3);
clemente 0:7ad454fed160 274 iZ1 = ((unsigned int)TSValue[7]<<5) | (TSValue[8]>>3);
clemente 0:7ad454fed160 275 ts->z = (int)(330.0 * (((double)ts->x)/4096.0)*((((double)iZ2)/((double)iZ1))-1.0));
clemente 0:7ad454fed160 276
clemente 0:7ad454fed160 277 /* Reduce the value to 10bit */
clemente 0:7ad454fed160 278 ts->y = (ts->y >> MODE12);
clemente 0:7ad454fed160 279 ts->x = (ts->x >> MODE12);
clemente 0:7ad454fed160 280
clemente 0:7ad454fed160 281 idx++;
clemente 0:7ad454fed160 282 if ( ts->z < 10000 || idx>10)
clemente 0:7ad454fed160 283 break;
clemente 0:7ad454fed160 284 }
clemente 0:7ad454fed160 285 }
clemente 0:7ad454fed160 286