KL25Z driving an ILI9320 LCD board with touch panel (HY28A-LCDB SPI)
Dependencies: SPI_TFT_ILI9320 mbed
Touch.cpp
00001 /************************************************************************************************** 00002 ***** ***** 00003 ***** Name: Touch.cpp ***** 00004 ***** Ver.: 1.0 ***** 00005 ***** Date: 04/01/2013 ***** 00006 ***** Auth: Frank Vannieuwkerke ***** 00007 ***** Erik Olieman ***** 00008 ***** Func: Touch driver for use with ADS7843 ***** 00009 ***** ***** 00010 ***** Code based on Carlos E. Vidales tutorial : ***** 00011 ***** How To Calibrate Touch Screens ***** 00012 ***** www.embedded.com/design/configurable-systems/4023968/How-To-Calibrate-Touch-Screens ***** 00013 ***** ***** 00014 **************************************************************************************************/ 00015 00016 #include "Touch.h" 00017 #include "mbed.h" 00018 #include "Arial12x12.h" 00019 00020 #define THRESHOLD 2 00021 00022 TouchScreenADS7843::TouchScreenADS7843(PinName tp_mosi, PinName tp_miso, PinName tp_sclk, PinName tp_cs, PinName tp_irq, SPI_TFT *_LCD) 00023 : LCD(_LCD), _tp_spi(tp_mosi, tp_miso, tp_sclk), _tp_cs(tp_cs), _tp_irq(tp_irq) 00024 { 00025 DisplaySample[0].x=45; 00026 DisplaySample[0].y=45; 00027 DisplaySample[1].x=45; 00028 DisplaySample[1].y=270; 00029 DisplaySample[2].x=190; 00030 DisplaySample[2].y=190; 00031 ScreenSample[0].x=45; 00032 ScreenSample[0].y=45; 00033 ScreenSample[1].x=45; 00034 ScreenSample[1].y=270; 00035 ScreenSample[2].x=190; 00036 ScreenSample[2].y=190; 00037 _tp_cs=1; 00038 _tp_spi.frequency(500000); 00039 _tp_spi.format(8,0); // 8 bit spi mode 0 00040 } 00041 00042 int TouchScreenADS7843::Read_XY(unsigned char XY) 00043 { 00044 unsigned char msb, lsb; 00045 unsigned int Temp; 00046 00047 Temp=0; 00048 _tp_cs=0; 00049 wait_us(SPI_RD_DELAY); 00050 _tp_spi.write(XY); 00051 wait_us(SPI_RD_DELAY); 00052 msb = _tp_spi.write(0x00); // msb 00053 wait_us(SPI_RD_DELAY); 00054 lsb = _tp_spi.write(0x00); // lsb 00055 _tp_cs=1; 00056 Temp = ((msb << 8 ) | lsb); 00057 Temp >>= 3; 00058 Temp &= 0xfff; 00059 Temp /= 4; // Scaling : return value range must be between 0 and 1024 00060 return(Temp); 00061 } 00062 00063 00064 void TouchScreenADS7843::TP_GetAdXY(int *x,int *y) 00065 { 00066 int adx,ady; 00067 adx = Read_XY(CHX); 00068 wait_us(1); 00069 ady = Read_XY(CHY); 00070 *x = adx; 00071 *y = ady; 00072 } 00073 00074 void TouchScreenADS7843::TP_DrawPoint(unsigned int Xpos,unsigned int Ypos, unsigned int color) 00075 { 00076 LCD->wr_reg(0x03, 0x1030); 00077 LCD->WindowMax(); 00078 LCD->pixel(Xpos,Ypos,color); 00079 LCD->pixel(Xpos+1,Ypos,color); 00080 LCD->pixel(Xpos,Ypos+1,color); 00081 LCD->pixel(Xpos+1,Ypos+1,color); 00082 } 00083 00084 void TouchScreenADS7843::DrawCross(unsigned int Xpos,unsigned int Ypos) 00085 { 00086 LCD->line(Xpos-15,Ypos,Xpos-2,Ypos,White); 00087 LCD->line(Xpos+2,Ypos,Xpos+15,Ypos,White); 00088 LCD->line(Xpos,Ypos-15,Xpos,Ypos-2,White); 00089 LCD->line(Xpos,Ypos+2,Xpos,Ypos+15,White); 00090 00091 LCD->line(Xpos-15,Ypos+15,Xpos-7,Ypos+15,DarkGrey); 00092 LCD->line(Xpos-15,Ypos+7,Xpos-15,Ypos+15,DarkGrey); 00093 00094 LCD->line(Xpos-15,Ypos-15,Xpos-7,Ypos-15,DarkGrey); 00095 LCD->line(Xpos-15,Ypos-7,Xpos-15,Ypos-15,DarkGrey); 00096 00097 LCD->line(Xpos+7,Ypos+15,Xpos+15,Ypos+15,DarkGrey); 00098 LCD->line(Xpos+15,Ypos+7,Xpos+15,Ypos+15,DarkGrey); 00099 00100 LCD->line(Xpos+7,Ypos-15,Xpos+15,Ypos-15,DarkGrey); 00101 LCD->line(Xpos+15,Ypos-15,Xpos+15,Ypos-7,DarkGrey); 00102 } 00103 00104 unsigned char TouchScreenADS7843::Read_Ads7843(Coordinate * screenPtr) 00105 { 00106 int m0,m1,m2,TP_X[1],TP_Y[1],temp[3]; 00107 uint8_t count=0; 00108 int buffer[2][9]={{0},{0}}; 00109 if (screenPtr == NULL) screenPtr = &screen; 00110 do 00111 { 00112 TP_GetAdXY(TP_X,TP_Y); 00113 buffer[0][count]=TP_X[0]; 00114 buffer[1][count]=TP_Y[0]; 00115 count++; 00116 } 00117 while(!_tp_irq && (count < 9)); 00118 if(count==9) 00119 { 00120 temp[0]=(buffer[0][0]+buffer[0][1]+buffer[0][2])/3; 00121 temp[1]=(buffer[0][3]+buffer[0][4]+buffer[0][5])/3; 00122 temp[2]=(buffer[0][6]+buffer[0][7]+buffer[0][8])/3; 00123 m0=temp[0]-temp[1]; 00124 m1=temp[1]-temp[2]; 00125 m2=temp[2]-temp[0]; 00126 m0=m0>0?m0:(-m0); 00127 m1=m1>0?m1:(-m1); 00128 m2=m2>0?m2:(-m2); 00129 if( (m0>THRESHOLD) && (m1>THRESHOLD) && (m2>THRESHOLD) ) return 0; 00130 if(m0<m1) 00131 { 00132 if(m2<m0) 00133 screenPtr->x=(temp[0]+temp[2])/2; 00134 else 00135 screenPtr->x=(temp[0]+temp[1])/2; 00136 } 00137 else if(m2<m1) 00138 screenPtr->x=(temp[0]+temp[2])/2; 00139 else 00140 screenPtr->x=(temp[1]+temp[2])/2; 00141 00142 temp[0]=(buffer[1][0]+buffer[1][1]+buffer[1][2])/3; 00143 temp[1]=(buffer[1][3]+buffer[1][4]+buffer[1][5])/3; 00144 temp[2]=(buffer[1][6]+buffer[1][7]+buffer[1][8])/3; 00145 m0=temp[0]-temp[1]; 00146 m1=temp[1]-temp[2]; 00147 m2=temp[2]-temp[0]; 00148 m0=m0>0?m0:(-m0); 00149 m1=m1>0?m1:(-m1); 00150 m2=m2>0?m2:(-m2); 00151 if( (m0>THRESHOLD) && (m1>THRESHOLD) && (m2>THRESHOLD) ) return 0; 00152 00153 if(m0<m1) 00154 { 00155 if(m2<m0) 00156 screenPtr->y=(temp[0]+temp[2])/2; 00157 else 00158 screenPtr->y=(temp[0]+temp[1])/2; 00159 } 00160 else if(m2<m1) 00161 screenPtr->y=(temp[0]+temp[2])/2; 00162 else 00163 screenPtr->y=(temp[1]+temp[2])/2; 00164 return 1; 00165 } 00166 return 0; 00167 } 00168 00169 uint8_t TouchScreenADS7843::setCalibrationMatrix( Coordinate * displayPtr, 00170 Coordinate * screenPtr, 00171 Matrix * matrixPtr) 00172 { 00173 uint8_t retTHRESHOLD = 0 ; 00174 // K = (Xs0 - Xs2)*(Ys1 - Ys2) - (Xs1 - Xs2)*(Ys0 - Ys2) 00175 matrixPtr->Divider = ((screenPtr[0].x - screenPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) - 00176 ((screenPtr[1].x - screenPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ; 00177 if( matrixPtr->Divider == 0 ) 00178 { 00179 retTHRESHOLD = 1; 00180 } 00181 else 00182 { 00183 // (Xd0 - Xd2)*(Ys1 - Ys2) - (Xd1 - Xd2)*(Ys0 - Ys2) 00184 // A = --------------------------------------------------- 00185 // K 00186 matrixPtr->An = ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) - 00187 ((displayPtr[1].x - displayPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ; 00188 // (Xs0 - Xs2)*(Xd1 - Xd2) - (Xd0 - Xd2)*(Xs1 - Xs2) 00189 // B = --------------------------------------------------- 00190 // K 00191 matrixPtr->Bn = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].x - displayPtr[2].x)) - 00192 ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].x - screenPtr[2].x)) ; 00193 // Ys0*(Xs2*Xd1 - Xs1*Xd2) + Ys1*(Xs0*Xd2 - Xs2*Xd0) + Ys2*(Xs1*Xd0 - Xs0*Xd1) 00194 // C = ---------------------------------------------------------------------------- 00195 // K 00196 matrixPtr->Cn = (screenPtr[2].x * displayPtr[1].x - screenPtr[1].x * displayPtr[2].x) * screenPtr[0].y + 00197 (screenPtr[0].x * displayPtr[2].x - screenPtr[2].x * displayPtr[0].x) * screenPtr[1].y + 00198 (screenPtr[1].x * displayPtr[0].x - screenPtr[0].x * displayPtr[1].x) * screenPtr[2].y ; 00199 // (Yd0 - Yd2)*(Ys1 - Ys2) - (Yd1 - Yd2)*(Ys0 - Ys2) 00200 // D = --------------------------------------------------- 00201 // K 00202 matrixPtr->Dn = ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].y - screenPtr[2].y)) - 00203 ((displayPtr[1].y - displayPtr[2].y) * (screenPtr[0].y - screenPtr[2].y)) ; 00204 // (Xs0 - Xs2)*(Yd1 - Yd2) - (Yd0 - Yd2)*(Xs1 - Xs2) 00205 // E = --------------------------------------------------- 00206 // K 00207 matrixPtr->En = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].y - displayPtr[2].y)) - 00208 ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].x - screenPtr[2].x)) ; 00209 // Ys0*(Xs2*Yd1 - Xs1*Yd2) + Ys1*(Xs0*Yd2 - Xs2*Yd0) + Ys2*(Xs1*Yd0 - Xs0*Yd1) 00210 // F = ---------------------------------------------------------------------------- 00211 // K 00212 matrixPtr->Fn = (screenPtr[2].x * displayPtr[1].y - screenPtr[1].x * displayPtr[2].y) * screenPtr[0].y + 00213 (screenPtr[0].x * displayPtr[2].y - screenPtr[2].x * displayPtr[0].y) * screenPtr[1].y + 00214 (screenPtr[1].x * displayPtr[0].y - screenPtr[0].x * displayPtr[1].y) * screenPtr[2].y ; 00215 } 00216 return( retTHRESHOLD ) ; 00217 } 00218 00219 uint8_t TouchScreenADS7843::getDisplayPoint(void) 00220 { 00221 uint8_t retTHRESHOLD = 0 ; 00222 00223 if( matrix.Divider != 0 ) 00224 { 00225 // XD = AX+BY+C 00226 display.x = ( (matrix.An * screen.x) + 00227 (matrix.Bn * screen.y) + 00228 matrix.Cn 00229 ) / matrix.Divider ; 00230 // YD = DX+EY+F 00231 display.y = ( (matrix.Dn * screen.x) + 00232 (matrix.En * screen.y) + 00233 matrix.Fn 00234 ) / matrix.Divider ; 00235 } 00236 else 00237 { 00238 retTHRESHOLD = 1; 00239 } 00240 return(retTHRESHOLD); 00241 } 00242 00243 void TouchScreenADS7843::TouchPanel_Calibrate(void) 00244 { 00245 uint8_t i; 00246 Coordinate screen_cal; 00247 setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix) ; 00248 LCD->set_font((unsigned char*) Arial12x12); 00249 for(i=0;i<3;i++) 00250 { 00251 LCD->cls(); 00252 LCD->locate(10,10); 00253 LCD->printf("Touch crosshair to calibrate"); 00254 wait_ms(500); 00255 DrawCross(DisplaySample[i].x,DisplaySample[i].y); 00256 do {} while (!Read_Ads7843(&screen_cal)); 00257 ScreenSample[i].x= screen_cal.x;ScreenSample[i].y= screen_cal.y; 00258 } 00259 setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix) ; 00260 LCD->cls(); 00261 } 00262 00263 void TouchScreenADS7843::GetCalibration(Matrix * matrixPtr, Coordinate * screenPtr) 00264 { 00265 uint8_t i; 00266 Matrix * mp1; 00267 mp1 = &matrix; 00268 *matrixPtr = *mp1; 00269 for(i=0;i<3;i++) 00270 { 00271 screenPtr[i].x = ScreenSample[i].x; 00272 screenPtr[i].y = ScreenSample[i].y; 00273 } 00274 } 00275 00276 void TouchScreenADS7843::SetCalibration(Matrix * matrixPtr, Coordinate * screenPtr) 00277 { 00278 uint8_t i; 00279 Matrix * mp1; 00280 mp1 = &matrix; 00281 *mp1 = *matrixPtr; 00282 for(i=0;i<3;i++) 00283 { 00284 ScreenSample[i].x = screenPtr[i].x; 00285 ScreenSample[i].y = screenPtr[i].y; 00286 } 00287 setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix) ; 00288 }
Generated on Tue Jul 12 2022 18:38:00 by 1.7.2