Library for Mini-DK board
Dependents: LPC1768_Mini-DK_EasyWeb_DM9161 LPC1768_Mini-DK LPC1768_Mini-DK
Fork of Mini-DK by
Mini-DK board overview (Micro SD connector is at the bottom side)
One serial interface , uses CP2102 (USB to RS232 interface, support ISP download )
RJ45-10/100M Ethernet network interface (Ethernet PHY: DM9161)
2.8 inch TFT color LCD interface (SPI interface or 16Bit parallel interface)
Touch panel controller XPT2046 (ADS7843 compatible)
USB 2.0 interface, USB host and USB Device interface.
TF SD / MMC card (SPI) interface.
Two user buttons, One Reset button and ISP button , One INT0 button, two user-programmable LED lights
Serial ISP download, Standard 20-pin JTAG download simulation debugging interface.
Selection between external 5V power supply or USB 5V supply.
Board size: 95mm * 78mm
All IO available on extension connectors
04/01/13
Erik Olieman (http://mbed.org/users/Sissors/) joined the code development for the Mini-DK board.
Thanks to his input, we were able to obtain a tremendous speed gain, remove warnings, ...
An overview of all modifications is stored in modifs.h
The old page (http://mbed.org/users/frankvnk/code/LPC1768_Mini-DK/) contains the demo code.
IMPORTANT : Due to a change in the mbed libraries (Stream()), we cannot use the printf instruction - we need to use <SPI_TFT>.printf (example - see main.cpp in http://mbed.org/users/frankvnk/code/LPC1768_Mini-DK/)
WARNING: filetoflash (SD to CPU flash)
The SPI_TFT library contains an option to copy an image from the SD card to the CPU flash memory. This allows you to use an image as background without speed loss when writing other text and graphics.
By default, this option is enabled.
It can be disabled by uncommenting the #define mentioned below in Mini_DK.h:
#define NO_FLASH_BUFFER
Since the flash memory has limited write endurance, DO NOT use this feature when you intend to read multiple images from the SD card (eg: when used as a photo frame).
14/01/13
A newer version of the Mini-DK has been released by the manufacturer: Mini-DK2. They replaced the DM9161 PHY with a LAN8720A PHY and better buttons are fitted on the board. All other hardware remains the same. Code for this PHY is available from the NXP MCU SW application team. This allows us to use the mbed 'EthernetInterface' library with little modifications. Further info - see http://mbed.org/forum/mbed/topic/3684/?page=1#comment-18473.
Notes:
The code in 'lpc_phy_lan8720.c' uses 'msDelay' - needs to be replaced with 'osDelay'.
A custom MAC address can be defined using following code:
extern "C" void mbed_mac_address(char * mac) { // define your own MAC Address mac[0] = 0x00; mac[1] = 0x01; mac[2] = 0x02; mac[3] = 0x03; mac[4] = 0x04; mac[5] = 0x05; };
TouchADS7843/Touch.cpp@23:67989b4f61ad, 2014-11-04 (annotated)
- Committer:
- frankvnk
- Date:
- Tue Nov 04 21:43:48 2014 +0000
- Revision:
- 23:67989b4f61ad
- Parent:
- 22:9d05a7e6dc9d
Updated SPI_TFT_ILI9320 library to the latest version (auto-detect ILI9320, 9325 and 9328)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frankvnk | 7:ffdd4e75b366 | 1 | /************************************************************************************************** |
frankvnk | 7:ffdd4e75b366 | 2 | ***** ***** |
frankvnk | 7:ffdd4e75b366 | 3 | ***** Name: Touch.cpp ***** |
frankvnk | 7:ffdd4e75b366 | 4 | ***** Ver.: 1.0 ***** |
frankvnk | 7:ffdd4e75b366 | 5 | ***** Date: 04/01/2013 ***** |
frankvnk | 7:ffdd4e75b366 | 6 | ***** Auth: Frank Vannieuwkerke ***** |
frankvnk | 7:ffdd4e75b366 | 7 | ***** Erik Olieman ***** |
frankvnk | 7:ffdd4e75b366 | 8 | ***** Func: Touch driver for use with ADS7843 ***** |
frankvnk | 7:ffdd4e75b366 | 9 | ***** ***** |
frankvnk | 7:ffdd4e75b366 | 10 | ***** Code based on Carlos E. Vidales tutorial : ***** |
frankvnk | 7:ffdd4e75b366 | 11 | ***** How To Calibrate Touch Screens ***** |
frankvnk | 7:ffdd4e75b366 | 12 | ***** www.embedded.com/design/configurable-systems/4023968/How-To-Calibrate-Touch-Screens ***** |
frankvnk | 7:ffdd4e75b366 | 13 | ***** ***** |
frankvnk | 7:ffdd4e75b366 | 14 | **************************************************************************************************/ |
frankvnk | 2:d0acbd263ec7 | 15 | |
frankvnk | 2:d0acbd263ec7 | 16 | #include "Touch.h" |
frankvnk | 2:d0acbd263ec7 | 17 | #include "mbed.h" |
frankvnk | 2:d0acbd263ec7 | 18 | #include "Arial12x12.h" |
frankvnk | 2:d0acbd263ec7 | 19 | |
frankvnk | 2:d0acbd263ec7 | 20 | #define THRESHOLD 2 |
frankvnk | 2:d0acbd263ec7 | 21 | |
frankvnk | 3:fb4d62b5ffb3 | 22 | TouchScreenADS7843::TouchScreenADS7843(PinName tp_mosi, PinName tp_miso, PinName tp_sclk, PinName tp_cs, PinName tp_irq, SPI_TFT *_LCD) |
Sissors | 5:781a72d380a1 | 23 | : LCD(_LCD), _tp_spi(tp_mosi, tp_miso, tp_sclk), _tp_cs(tp_cs), _tp_irq(tp_irq) |
frankvnk | 2:d0acbd263ec7 | 24 | { |
frankvnk | 2:d0acbd263ec7 | 25 | DisplaySample[0].x=45; |
frankvnk | 2:d0acbd263ec7 | 26 | DisplaySample[0].y=45; |
frankvnk | 2:d0acbd263ec7 | 27 | DisplaySample[1].x=45; |
frankvnk | 2:d0acbd263ec7 | 28 | DisplaySample[1].y=270; |
frankvnk | 2:d0acbd263ec7 | 29 | DisplaySample[2].x=190; |
frankvnk | 2:d0acbd263ec7 | 30 | DisplaySample[2].y=190; |
frankvnk | 2:d0acbd263ec7 | 31 | ScreenSample[0].x=45; |
frankvnk | 2:d0acbd263ec7 | 32 | ScreenSample[0].y=45; |
frankvnk | 2:d0acbd263ec7 | 33 | ScreenSample[1].x=45; |
frankvnk | 2:d0acbd263ec7 | 34 | ScreenSample[1].y=270; |
frankvnk | 2:d0acbd263ec7 | 35 | ScreenSample[2].x=190; |
frankvnk | 2:d0acbd263ec7 | 36 | ScreenSample[2].y=190; |
frankvnk | 2:d0acbd263ec7 | 37 | _tp_cs=1; |
frankvnk | 2:d0acbd263ec7 | 38 | _tp_spi.frequency(500000); |
frankvnk | 2:d0acbd263ec7 | 39 | _tp_spi.format(8,0); // 8 bit spi mode 0 |
frankvnk | 2:d0acbd263ec7 | 40 | } |
frankvnk | 2:d0acbd263ec7 | 41 | |
frankvnk | 2:d0acbd263ec7 | 42 | int TouchScreenADS7843::Read_XY(unsigned char XY) |
frankvnk | 2:d0acbd263ec7 | 43 | { |
frankvnk | 2:d0acbd263ec7 | 44 | unsigned char msb, lsb; |
frankvnk | 2:d0acbd263ec7 | 45 | unsigned int Temp; |
frankvnk | 2:d0acbd263ec7 | 46 | |
frankvnk | 2:d0acbd263ec7 | 47 | Temp=0; |
frankvnk | 2:d0acbd263ec7 | 48 | _tp_cs=0; |
frankvnk | 2:d0acbd263ec7 | 49 | wait_us(SPI_RD_DELAY); |
frankvnk | 2:d0acbd263ec7 | 50 | _tp_spi.write(XY); |
frankvnk | 2:d0acbd263ec7 | 51 | wait_us(SPI_RD_DELAY); |
frankvnk | 17:66c4e84d8571 | 52 | msb = _tp_spi.write(0x00); // msb |
frankvnk | 2:d0acbd263ec7 | 53 | wait_us(SPI_RD_DELAY); |
frankvnk | 17:66c4e84d8571 | 54 | lsb = _tp_spi.write(0x00); // lsb |
frankvnk | 2:d0acbd263ec7 | 55 | _tp_cs=1; |
frankvnk | 2:d0acbd263ec7 | 56 | Temp = ((msb << 8 ) | lsb); |
frankvnk | 2:d0acbd263ec7 | 57 | Temp >>= 3; |
frankvnk | 2:d0acbd263ec7 | 58 | Temp &= 0xfff; |
frankvnk | 17:66c4e84d8571 | 59 | Temp /= 4; // Scaling : return value range must be between 0 and 1024 |
frankvnk | 2:d0acbd263ec7 | 60 | return(Temp); |
frankvnk | 2:d0acbd263ec7 | 61 | } |
frankvnk | 2:d0acbd263ec7 | 62 | |
frankvnk | 2:d0acbd263ec7 | 63 | |
frankvnk | 2:d0acbd263ec7 | 64 | void TouchScreenADS7843::TP_GetAdXY(int *x,int *y) |
frankvnk | 2:d0acbd263ec7 | 65 | { |
frankvnk | 2:d0acbd263ec7 | 66 | int adx,ady; |
frankvnk | 2:d0acbd263ec7 | 67 | adx = Read_XY(CHX); |
frankvnk | 2:d0acbd263ec7 | 68 | wait_us(1); |
frankvnk | 2:d0acbd263ec7 | 69 | ady = Read_XY(CHY); |
frankvnk | 2:d0acbd263ec7 | 70 | *x = adx; |
frankvnk | 2:d0acbd263ec7 | 71 | *y = ady; |
frankvnk | 2:d0acbd263ec7 | 72 | } |
frankvnk | 2:d0acbd263ec7 | 73 | |
frankvnk | 2:d0acbd263ec7 | 74 | void TouchScreenADS7843::TP_DrawPoint(unsigned int Xpos,unsigned int Ypos, unsigned int color) |
frankvnk | 2:d0acbd263ec7 | 75 | { |
frankvnk | 3:fb4d62b5ffb3 | 76 | LCD->wr_reg(0x03, 0x1030); |
frankvnk | 2:d0acbd263ec7 | 77 | LCD->WindowMax(); |
frankvnk | 2:d0acbd263ec7 | 78 | LCD->pixel(Xpos,Ypos,color); |
frankvnk | 2:d0acbd263ec7 | 79 | LCD->pixel(Xpos+1,Ypos,color); |
frankvnk | 2:d0acbd263ec7 | 80 | LCD->pixel(Xpos,Ypos+1,color); |
frankvnk | 3:fb4d62b5ffb3 | 81 | LCD->pixel(Xpos+1,Ypos+1,color); |
frankvnk | 2:d0acbd263ec7 | 82 | } |
frankvnk | 2:d0acbd263ec7 | 83 | |
frankvnk | 2:d0acbd263ec7 | 84 | void TouchScreenADS7843::DrawCross(unsigned int Xpos,unsigned int Ypos) |
frankvnk | 2:d0acbd263ec7 | 85 | { |
frankvnk | 3:fb4d62b5ffb3 | 86 | LCD->line(Xpos-15,Ypos,Xpos-2,Ypos,White); |
frankvnk | 2:d0acbd263ec7 | 87 | LCD->line(Xpos+2,Ypos,Xpos+15,Ypos,White); |
frankvnk | 2:d0acbd263ec7 | 88 | LCD->line(Xpos,Ypos-15,Xpos,Ypos-2,White); |
frankvnk | 2:d0acbd263ec7 | 89 | LCD->line(Xpos,Ypos+2,Xpos,Ypos+15,White); |
frankvnk | 2:d0acbd263ec7 | 90 | |
frankvnk | 2:d0acbd263ec7 | 91 | LCD->line(Xpos-15,Ypos+15,Xpos-7,Ypos+15,DarkGrey); |
frankvnk | 2:d0acbd263ec7 | 92 | LCD->line(Xpos-15,Ypos+7,Xpos-15,Ypos+15,DarkGrey); |
frankvnk | 2:d0acbd263ec7 | 93 | |
frankvnk | 2:d0acbd263ec7 | 94 | LCD->line(Xpos-15,Ypos-15,Xpos-7,Ypos-15,DarkGrey); |
frankvnk | 2:d0acbd263ec7 | 95 | LCD->line(Xpos-15,Ypos-7,Xpos-15,Ypos-15,DarkGrey); |
frankvnk | 2:d0acbd263ec7 | 96 | |
frankvnk | 2:d0acbd263ec7 | 97 | LCD->line(Xpos+7,Ypos+15,Xpos+15,Ypos+15,DarkGrey); |
frankvnk | 2:d0acbd263ec7 | 98 | LCD->line(Xpos+15,Ypos+7,Xpos+15,Ypos+15,DarkGrey); |
frankvnk | 2:d0acbd263ec7 | 99 | |
frankvnk | 2:d0acbd263ec7 | 100 | LCD->line(Xpos+7,Ypos-15,Xpos+15,Ypos-15,DarkGrey); |
frankvnk | 3:fb4d62b5ffb3 | 101 | LCD->line(Xpos+15,Ypos-15,Xpos+15,Ypos-7,DarkGrey); |
frankvnk | 2:d0acbd263ec7 | 102 | } |
frankvnk | 2:d0acbd263ec7 | 103 | |
frankvnk | 20:5feb12e3801f | 104 | unsigned char TouchScreenADS7843::Read_Ads7843(Coordinate * screenPtr) |
frankvnk | 2:d0acbd263ec7 | 105 | { |
frankvnk | 2:d0acbd263ec7 | 106 | int m0,m1,m2,TP_X[1],TP_Y[1],temp[3]; |
frankvnk | 2:d0acbd263ec7 | 107 | uint8_t count=0; |
frankvnk | 2:d0acbd263ec7 | 108 | int buffer[2][9]={{0},{0}}; |
frankvnk | 3:fb4d62b5ffb3 | 109 | if (screenPtr == NULL) screenPtr = &screen; |
frankvnk | 2:d0acbd263ec7 | 110 | do |
frankvnk | 2:d0acbd263ec7 | 111 | { |
frankvnk | 2:d0acbd263ec7 | 112 | TP_GetAdXY(TP_X,TP_Y); |
frankvnk | 2:d0acbd263ec7 | 113 | buffer[0][count]=TP_X[0]; |
frankvnk | 2:d0acbd263ec7 | 114 | buffer[1][count]=TP_Y[0]; |
frankvnk | 2:d0acbd263ec7 | 115 | count++; |
frankvnk | 2:d0acbd263ec7 | 116 | } |
frankvnk | 2:d0acbd263ec7 | 117 | while(!_tp_irq && (count < 9)); |
frankvnk | 2:d0acbd263ec7 | 118 | if(count==9) |
frankvnk | 2:d0acbd263ec7 | 119 | { |
frankvnk | 2:d0acbd263ec7 | 120 | temp[0]=(buffer[0][0]+buffer[0][1]+buffer[0][2])/3; |
frankvnk | 2:d0acbd263ec7 | 121 | temp[1]=(buffer[0][3]+buffer[0][4]+buffer[0][5])/3; |
frankvnk | 2:d0acbd263ec7 | 122 | temp[2]=(buffer[0][6]+buffer[0][7]+buffer[0][8])/3; |
frankvnk | 2:d0acbd263ec7 | 123 | m0=temp[0]-temp[1]; |
frankvnk | 2:d0acbd263ec7 | 124 | m1=temp[1]-temp[2]; |
frankvnk | 2:d0acbd263ec7 | 125 | m2=temp[2]-temp[0]; |
frankvnk | 2:d0acbd263ec7 | 126 | m0=m0>0?m0:(-m0); |
frankvnk | 2:d0acbd263ec7 | 127 | m1=m1>0?m1:(-m1); |
frankvnk | 2:d0acbd263ec7 | 128 | m2=m2>0?m2:(-m2); |
frankvnk | 2:d0acbd263ec7 | 129 | if( (m0>THRESHOLD) && (m1>THRESHOLD) && (m2>THRESHOLD) ) return 0; |
frankvnk | 2:d0acbd263ec7 | 130 | if(m0<m1) |
frankvnk | 2:d0acbd263ec7 | 131 | { |
frankvnk | 2:d0acbd263ec7 | 132 | if(m2<m0) |
frankvnk | 2:d0acbd263ec7 | 133 | screenPtr->x=(temp[0]+temp[2])/2; |
frankvnk | 2:d0acbd263ec7 | 134 | else |
frankvnk | 2:d0acbd263ec7 | 135 | screenPtr->x=(temp[0]+temp[1])/2; |
frankvnk | 2:d0acbd263ec7 | 136 | } |
frankvnk | 2:d0acbd263ec7 | 137 | else if(m2<m1) |
frankvnk | 2:d0acbd263ec7 | 138 | screenPtr->x=(temp[0]+temp[2])/2; |
frankvnk | 2:d0acbd263ec7 | 139 | else |
frankvnk | 2:d0acbd263ec7 | 140 | screenPtr->x=(temp[1]+temp[2])/2; |
frankvnk | 2:d0acbd263ec7 | 141 | |
frankvnk | 2:d0acbd263ec7 | 142 | temp[0]=(buffer[1][0]+buffer[1][1]+buffer[1][2])/3; |
frankvnk | 2:d0acbd263ec7 | 143 | temp[1]=(buffer[1][3]+buffer[1][4]+buffer[1][5])/3; |
frankvnk | 2:d0acbd263ec7 | 144 | temp[2]=(buffer[1][6]+buffer[1][7]+buffer[1][8])/3; |
frankvnk | 2:d0acbd263ec7 | 145 | m0=temp[0]-temp[1]; |
frankvnk | 2:d0acbd263ec7 | 146 | m1=temp[1]-temp[2]; |
frankvnk | 2:d0acbd263ec7 | 147 | m2=temp[2]-temp[0]; |
frankvnk | 2:d0acbd263ec7 | 148 | m0=m0>0?m0:(-m0); |
frankvnk | 2:d0acbd263ec7 | 149 | m1=m1>0?m1:(-m1); |
frankvnk | 2:d0acbd263ec7 | 150 | m2=m2>0?m2:(-m2); |
frankvnk | 2:d0acbd263ec7 | 151 | if( (m0>THRESHOLD) && (m1>THRESHOLD) && (m2>THRESHOLD) ) return 0; |
frankvnk | 2:d0acbd263ec7 | 152 | |
frankvnk | 2:d0acbd263ec7 | 153 | if(m0<m1) |
frankvnk | 2:d0acbd263ec7 | 154 | { |
frankvnk | 2:d0acbd263ec7 | 155 | if(m2<m0) |
frankvnk | 2:d0acbd263ec7 | 156 | screenPtr->y=(temp[0]+temp[2])/2; |
frankvnk | 2:d0acbd263ec7 | 157 | else |
frankvnk | 2:d0acbd263ec7 | 158 | screenPtr->y=(temp[0]+temp[1])/2; |
frankvnk | 2:d0acbd263ec7 | 159 | } |
frankvnk | 2:d0acbd263ec7 | 160 | else if(m2<m1) |
frankvnk | 2:d0acbd263ec7 | 161 | screenPtr->y=(temp[0]+temp[2])/2; |
frankvnk | 2:d0acbd263ec7 | 162 | else |
frankvnk | 2:d0acbd263ec7 | 163 | screenPtr->y=(temp[1]+temp[2])/2; |
frankvnk | 2:d0acbd263ec7 | 164 | return 1; |
frankvnk | 2:d0acbd263ec7 | 165 | } |
frankvnk | 2:d0acbd263ec7 | 166 | return 0; |
frankvnk | 2:d0acbd263ec7 | 167 | } |
frankvnk | 2:d0acbd263ec7 | 168 | |
frankvnk | 2:d0acbd263ec7 | 169 | uint8_t TouchScreenADS7843::setCalibrationMatrix( Coordinate * displayPtr, |
frankvnk | 2:d0acbd263ec7 | 170 | Coordinate * screenPtr, |
frankvnk | 2:d0acbd263ec7 | 171 | Matrix * matrixPtr) |
frankvnk | 2:d0acbd263ec7 | 172 | { |
frankvnk | 2:d0acbd263ec7 | 173 | uint8_t retTHRESHOLD = 0 ; |
frankvnk | 2:d0acbd263ec7 | 174 | // K = (Xs0 - Xs2)*(Ys1 - Ys2) - (Xs1 - Xs2)*(Ys0 - Ys2) |
frankvnk | 2:d0acbd263ec7 | 175 | matrixPtr->Divider = ((screenPtr[0].x - screenPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) - |
frankvnk | 2:d0acbd263ec7 | 176 | ((screenPtr[1].x - screenPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ; |
frankvnk | 2:d0acbd263ec7 | 177 | if( matrixPtr->Divider == 0 ) |
frankvnk | 2:d0acbd263ec7 | 178 | { |
frankvnk | 2:d0acbd263ec7 | 179 | retTHRESHOLD = 1; |
frankvnk | 2:d0acbd263ec7 | 180 | } |
frankvnk | 2:d0acbd263ec7 | 181 | else |
frankvnk | 2:d0acbd263ec7 | 182 | { |
frankvnk | 2:d0acbd263ec7 | 183 | // (Xd0 - Xd2)*(Ys1 - Ys2) - (Xd1 - Xd2)*(Ys0 - Ys2) |
frankvnk | 2:d0acbd263ec7 | 184 | // A = --------------------------------------------------- |
frankvnk | 2:d0acbd263ec7 | 185 | // K |
frankvnk | 2:d0acbd263ec7 | 186 | matrixPtr->An = ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) - |
frankvnk | 2:d0acbd263ec7 | 187 | ((displayPtr[1].x - displayPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ; |
frankvnk | 2:d0acbd263ec7 | 188 | // (Xs0 - Xs2)*(Xd1 - Xd2) - (Xd0 - Xd2)*(Xs1 - Xs2) |
frankvnk | 2:d0acbd263ec7 | 189 | // B = --------------------------------------------------- |
frankvnk | 2:d0acbd263ec7 | 190 | // K |
frankvnk | 2:d0acbd263ec7 | 191 | matrixPtr->Bn = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].x - displayPtr[2].x)) - |
frankvnk | 2:d0acbd263ec7 | 192 | ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].x - screenPtr[2].x)) ; |
frankvnk | 2:d0acbd263ec7 | 193 | // Ys0*(Xs2*Xd1 - Xs1*Xd2) + Ys1*(Xs0*Xd2 - Xs2*Xd0) + Ys2*(Xs1*Xd0 - Xs0*Xd1) |
frankvnk | 2:d0acbd263ec7 | 194 | // C = ---------------------------------------------------------------------------- |
frankvnk | 2:d0acbd263ec7 | 195 | // K |
frankvnk | 2:d0acbd263ec7 | 196 | matrixPtr->Cn = (screenPtr[2].x * displayPtr[1].x - screenPtr[1].x * displayPtr[2].x) * screenPtr[0].y + |
frankvnk | 2:d0acbd263ec7 | 197 | (screenPtr[0].x * displayPtr[2].x - screenPtr[2].x * displayPtr[0].x) * screenPtr[1].y + |
frankvnk | 2:d0acbd263ec7 | 198 | (screenPtr[1].x * displayPtr[0].x - screenPtr[0].x * displayPtr[1].x) * screenPtr[2].y ; |
frankvnk | 2:d0acbd263ec7 | 199 | // (Yd0 - Yd2)*(Ys1 - Ys2) - (Yd1 - Yd2)*(Ys0 - Ys2) |
frankvnk | 2:d0acbd263ec7 | 200 | // D = --------------------------------------------------- |
frankvnk | 2:d0acbd263ec7 | 201 | // K |
frankvnk | 2:d0acbd263ec7 | 202 | matrixPtr->Dn = ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].y - screenPtr[2].y)) - |
frankvnk | 2:d0acbd263ec7 | 203 | ((displayPtr[1].y - displayPtr[2].y) * (screenPtr[0].y - screenPtr[2].y)) ; |
frankvnk | 2:d0acbd263ec7 | 204 | // (Xs0 - Xs2)*(Yd1 - Yd2) - (Yd0 - Yd2)*(Xs1 - Xs2) |
frankvnk | 2:d0acbd263ec7 | 205 | // E = --------------------------------------------------- |
frankvnk | 2:d0acbd263ec7 | 206 | // K |
frankvnk | 2:d0acbd263ec7 | 207 | matrixPtr->En = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].y - displayPtr[2].y)) - |
frankvnk | 2:d0acbd263ec7 | 208 | ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].x - screenPtr[2].x)) ; |
frankvnk | 2:d0acbd263ec7 | 209 | // Ys0*(Xs2*Yd1 - Xs1*Yd2) + Ys1*(Xs0*Yd2 - Xs2*Yd0) + Ys2*(Xs1*Yd0 - Xs0*Yd1) |
frankvnk | 2:d0acbd263ec7 | 210 | // F = ---------------------------------------------------------------------------- |
frankvnk | 2:d0acbd263ec7 | 211 | // K |
frankvnk | 2:d0acbd263ec7 | 212 | matrixPtr->Fn = (screenPtr[2].x * displayPtr[1].y - screenPtr[1].x * displayPtr[2].y) * screenPtr[0].y + |
frankvnk | 2:d0acbd263ec7 | 213 | (screenPtr[0].x * displayPtr[2].y - screenPtr[2].x * displayPtr[0].y) * screenPtr[1].y + |
frankvnk | 2:d0acbd263ec7 | 214 | (screenPtr[1].x * displayPtr[0].y - screenPtr[0].x * displayPtr[1].y) * screenPtr[2].y ; |
frankvnk | 2:d0acbd263ec7 | 215 | } |
frankvnk | 2:d0acbd263ec7 | 216 | return( retTHRESHOLD ) ; |
frankvnk | 2:d0acbd263ec7 | 217 | } |
frankvnk | 2:d0acbd263ec7 | 218 | |
frankvnk | 2:d0acbd263ec7 | 219 | uint8_t TouchScreenADS7843::getDisplayPoint(void) |
frankvnk | 2:d0acbd263ec7 | 220 | { |
frankvnk | 2:d0acbd263ec7 | 221 | uint8_t retTHRESHOLD = 0 ; |
frankvnk | 2:d0acbd263ec7 | 222 | |
frankvnk | 2:d0acbd263ec7 | 223 | if( matrix.Divider != 0 ) |
frankvnk | 2:d0acbd263ec7 | 224 | { |
frankvnk | 2:d0acbd263ec7 | 225 | // XD = AX+BY+C |
frankvnk | 2:d0acbd263ec7 | 226 | display.x = ( (matrix.An * screen.x) + |
frankvnk | 2:d0acbd263ec7 | 227 | (matrix.Bn * screen.y) + |
frankvnk | 2:d0acbd263ec7 | 228 | matrix.Cn |
frankvnk | 2:d0acbd263ec7 | 229 | ) / matrix.Divider ; |
frankvnk | 2:d0acbd263ec7 | 230 | // YD = DX+EY+F |
frankvnk | 2:d0acbd263ec7 | 231 | display.y = ( (matrix.Dn * screen.x) + |
frankvnk | 2:d0acbd263ec7 | 232 | (matrix.En * screen.y) + |
frankvnk | 2:d0acbd263ec7 | 233 | matrix.Fn |
frankvnk | 2:d0acbd263ec7 | 234 | ) / matrix.Divider ; |
frankvnk | 2:d0acbd263ec7 | 235 | } |
frankvnk | 2:d0acbd263ec7 | 236 | else |
frankvnk | 2:d0acbd263ec7 | 237 | { |
frankvnk | 2:d0acbd263ec7 | 238 | retTHRESHOLD = 1; |
frankvnk | 2:d0acbd263ec7 | 239 | } |
frankvnk | 2:d0acbd263ec7 | 240 | return(retTHRESHOLD); |
frankvnk | 2:d0acbd263ec7 | 241 | } |
frankvnk | 2:d0acbd263ec7 | 242 | |
frankvnk | 2:d0acbd263ec7 | 243 | void TouchScreenADS7843::TouchPanel_Calibrate(void) |
frankvnk | 2:d0acbd263ec7 | 244 | { |
frankvnk | 2:d0acbd263ec7 | 245 | uint8_t i; |
frankvnk | 2:d0acbd263ec7 | 246 | Coordinate screen_cal; |
frankvnk | 2:d0acbd263ec7 | 247 | setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix) ; |
frankvnk | 3:fb4d62b5ffb3 | 248 | LCD->set_font((unsigned char*) Arial12x12); |
frankvnk | 2:d0acbd263ec7 | 249 | for(i=0;i<3;i++) |
frankvnk | 2:d0acbd263ec7 | 250 | { |
frankvnk | 3:fb4d62b5ffb3 | 251 | LCD->cls(); |
frankvnk | 3:fb4d62b5ffb3 | 252 | LCD->locate(10,10); |
frankvnk | 3:fb4d62b5ffb3 | 253 | LCD->printf("Touch crosshair to calibrate"); |
frankvnk | 2:d0acbd263ec7 | 254 | wait_ms(500); |
frankvnk | 2:d0acbd263ec7 | 255 | DrawCross(DisplaySample[i].x,DisplaySample[i].y); |
frankvnk | 22:9d05a7e6dc9d | 256 | do {} while (!Read_Ads7843(&screen_cal)); |
frankvnk | 2:d0acbd263ec7 | 257 | ScreenSample[i].x= screen_cal.x;ScreenSample[i].y= screen_cal.y; |
frankvnk | 2:d0acbd263ec7 | 258 | } |
frankvnk | 2:d0acbd263ec7 | 259 | setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix) ; |
frankvnk | 3:fb4d62b5ffb3 | 260 | LCD->cls(); |
frankvnk | 2:d0acbd263ec7 | 261 | } |
frankvnk | 2:d0acbd263ec7 | 262 | |
frankvnk | 21:a3a843d09295 | 263 | void TouchScreenADS7843::GetCalibration(Matrix * matrixPtr, Coordinate * screenPtr) |
frankvnk | 21:a3a843d09295 | 264 | { |
frankvnk | 21:a3a843d09295 | 265 | uint8_t i; |
frankvnk | 21:a3a843d09295 | 266 | Matrix * mp1; |
frankvnk | 21:a3a843d09295 | 267 | mp1 = &matrix; |
frankvnk | 21:a3a843d09295 | 268 | *matrixPtr = *mp1; |
frankvnk | 21:a3a843d09295 | 269 | for(i=0;i<3;i++) |
frankvnk | 21:a3a843d09295 | 270 | { |
frankvnk | 21:a3a843d09295 | 271 | screenPtr[i].x = ScreenSample[i].x; |
frankvnk | 21:a3a843d09295 | 272 | screenPtr[i].y = ScreenSample[i].y; |
frankvnk | 21:a3a843d09295 | 273 | } |
frankvnk | 21:a3a843d09295 | 274 | } |
frankvnk | 20:5feb12e3801f | 275 | |
frankvnk | 21:a3a843d09295 | 276 | void TouchScreenADS7843::SetCalibration(Matrix * matrixPtr, Coordinate * screenPtr) |
frankvnk | 21:a3a843d09295 | 277 | { |
frankvnk | 21:a3a843d09295 | 278 | uint8_t i; |
frankvnk | 21:a3a843d09295 | 279 | Matrix * mp1; |
frankvnk | 21:a3a843d09295 | 280 | mp1 = &matrix; |
frankvnk | 21:a3a843d09295 | 281 | *mp1 = *matrixPtr; |
frankvnk | 21:a3a843d09295 | 282 | for(i=0;i<3;i++) |
frankvnk | 21:a3a843d09295 | 283 | { |
frankvnk | 21:a3a843d09295 | 284 | ScreenSample[i].x = screenPtr[i].x; |
frankvnk | 21:a3a843d09295 | 285 | ScreenSample[i].y = screenPtr[i].y; |
frankvnk | 21:a3a843d09295 | 286 | } |
frankvnk | 21:a3a843d09295 | 287 | setCalibrationMatrix( &DisplaySample[0],&ScreenSample[0],&matrix) ; |
frankvnk | 21:a3a843d09295 | 288 | } |