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 #include <LPC17xx.h>
elmicro 0:db0d63650413 2 #include "touch.h"
elmicro 0:db0d63650413 3 #include "shortcuts.h"
elmicro 0:db0d63650413 4
elmicro 0:db0d63650413 5 struct tinit TFTData;
elmicro 0:db0d63650413 6
elmicro 0:db0d63650413 7 void TouchInit(void)
elmicro 0:db0d63650413 8 {
elmicro 0:db0d63650413 9 LPC_SC->PCONP |= (BIT12); //Enable power to ADC block
elmicro 0:db0d63650413 10 LPC_ADC->ADCR = BIT8 | //ADC clock is (25MHz/5)
elmicro 0:db0d63650413 11 BIT21; //enable ADC
elmicro 0:db0d63650413 12 }
elmicro 0:db0d63650413 13
elmicro 0:db0d63650413 14 /* ===================================================================
elmicro 0:db0d63650413 15 routine: GetPressure
elmicro 0:db0d63650413 16 purpose: Hardware driver for sampling the touch screen using
elmicro 0:db0d63650413 17 four ADC-channels
elmicro 0:db0d63650413 18 parameters: none
elmicro 0:db0d63650413 19 returns: raw value from ADC corresponding to pressure of
elmicro 0:db0d63650413 20 touch input
elmicro 0:db0d63650413 21 note: "Pressure" actually means how much display area is
elmicro 0:db0d63650413 22 supposed to pressure
elmicro 0:db0d63650413 23 date: 2012-06-27
elmicro 0:db0d63650413 24 author: Stefan Guenther
elmicro 0:db0d63650413 25 Elektronikladen | ELMICRO
elmicro 0:db0d63650413 26 -------------------------------------------------------------------*/
elmicro 0:db0d63650413 27 unsigned int GetPressure(void)
elmicro 0:db0d63650413 28 {
elmicro 0:db0d63650413 29 int tmp;
elmicro 0:db0d63650413 30
elmicro 0:db0d63650413 31 LPC_PINCON->PINSEL1 &= ~0x4000; //Y-
elmicro 0:db0d63650413 32 LPC_PINCON->PINSEL1 |= 0x10000; //X-
elmicro 0:db0d63650413 33 LPC_PINCON->PINSEL1 |= 0x40000; //Y+
elmicro 0:db0d63650413 34 LPC_PINCON->PINSEL1 &= ~0x100000; //X+
elmicro 0:db0d63650413 35 LPC_GPIO0->FIODIR |= BIT23|BIT26; //X- and Y+ as output
elmicro 0:db0d63650413 36 LPC_GPIO0->FIOCLR = BIT23; //X- is GND
elmicro 0:db0d63650413 37 LPC_GPIO0->FIOSET = BIT26; //Y+ is VCC (3V3)
elmicro 0:db0d63650413 38 LPC_ADC->ADCR &= ~0xFF;
elmicro 0:db0d63650413 39 LPC_ADC->ADCR |= BIT1; //set X- as ADC input
elmicro 0:db0d63650413 40 LPC_ADC->ADCR |= BIT24; //start sampling
elmicro 0:db0d63650413 41 while(!(LPC_ADC->ADGDR&BIT31)); //wait for ADC
elmicro 0:db0d63650413 42
elmicro 0:db0d63650413 43 tmp = (LPC_ADC->ADGDR&0xFFF0)>>4; //store ADC value
elmicro 0:db0d63650413 44 LPC_ADC->ADCR &= ~0xFF;
elmicro 0:db0d63650413 45 LPC_ADC->ADCR |= BIT2; //set Y+ as ADC input
elmicro 0:db0d63650413 46 LPC_ADC->ADCR |= BIT24; //start another ADC sampling
elmicro 0:db0d63650413 47 while(!(LPC_ADC->ADGDR&BIT31)); //wait for it
elmicro 0:db0d63650413 48
elmicro 0:db0d63650413 49 //calculate pressure value out of the two samples
elmicro 0:db0d63650413 50 //and invert it by subtracting from 2^12
elmicro 0:db0d63650413 51 return(4096 - (tmp - ( (LPC_ADC->ADGDR&0xFFF0) >>4 ) ) );
elmicro 0:db0d63650413 52 }
elmicro 0:db0d63650413 53
elmicro 0:db0d63650413 54
elmicro 0:db0d63650413 55 /* ===================================================================
elmicro 0:db0d63650413 56 routine: GetTouchX
elmicro 0:db0d63650413 57 purpose: Hardware driver for sampling the touch screen using
elmicro 0:db0d63650413 58 four ADC-channels
elmicro 0:db0d63650413 59 parameters: none
elmicro 0:db0d63650413 60 returns: raw value from ADC corresponding to X coordinate of
elmicro 0:db0d63650413 61 touch input
elmicro 0:db0d63650413 62 date: 2012-06-27
elmicro 0:db0d63650413 63 author: Stefan Guenther
elmicro 0:db0d63650413 64 Elektronikladen | ELMICRO
elmicro 0:db0d63650413 65 -------------------------------------------------------------------*/
elmicro 0:db0d63650413 66 unsigned int GetTouchX(void)
elmicro 0:db0d63650413 67 {
elmicro 0:db0d63650413 68 LPC_PINCON->PINSEL1 |= 0x4000; //connects to Y- signal
elmicro 0:db0d63650413 69 LPC_PINCON->PINSEL1 &= ~0x10000; // X-
elmicro 0:db0d63650413 70 LPC_PINCON->PINSEL1 |= 0x40000; // Y+
elmicro 0:db0d63650413 71 LPC_PINCON->PINSEL1 &= ~0x100000; // X+
elmicro 0:db0d63650413 72 LPC_GPIO0->FIODIR |= BIT24|BIT26; //X+ and X- as output
elmicro 0:db0d63650413 73 LPC_GPIO0->FIOCLR = BIT24; //X- set to GND
elmicro 0:db0d63650413 74 LPC_GPIO0->FIOSET = BIT26; //X+ set to VCC (3V3)
elmicro 0:db0d63650413 75 LPC_ADC->ADCR &= ~0xFF; //clear active ADC channel information
elmicro 0:db0d63650413 76 LPC_ADC->ADCR |= BIT2; //set Y- as active ADC channel
elmicro 0:db0d63650413 77 LPC_ADC->ADCR |= BIT24; //start ADC sampling
elmicro 0:db0d63650413 78 while(!(LPC_ADC->ADGDR&BIT31)); //wait until ADC completes operation
elmicro 0:db0d63650413 79
elmicro 0:db0d63650413 80 return((LPC_ADC->ADGDR&0xFFF0)>>4); //extract the 12bit-information
elmicro 0:db0d63650413 81 }
elmicro 0:db0d63650413 82
elmicro 0:db0d63650413 83
elmicro 0:db0d63650413 84 /* ===================================================================
elmicro 0:db0d63650413 85 routine: GetTouchY
elmicro 0:db0d63650413 86 purpose: Hardware driver for sampling the touch screen using
elmicro 0:db0d63650413 87 four ADC-channels
elmicro 0:db0d63650413 88 parameters: none
elmicro 0:db0d63650413 89 returns: raw value from ADC corresponding to Y coordinate of
elmicro 0:db0d63650413 90 touch input
elmicro 0:db0d63650413 91 date: 2012-06-27
elmicro 0:db0d63650413 92 author: Stefan Guenther
elmicro 0:db0d63650413 93 Elektronikladen | ELMICRO
elmicro 0:db0d63650413 94 -------------------------------------------------------------------*/
elmicro 0:db0d63650413 95 unsigned int GetTouchY(void)
elmicro 0:db0d63650413 96 {
elmicro 0:db0d63650413 97 LPC_PINCON->PINSEL1 &= ~0x4000; //Y-
elmicro 0:db0d63650413 98 LPC_PINCON->PINSEL1 |= 0x10000; //X-
elmicro 0:db0d63650413 99 LPC_PINCON->PINSEL1 &= ~0x40000; //Y+
elmicro 0:db0d63650413 100 LPC_PINCON->PINSEL1 |= 0x100000; //X+
elmicro 0:db0d63650413 101 LPC_GPIO0->FIODIR |= BIT23|BIT25; //Y+ and Y- as output
elmicro 0:db0d63650413 102 LPC_GPIO0->FIOCLR = BIT23;
elmicro 0:db0d63650413 103 LPC_GPIO0->FIOSET = BIT25;
elmicro 0:db0d63650413 104 LPC_ADC->ADCR &= ~0xFF;
elmicro 0:db0d63650413 105 LPC_ADC->ADCR |= BIT3;
elmicro 0:db0d63650413 106 LPC_ADC->ADCR |= BIT24;
elmicro 0:db0d63650413 107 while(!(LPC_ADC->ADGDR&BIT31));
elmicro 0:db0d63650413 108
elmicro 0:db0d63650413 109 return((LPC_ADC->ADGDR&0xFFF0)>>4);
elmicro 0:db0d63650413 110 }
elmicro 0:db0d63650413 111
elmicro 0:db0d63650413 112
elmicro 0:db0d63650413 113 /* ===================================================================
elmicro 0:db0d63650413 114 routine: GetRawTouch
elmicro 0:db0d63650413 115 purpose: Reads input values from Touchscreen without
elmicro 0:db0d63650413 116 processing them (mainly useful for doing a calibration)
elmicro 0:db0d63650413 117 parameters: <*x,y,z> pointers to coordinate variables
elmicro 0:db0d63650413 118 returns: 1 if touch was recognized
elmicro 0:db0d63650413 119 0 if no touch occured
elmicro 0:db0d63650413 120 note: For code explanation, look the GetPoint() function
elmicro 0:db0d63650413 121 date: 2012-06-27
elmicro 0:db0d63650413 122 author: Stefan Guenther
elmicro 0:db0d63650413 123 Elektronikladen | ELMICRO
elmicro 0:db0d63650413 124 -------------------------------------------------------------------*/
elmicro 0:db0d63650413 125 unsigned char GetRawTouch(unsigned int *x, unsigned int *y, unsigned int *z)
elmicro 0:db0d63650413 126 {
elmicro 0:db0d63650413 127 unsigned int x1, x2, y1, y2, z1, z2;
elmicro 0:db0d63650413 128
elmicro 0:db0d63650413 129 z1 = GetPressure();
elmicro 0:db0d63650413 130
elmicro 0:db0d63650413 131 if(z1>1500)
elmicro 0:db0d63650413 132 {
elmicro 0:db0d63650413 133 x1 = GetTouchX();
elmicro 0:db0d63650413 134 y1 = GetTouchY();
elmicro 0:db0d63650413 135
elmicro 0:db0d63650413 136 z2 = GetPressure();
elmicro 0:db0d63650413 137 if(z2>1500)
elmicro 0:db0d63650413 138 {
elmicro 0:db0d63650413 139 x2 = GetTouchX();
elmicro 0:db0d63650413 140 y2 = GetTouchY();
elmicro 0:db0d63650413 141
elmicro 0:db0d63650413 142 if( ( (x1>x2-20) && (x1<x2+20) ) && ( (y1>y2-20) && (y1<y2+20) ) )
elmicro 0:db0d63650413 143 {
elmicro 0:db0d63650413 144 *x = (x1+x2) / 2;
elmicro 0:db0d63650413 145 *y = (y1+y2) / 2;
elmicro 0:db0d63650413 146 *z = (z1+z2) / 2;
elmicro 0:db0d63650413 147
elmicro 0:db0d63650413 148 return 1;
elmicro 0:db0d63650413 149 }
elmicro 0:db0d63650413 150 }
elmicro 0:db0d63650413 151 }
elmicro 0:db0d63650413 152 return 0;
elmicro 0:db0d63650413 153 }
elmicro 0:db0d63650413 154
elmicro 0:db0d63650413 155
elmicro 0:db0d63650413 156 /* ===================================================================
elmicro 0:db0d63650413 157 routine: MapX
elmicro 0:db0d63650413 158 purpose: Maps/alligns X-coordinate of touch input onto LCD's
elmicro 0:db0d63650413 159 pixel grid
elmicro 0:db0d63650413 160 parameters: <x> touch coordinate
elmicro 0:db0d63650413 161 returns: pixel coordinate of touch input
elmicro 0:db0d63650413 162 date: 2012-06-27
elmicro 0:db0d63650413 163 author: Stefan Guenther
elmicro 0:db0d63650413 164 Elektronikladen | ELMICRO
elmicro 0:db0d63650413 165 -------------------------------------------------------------------*/
elmicro 0:db0d63650413 166 unsigned int MapX(unsigned int x)
elmicro 0:db0d63650413 167 {
elmicro 0:db0d63650413 168 if(x>TFTData.Xmin)
elmicro 0:db0d63650413 169 {
elmicro 0:db0d63650413 170 x = x-TFTData.Xmin;
elmicro 0:db0d63650413 171 x = (x*1000) / TFTData.Xscale;
elmicro 0:db0d63650413 172 if(x>TFTData.XRes - 1) x = TFTData.XRes - 1;
elmicro 0:db0d63650413 173 } else {
elmicro 0:db0d63650413 174 x = 0;
elmicro 0:db0d63650413 175 }
elmicro 0:db0d63650413 176 return x;
elmicro 0:db0d63650413 177 }
elmicro 0:db0d63650413 178
elmicro 0:db0d63650413 179
elmicro 0:db0d63650413 180 /* ===================================================================
elmicro 0:db0d63650413 181 routine: MapY
elmicro 0:db0d63650413 182 purpose: Maps/alligns Y-coordinate of touch input onto LCD's
elmicro 0:db0d63650413 183 pixel grid
elmicro 0:db0d63650413 184 parameters: <x> touch coordinate
elmicro 0:db0d63650413 185 returns: pixel coordinate of touch input
elmicro 0:db0d63650413 186 date: 2012-06-27
elmicro 0:db0d63650413 187 author: Stefan Guenther
elmicro 0:db0d63650413 188 Elektronikladen | ELMICRO
elmicro 0:db0d63650413 189 -------------------------------------------------------------------*/
elmicro 0:db0d63650413 190 unsigned int MapY(unsigned int y)
elmicro 0:db0d63650413 191 {
elmicro 0:db0d63650413 192 if(y>TFTData.Ymin) //Y input larger than the expected minimum?
elmicro 0:db0d63650413 193 {
elmicro 0:db0d63650413 194 y = y - TFTData.Ymin; //subtract offset from Y coordinate
elmicro 0:db0d63650413 195 y = (y*1000) / TFTData.Yscale; //scale according to touch screen's parameter
elmicro 0:db0d63650413 196 //(this results in an alignment between touch
elmicro 0:db0d63650413 197 //input and output pixel grid)
elmicro 0:db0d63650413 198 if(y>TFTData.YRes - 1) y = TFTData.YRes - 1; //prevent "out of pixel boundary"
elmicro 0:db0d63650413 199 } else {
elmicro 0:db0d63650413 200 y = 0; //sampled Y-coordinate was lower than touch
elmicro 0:db0d63650413 201 } //screen's expected minimum, so keep Y in boundary
elmicro 0:db0d63650413 202 return y;
elmicro 0:db0d63650413 203 }
elmicro 0:db0d63650413 204
elmicro 0:db0d63650413 205
elmicro 0:db0d63650413 206 /* ===================================================================
elmicro 0:db0d63650413 207 routine: GetPoint
elmicro 0:db0d63650413 208 purpose: Reads and processes touch input
elmicro 0:db0d63650413 209 parameters: <*x, *y> pointers to coordinate variables
elmicro 0:db0d63650413 210 returns: 1 if touch input was recognized
elmicro 0:db0d63650413 211 0 if no touch occured
elmicro 0:db0d63650413 212
elmicro 0:db0d63650413 213 note: An oversampling (x2) is done to increase noise
elmicro 0:db0d63650413 214 immunity.
elmicro 0:db0d63650413 215 A pressure value of 1500 has to be read to trigger
elmicro 0:db0d63650413 216 the further processing - a lower value could improve
elmicro 0:db0d63650413 217 touch sensitivity but also increases the risk of
elmicro 0:db0d63650413 218 sampling noise instead of touch inputs.
elmicro 0:db0d63650413 219 date: 2012-06-27
elmicro 0:db0d63650413 220 author: Stefan Guenther
elmicro 0:db0d63650413 221 Elektronikladen | ELMICRO
elmicro 0:db0d63650413 222 -------------------------------------------------------------------*/
elmicro 0:db0d63650413 223 unsigned char GetPoint(unsigned int *x, unsigned int *y)
elmicro 0:db0d63650413 224 {
elmicro 0:db0d63650413 225 unsigned int x1, x2, y1, y2, z1, z2;
elmicro 0:db0d63650413 226
elmicro 0:db0d63650413 227 z1 = GetPressure(); //check for pressure onto touch screen
elmicro 0:db0d63650413 228 if(z1>1500) //pressure above threshold?
elmicro 0:db0d63650413 229 {
elmicro 0:db0d63650413 230 x1 = MapX(GetTouchX()); //read touch coordinates
elmicro 0:db0d63650413 231 y1 = MapY(GetTouchY());
elmicro 0:db0d63650413 232
elmicro 0:db0d63650413 233 z2 = GetPressure(); //oversampling - start second input read
elmicro 0:db0d63650413 234 if(z2>1500) //the second pressure was also above threshold?
elmicro 0:db0d63650413 235 {
elmicro 0:db0d63650413 236 x2 = MapX(GetTouchX()); //sample again
elmicro 0:db0d63650413 237 y2 = MapY(GetTouchY());
elmicro 0:db0d63650413 238
elmicro 0:db0d63650413 239 /* check if both samples were nearly the same
elmicro 0:db0d63650413 240 increase the '2' to improve sensitivity */
elmicro 0:db0d63650413 241 if( ( (x1>x2 - 2) && (x1<x2+2) ) && ( (y1>y2 - 2) && (y1<y2 + 2) ) )
elmicro 0:db0d63650413 242 {
elmicro 0:db0d63650413 243 *x = (x1+x2) / 2; //do a simple meridian calculation
elmicro 0:db0d63650413 244 *y = (y1+y2) / 2; //on both samples and both coordinates
elmicro 0:db0d63650413 245
elmicro 0:db0d63650413 246 return 1; //touch input was processed!
elmicro 0:db0d63650413 247 }
elmicro 0:db0d63650413 248 }
elmicro 0:db0d63650413 249 }
elmicro 0:db0d63650413 250 return 0; //no touch input was processed!
elmicro 0:db0d63650413 251 }