4線抵抗皮膜式タッチパネル用
Dependents: 11U68_MP3Player with TFTLCD 11U68_MP3Player-with-TFTLCD
TouchPanel.cpp@2:2fe192777f79, 2015-07-24 (annotated)
- Committer:
- nameless129
- Date:
- Fri Jul 24 11:06:07 2015 +0000
- Revision:
- 2:2fe192777f79
- Parent:
- 1:851128b20cc1
change to O3
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nameless129 | 0:6f90e19b1902 | 1 | #include "TouchPanel.h" |
nameless129 | 0:6f90e19b1902 | 2 | |
nameless129 | 0:6f90e19b1902 | 3 | #define pin_YU (P0_14) |
nameless129 | 0:6f90e19b1902 | 4 | #define pin_XL (P1_27) |
nameless129 | 0:6f90e19b1902 | 5 | #define pin_YD (P1_25) |
nameless129 | 0:6f90e19b1902 | 6 | #define pin_XR (P0_13) |
nameless129 | 0:6f90e19b1902 | 7 | |
nameless129 | 0:6f90e19b1902 | 8 | uint16_t readTouchPanelX_Analog() |
nameless129 | 0:6f90e19b1902 | 9 | { |
nameless129 | 0:6f90e19b1902 | 10 | uint16_t tmp = 0; |
nameless129 | 0:6f90e19b1902 | 11 | //change to Pinmode for TouchPanelRead |
nameless129 | 0:6f90e19b1902 | 12 | DigitalOut TouchPanel_WRtoYU(pin_YU); |
nameless129 | 0:6f90e19b1902 | 13 | DigitalOut TouchPanel_D7toYD(pin_YD); |
nameless129 | 0:6f90e19b1902 | 14 | DigitalIn TouchPanel_D6toXL(pin_XL); //require Hi-Z |
nameless129 | 0:6f90e19b1902 | 15 | AnalogIn TouchPanel_RStoXR(pin_XR); //X position read |
nameless129 | 0:6f90e19b1902 | 16 | |
nameless129 | 0:6f90e19b1902 | 17 | TouchPanel_WRtoYU = 1; //require VDD |
nameless129 | 0:6f90e19b1902 | 18 | TouchPanel_D7toYD = 0; //require VSS |
nameless129 | 1:851128b20cc1 | 19 | wait_us(100); |
nameless129 | 0:6f90e19b1902 | 20 | tmp = TouchPanel_RStoXR.read_u16(); //read X touch position |
nameless129 | 0:6f90e19b1902 | 21 | |
nameless129 | 0:6f90e19b1902 | 22 | //revert to DigitalOut |
nameless129 | 0:6f90e19b1902 | 23 | DigitalOut TouchPanel_YUtoWR(pin_YU); |
nameless129 | 0:6f90e19b1902 | 24 | DigitalOut TouchPanel_YDtoD7(pin_YD); |
nameless129 | 0:6f90e19b1902 | 25 | DigitalOut TouchPanel_XLtoD6(pin_XL); |
nameless129 | 0:6f90e19b1902 | 26 | DigitalOut TouchPanel_XRtoRS(pin_XR); |
nameless129 | 0:6f90e19b1902 | 27 | |
nameless129 | 0:6f90e19b1902 | 28 | return tmp; |
nameless129 | 0:6f90e19b1902 | 29 | } |
nameless129 | 0:6f90e19b1902 | 30 | |
nameless129 | 0:6f90e19b1902 | 31 | uint16_t readTouchPanelY_Analog() |
nameless129 | 0:6f90e19b1902 | 32 | { |
nameless129 | 0:6f90e19b1902 | 33 | uint16_t tmp = 0; |
nameless129 | 0:6f90e19b1902 | 34 | //change to Pinmode for TouchPanelRead |
nameless129 | 0:6f90e19b1902 | 35 | DigitalOut TouchPanel_RStoXR(pin_XR); |
nameless129 | 0:6f90e19b1902 | 36 | DigitalOut TouchPanel_D6toXL(pin_XL); |
nameless129 | 0:6f90e19b1902 | 37 | DigitalIn TouchPanel_D7toYD(pin_YD); //require Hi-Z |
nameless129 | 0:6f90e19b1902 | 38 | AnalogIn TouchPanel_WRtoYU(pin_YU); //Y position read |
nameless129 | 0:6f90e19b1902 | 39 | |
nameless129 | 0:6f90e19b1902 | 40 | TouchPanel_D6toXL = 1; //require VDD |
nameless129 | 0:6f90e19b1902 | 41 | TouchPanel_RStoXR = 0; //require VSS |
nameless129 | 1:851128b20cc1 | 42 | wait_us(100); |
nameless129 | 0:6f90e19b1902 | 43 | tmp = TouchPanel_WRtoYU.read_u16(); //read Y touch position |
nameless129 | 0:6f90e19b1902 | 44 | |
nameless129 | 0:6f90e19b1902 | 45 | //revert to DigitalOut |
nameless129 | 0:6f90e19b1902 | 46 | DigitalOut TouchPanel_XRtoRS(pin_XR); |
nameless129 | 0:6f90e19b1902 | 47 | DigitalOut TouchPanel_XLtoD6(pin_XL); |
nameless129 | 0:6f90e19b1902 | 48 | DigitalOut TouchPanel_YDtoD7(pin_YD); |
nameless129 | 0:6f90e19b1902 | 49 | DigitalOut TouchPanel_YUtoWR(pin_YU); |
nameless129 | 0:6f90e19b1902 | 50 | |
nameless129 | 0:6f90e19b1902 | 51 | return tmp; |
nameless129 | 0:6f90e19b1902 | 52 | } |
nameless129 | 0:6f90e19b1902 | 53 | |
nameless129 | 0:6f90e19b1902 | 54 | |
nameless129 | 0:6f90e19b1902 | 55 | /* int32_t getTouchPanelPosX(uint16_t ad_x) */ |
nameless129 | 0:6f90e19b1902 | 56 | /* argument */ |
nameless129 | 0:6f90e19b1902 | 57 | /* uint16_t ad_x:TouchPanel ADC X axis value */ |
nameless129 | 0:6f90e19b1902 | 58 | /* retuen -1:not touch TouchPanel */ |
nameless129 | 0:6f90e19b1902 | 59 | /* positive integer(0~TOUCHPANEL_X_MAX_SIZE):touch position X axis */ |
nameless129 | 0:6f90e19b1902 | 60 | int32_t getTouchPanelPosX() |
nameless129 | 0:6f90e19b1902 | 61 | { |
nameless129 | 0:6f90e19b1902 | 62 | #define TOUCHPANEL_X_MAX_SIZE (320) //touchPanel axis X max size |
nameless129 | 0:6f90e19b1902 | 63 | #define CALIB_TOUCH_X1_POSITION (40) //touchPanel X position1(0~TOUCHPANEL_X_MAX_SIZE) |
nameless129 | 0:6f90e19b1902 | 64 | #define CALIB_TOUCH_X1_AD_VALUE (14700) //X1 position touch ADCvalue |
nameless129 | 0:6f90e19b1902 | 65 | #define CALIB_TOUCH_X2_POSITION (280) //touchPanel X position2(0~TOUCHPANEL_X_MAX_SIZE) |
nameless129 | 0:6f90e19b1902 | 66 | #define CALIB_TOUCH_X2_AD_VALUE (50800) //X2 position touch ADCvalue |
nameless129 | 0:6f90e19b1902 | 67 | |
nameless129 | 0:6f90e19b1902 | 68 | uint16_t ad_x = readTouchPanelX_Analog(); |
nameless129 | 0:6f90e19b1902 | 69 | |
nameless129 | 0:6f90e19b1902 | 70 | //Calculate scale factor for "touch ADC value" to "TouchPanel X Position" |
nameless129 | 0:6f90e19b1902 | 71 | const uint16_t COEF_CONV_X_POS = abs(CALIB_TOUCH_X1_AD_VALUE - CALIB_TOUCH_X2_AD_VALUE) / |
nameless129 | 0:6f90e19b1902 | 72 | abs(CALIB_TOUCH_X1_POSITION - CALIB_TOUCH_X2_POSITION); |
nameless129 | 0:6f90e19b1902 | 73 | |
nameless129 | 0:6f90e19b1902 | 74 | //Calculate minimum touch AD value for not touch TouchPanel |
nameless129 | 0:6f90e19b1902 | 75 | const uint16_t MINIMUM_AD_X_VALUE = CALIB_TOUCH_X1_AD_VALUE - ( (CALIB_TOUCH_X1_POSITION - 0) * COEF_CONV_X_POS); |
nameless129 | 0:6f90e19b1902 | 76 | int32_t calc_XPos = 0; |
nameless129 | 0:6f90e19b1902 | 77 | |
nameless129 | 0:6f90e19b1902 | 78 | if(ad_x <= MINIMUM_AD_X_VALUE) |
nameless129 | 0:6f90e19b1902 | 79 | { |
nameless129 | 0:6f90e19b1902 | 80 | calc_XPos = -1; |
nameless129 | 0:6f90e19b1902 | 81 | } |
nameless129 | 0:6f90e19b1902 | 82 | else if(ad_x >= CALIB_TOUCH_X1_AD_VALUE ) //if touch position upper then X1_POSITION |
nameless129 | 0:6f90e19b1902 | 83 | { |
nameless129 | 0:6f90e19b1902 | 84 | calc_XPos = CALIB_TOUCH_X1_POSITION + abs(CALIB_TOUCH_X1_AD_VALUE - ad_x)/COEF_CONV_X_POS; |
nameless129 | 0:6f90e19b1902 | 85 | } |
nameless129 | 0:6f90e19b1902 | 86 | else //if touch position lower then X1_POSITION |
nameless129 | 0:6f90e19b1902 | 87 | { |
nameless129 | 0:6f90e19b1902 | 88 | calc_XPos = CALIB_TOUCH_X1_POSITION - abs(CALIB_TOUCH_X1_AD_VALUE - ad_x)/COEF_CONV_X_POS; |
nameless129 | 0:6f90e19b1902 | 89 | } |
nameless129 | 0:6f90e19b1902 | 90 | |
nameless129 | 0:6f90e19b1902 | 91 | //If touch position over X_MAX_SIZE,to be treated as not touch TouchPanel |
nameless129 | 0:6f90e19b1902 | 92 | if(calc_XPos >= TOUCHPANEL_X_MAX_SIZE) |
nameless129 | 0:6f90e19b1902 | 93 | { |
nameless129 | 0:6f90e19b1902 | 94 | calc_XPos = -1; |
nameless129 | 0:6f90e19b1902 | 95 | } |
nameless129 | 0:6f90e19b1902 | 96 | return calc_XPos; |
nameless129 | 0:6f90e19b1902 | 97 | } |
nameless129 | 0:6f90e19b1902 | 98 | |
nameless129 | 0:6f90e19b1902 | 99 | /* int32_t getTouchPanelPosY(uint16_t ad_y) */ |
nameless129 | 0:6f90e19b1902 | 100 | /* argument */ |
nameless129 | 0:6f90e19b1902 | 101 | /* uint16_t ad_y:TouchPanel ADC Y axis value */ |
nameless129 | 0:6f90e19b1902 | 102 | /* retuen -1:not touch TouchPanel */ |
nameless129 | 0:6f90e19b1902 | 103 | /* positive integer(0~TOUCHPANEL_Y_MAX_SIZE):touch position Y axis */ |
nameless129 | 0:6f90e19b1902 | 104 | int32_t getTouchPanelPosY() |
nameless129 | 0:6f90e19b1902 | 105 | { |
nameless129 | 0:6f90e19b1902 | 106 | #define TOUCHPANEL_Y_MAX_SIZE (240) //touchPanel axis Y max size |
nameless129 | 0:6f90e19b1902 | 107 | #define CALIB_TOUCH_Y1_POSITION (40) //touchPanel Y position1(0~TOUCHPANEL_Y_MAX_SIZE) |
nameless129 | 0:6f90e19b1902 | 108 | #define CALIB_TOUCH_Y1_AD_VALUE (45000) //Y1 position touch ADCvalue |
nameless129 | 0:6f90e19b1902 | 109 | #define CALIB_TOUCH_Y2_POSITION (200) //touchPanel Y position2(0~TOUCHPANEL_Y_MAX_SIZE) |
nameless129 | 0:6f90e19b1902 | 110 | #define CALIB_TOUCH_Y2_AD_VALUE (16500) //Y2 position touch ADCvalue |
nameless129 | 0:6f90e19b1902 | 111 | |
nameless129 | 0:6f90e19b1902 | 112 | uint16_t ad_y = readTouchPanelY_Analog(); |
nameless129 | 0:6f90e19b1902 | 113 | |
nameless129 | 0:6f90e19b1902 | 114 | //Calculate scale factor for "touch ADC value" to "TouchPanel Y Position" |
nameless129 | 0:6f90e19b1902 | 115 | const uint16_t COEF_CONV_Y_POS = abs(CALIB_TOUCH_Y1_AD_VALUE - CALIB_TOUCH_Y2_AD_VALUE) / |
nameless129 | 0:6f90e19b1902 | 116 | abs(CALIB_TOUCH_Y1_POSITION - CALIB_TOUCH_Y2_POSITION); |
nameless129 | 0:6f90e19b1902 | 117 | |
nameless129 | 0:6f90e19b1902 | 118 | //Calculate minimum touch AD value for not touch TouchPanel |
nameless129 | 0:6f90e19b1902 | 119 | const uint16_t MINIMUM_AD_Y_VALUE = CALIB_TOUCH_Y2_AD_VALUE - ( (TOUCHPANEL_Y_MAX_SIZE - CALIB_TOUCH_Y2_POSITION) * COEF_CONV_Y_POS); |
nameless129 | 0:6f90e19b1902 | 120 | |
nameless129 | 0:6f90e19b1902 | 121 | int32_t calc_YPos = 0; |
nameless129 | 0:6f90e19b1902 | 122 | |
nameless129 | 0:6f90e19b1902 | 123 | if(ad_y <= MINIMUM_AD_Y_VALUE) |
nameless129 | 0:6f90e19b1902 | 124 | { |
nameless129 | 0:6f90e19b1902 | 125 | calc_YPos = -1; |
nameless129 | 0:6f90e19b1902 | 126 | } |
nameless129 | 0:6f90e19b1902 | 127 | else if(ad_y <= CALIB_TOUCH_Y1_AD_VALUE ) |
nameless129 | 0:6f90e19b1902 | 128 | { |
nameless129 | 0:6f90e19b1902 | 129 | calc_YPos = CALIB_TOUCH_Y1_POSITION + abs(CALIB_TOUCH_Y1_AD_VALUE - ad_y)/COEF_CONV_Y_POS; |
nameless129 | 0:6f90e19b1902 | 130 | } |
nameless129 | 0:6f90e19b1902 | 131 | else |
nameless129 | 0:6f90e19b1902 | 132 | { |
nameless129 | 0:6f90e19b1902 | 133 | calc_YPos = CALIB_TOUCH_Y1_POSITION - abs(CALIB_TOUCH_Y1_AD_VALUE - ad_y)/COEF_CONV_Y_POS; |
nameless129 | 0:6f90e19b1902 | 134 | } |
nameless129 | 0:6f90e19b1902 | 135 | |
nameless129 | 0:6f90e19b1902 | 136 | //If touch position over Y_MAX_SIZE,to be treated as not touch TouchPanel |
nameless129 | 0:6f90e19b1902 | 137 | if(calc_YPos >= TOUCHPANEL_Y_MAX_SIZE) |
nameless129 | 0:6f90e19b1902 | 138 | { |
nameless129 | 0:6f90e19b1902 | 139 | calc_YPos = -1; |
nameless129 | 0:6f90e19b1902 | 140 | } |
nameless129 | 0:6f90e19b1902 | 141 | return calc_YPos; |
nameless129 | 0:6f90e19b1902 | 142 | } |