4線抵抗皮膜式タッチパネル用

Dependents:   11U68_MP3Player with TFTLCD 11U68_MP3Player-with-TFTLCD

TouchPanel.cpp

Committer:
nameless129
Date:
2015-07-24
Revision:
2:2fe192777f79
Parent:
1:851128b20cc1

File content as of revision 2:2fe192777f79:

#include "TouchPanel.h"

#define pin_YU  (P0_14)
#define pin_XL  (P1_27)
#define pin_YD  (P1_25)
#define pin_XR  (P0_13)

uint16_t readTouchPanelX_Analog()
{
    uint16_t tmp = 0;
    //change to Pinmode for TouchPanelRead
    DigitalOut  TouchPanel_WRtoYU(pin_YU);
    DigitalOut  TouchPanel_D7toYD(pin_YD);
    DigitalIn   TouchPanel_D6toXL(pin_XL);  //require Hi-Z
    AnalogIn    TouchPanel_RStoXR(pin_XR);  //X position read

    TouchPanel_WRtoYU = 1;                  //require VDD
    TouchPanel_D7toYD = 0;                  //require VSS
    wait_us(100);
    tmp = TouchPanel_RStoXR.read_u16();    //read X touch position

    //revert to DigitalOut
    DigitalOut TouchPanel_YUtoWR(pin_YU);
    DigitalOut TouchPanel_YDtoD7(pin_YD);
    DigitalOut TouchPanel_XLtoD6(pin_XL);
    DigitalOut TouchPanel_XRtoRS(pin_XR);

    return tmp;
}

uint16_t readTouchPanelY_Analog()
{
    uint16_t tmp = 0;
    //change to Pinmode for TouchPanelRead
    DigitalOut  TouchPanel_RStoXR(pin_XR);
    DigitalOut  TouchPanel_D6toXL(pin_XL);
    DigitalIn   TouchPanel_D7toYD(pin_YD);  //require Hi-Z
    AnalogIn    TouchPanel_WRtoYU(pin_YU);  //Y position read

    TouchPanel_D6toXL = 1;                  //require VDD
    TouchPanel_RStoXR = 0;                  //require VSS
    wait_us(100);
    tmp = TouchPanel_WRtoYU.read_u16();    //read Y touch position

    //revert to DigitalOut
    DigitalOut TouchPanel_XRtoRS(pin_XR);
    DigitalOut TouchPanel_XLtoD6(pin_XL);
    DigitalOut TouchPanel_YDtoD7(pin_YD);
    DigitalOut TouchPanel_YUtoWR(pin_YU);

    return tmp;
}


/* int32_t getTouchPanelPosX(uint16_t ad_x)                                */
/* argument                                                                 */
/*    uint16_t ad_x:TouchPanel ADC X axis value                             */
/* retuen -1:not touch TouchPanel                                           */
/*        positive integer(0~TOUCHPANEL_X_MAX_SIZE):touch position X axis   */
int32_t getTouchPanelPosX()
{
#define TOUCHPANEL_X_MAX_SIZE   (320)       //touchPanel axis X max size
#define CALIB_TOUCH_X1_POSITION (40)        //touchPanel X position1(0~TOUCHPANEL_X_MAX_SIZE)
#define CALIB_TOUCH_X1_AD_VALUE (14700)     //X1 position touch ADCvalue
#define CALIB_TOUCH_X2_POSITION (280)       //touchPanel X position2(0~TOUCHPANEL_X_MAX_SIZE)
#define CALIB_TOUCH_X2_AD_VALUE (50800)     //X2 position touch ADCvalue

    uint16_t ad_x = readTouchPanelX_Analog();

    //Calculate scale factor for "touch ADC value" to "TouchPanel X Position"
    const uint16_t COEF_CONV_X_POS = abs(CALIB_TOUCH_X1_AD_VALUE - CALIB_TOUCH_X2_AD_VALUE) / 
                                       abs(CALIB_TOUCH_X1_POSITION - CALIB_TOUCH_X2_POSITION);

    //Calculate minimum touch AD value for not touch TouchPanel
    const uint16_t MINIMUM_AD_X_VALUE = CALIB_TOUCH_X1_AD_VALUE - ( (CALIB_TOUCH_X1_POSITION - 0) * COEF_CONV_X_POS);
    int32_t calc_XPos = 0;

    if(ad_x <= MINIMUM_AD_X_VALUE)
    {
        calc_XPos = -1;
    }
    else if(ad_x >= CALIB_TOUCH_X1_AD_VALUE )   //if touch position upper then X1_POSITION
    {
        calc_XPos = CALIB_TOUCH_X1_POSITION + abs(CALIB_TOUCH_X1_AD_VALUE - ad_x)/COEF_CONV_X_POS;
    }
    else                                        //if touch position lower then X1_POSITION
    {
        calc_XPos = CALIB_TOUCH_X1_POSITION - abs(CALIB_TOUCH_X1_AD_VALUE - ad_x)/COEF_CONV_X_POS;
    }

    //If touch position over X_MAX_SIZE,to be treated as not touch TouchPanel
    if(calc_XPos >= TOUCHPANEL_X_MAX_SIZE)
    {
        calc_XPos = -1;
    }
    return calc_XPos;
}

