修改后的TSI程序如下:
TSIDrv.c
#include "TSIDrv.h"
#include "includes.h"
INT8U total_electrode = TOTAL_ELECTRODE;
INT8U elec_array[16]={ELECTRODE0,ELECTRODE1,ELECTRODE2,ELECTRODE3,ELECTRODE4,ELECTRODE5,                        ELECTRODE6,ELECTRODE7,ELECTRODE8,ELECTRODE9,ELECTRODE10,ELECTRODE11,
                                ELECTRODE12,ELECTRODE13,ELECTRODE14,ELECTRODE15};
INT16U gu16TSICount[16];
INT16U gu16Baseline[16];
INT16U gu16Threshold[16]={THRESHOLD0,THRESHOLD1,THRESHOLD2,THRESHOLD3,THRESHOLD4,THRESHOLD5,
                                THRESHOLD6,THRESHOLD7,THRESHOLD8,THRESHOLD9,THRESHOLD10,THRESHOLD11,
                                THRESHOLD12,THRESHOLD13,THRESHOLD14,THRESHOLD15};
INT16U gu16Delta[16];
INT16U ongoing_elec;
 
INT8U end_flag = TRUE;
INT8U j;
INT8U SliderPercentegePosition[3] = {NO_TOUCH,NO_TOUCH,NO_TOUCH};
INT8U SliderDistancePosition[3] = {NO_TOUCH,NO_TOUCH,NO_TOUCH};
INT16U AbsolutePercentegePosition = NO_TOUCH;
INT16U AbsoluteDistancePosition = NO_TOUCH;
 
void TSI_Init (void)
{
  SIM_SCGC5 |= SIM_SCGC5_TSI_MASK;  // Enable clock gating for TSI
  /* Enable proper GPIO as TSI channels */
  PORTB_PCR16 = PORT_PCR_MUX(0);   // PTB16 as TSI channel 9
  PORTB_PCR17 =  PORT_PCR_MUX(0);  // PTB17 as TSI channel 10
  PORTC_PCR0 =  PORT_PCR_MUX(0);   // PTB17 as TSI channel 13
  NVIC_DisableIRQ((IRQn_Type)TSI0_IRQn);
    
  TSI0_GENCS |= (TSI_GENCS_ESOR_MASK
                   | TSI_GENCS_MODE(0)
                   | TSI_GENCS_REFCHRG(4)
                   | TSI_GENCS_DVOLT(0)
                   | TSI_GENCS_EXTCHRG(7)  
                   | TSI_GENCS_PS(4)
                   | TSI_GENCS_NSCN(11)
                   | TSI_GENCS_TSIIEN_MASK 
                   | TSI_GENCS_STPE_MASK
                   //| TSI_GENCS_STM_MASK     //Trigger for the module 0=Sofware 
                   );
  
  TSI0_GENCS |= TSI_GENCS_TSIEN_MASK; 
  
  TSI_SelfCalibration();
}
 
void change_electrode(void)
{
    int16_t u16temp_delta;
    
    gu16TSICount[ongoing_elec] = (TSI0_DATA & TSI_DATA_TSICNT_MASK);          // Save Counts for current electrode
    u16temp_delta = gu16TSICount[ongoing_elec] - gu16Baseline[ongoing_elec];  // Obtains Counts Delta from callibration reference
    if( u16temp_delta < 0)
            gu16Delta[ongoing_elec] = 0;
    else
            gu16Delta[ongoing_elec] = u16temp_delta;
    
    if(total_electrode > 1)  //Change Electrode to Scan
    {
            if((total_electrode-1) > ongoing_elec) ongoing_elec++;
            else   ongoing_elec = 0;
            
            TSI0_DATA = ((elec_array[ongoing_elec]<<TSI_DATA_TSICH_SHIFT) );
            TSI0_DATA |= TSI_DATA_SWTS_MASK; 
    }
}
 
 
void TSI_Slider_LED(void )
{
     if(end_flag)
      {    
        end_flag = FALSE;
        if((gu16Delta[0] > gu16Threshold[0])||(gu16Delta[1] > gu16Threshold[1])||(gu16Delta[2] > gu16Threshold[2]))
         {
           if((gu16Delta[0] > gu16Threshold[0]))      j=1;
           if((gu16Delta[1] > gu16Threshold[1]))      j=2;
           if((gu16Delta[2] > gu16Threshold[2]))      j=3; 
              }
else
         {  j=6;
            SliderPercentegePosition[0] = NO_TOUCH;  
            SliderPercentegePosition[1] = NO_TOUCH; 
            SliderPercentegePosition[2] = NO_TOUCH;
            SliderDistancePosition[0] = NO_TOUCH; 
            SliderDistancePosition[1] = NO_TOUCH; 
            SliderDistancePosition[2] = NO_TOUCH; 
            AbsolutePercentegePosition = NO_TOUCH; 
            AbsoluteDistancePosition = NO_TOUCH; 
         }
      }
}     
 
 
void TSI0_IRQHandler(void)
{
  end_flag = TRUE;
  TSI0_GENCS |= TSI_GENCS_EOSF_MASK; // Clear End of Scan Flag
  change_electrode();
 
}