/* int32_t getTouchPanelPosY(uint16_t ad_y)                                */
/* argument                                                                 */
/*    uint16_t ad_y:TouchPanel ADC Y axis value                             */
/* retuen -1:not touch TouchPanel                                           */
/*        positive integer(0~TOUCHPANEL_Y_MAX_SIZE):touch position Y axis   */
int32_t getTouchPanelPosY()
{
#define TOUCHPANEL_Y_MAX_SIZE   (240)       //touchPanel axis Y max size
#define CALIB_TOUCH_Y1_POSITION (40)        //touchPanel Y position1(0~TOUCHPANEL_Y_MAX_SIZE)
#define CALIB_TOUCH_Y1_AD_VALUE (45000)     //Y1 position touch ADCvalue
#define CALIB_TOUCH_Y2_POSITION (200)       //touchPanel Y position2(0~TOUCHPANEL_Y_MAX_SIZE)
#define CALIB_TOUCH_Y2_AD_VALUE (16500)     //Y2 position touch ADCvalue

    uint16_t ad_y = readTouchPanelY_Analog();

    //Calculate scale factor for "touch ADC value" to "TouchPanel Y Position"
    const uint16_t COEF_CONV_Y_POS = abs(CALIB_TOUCH_Y1_AD_VALUE - CALIB_TOUCH_Y2_AD_VALUE) / 
                                       abs(CALIB_TOUCH_Y1_POSITION - CALIB_TOUCH_Y2_POSITION);

    //Calculate minimum touch AD value for not touch TouchPanel
    const uint16_t MINIMUM_AD_Y_VALUE = CALIB_TOUCH_Y2_AD_VALUE - ( (TOUCHPANEL_Y_MAX_SIZE - CALIB_TOUCH_Y2_POSITION) * COEF_CONV_Y_POS);
    
    int32_t calc_YPos = 0;

    if(ad_y <= MINIMUM_AD_Y_VALUE)
    {
        calc_YPos = -1;
    }
    else if(ad_y <= CALIB_TOUCH_Y1_AD_VALUE )
    {
        calc_YPos = CALIB_TOUCH_Y1_POSITION + abs(CALIB_TOUCH_Y1_AD_VALUE - ad_y)/COEF_CONV_Y_POS;
    }
    else
    {
        calc_YPos = CALIB_TOUCH_Y1_POSITION - abs(CALIB_TOUCH_Y1_AD_VALUE - ad_y)/COEF_CONV_Y_POS;
    }
    
    //If touch position over Y_MAX_SIZE,to be treated as not touch TouchPanel
    if(calc_YPos >= TOUCHPANEL_Y_MAX_SIZE)
    {
        calc_YPos = -1;
    }
    return calc_YPos;
}