drv_touch_scr.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 277 行

C
277
字号
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2007
 *
 *    File name   : drv_touch_scr.c
 *    Description : Touchscreen driver module
 *
 *    History :
 *    1. Date        : 14 May, 2007
 *       Author      : Stanimir Bonev
 *       Description : Create
 *
 *    $Revision: 1.2 $
 **************************************************************************/
#include "drv_touch_scr.h"

volatile Boolean Touch,TouchResReady,AcquireTo;
volatile Int16U  X,Y;

/*************************************************************************
 * Function Name: Gpt2_Handler
 * Parameters: none
 *
 * Return: none
 *
 * Description: GPT2 interrupt handler
 *
 *************************************************************************/
void Gpt2_Handler (void)
{
  LED_STAT1_ON();
  // Disable Timer
  TCTL2_bit.TEN = 0;
  // Clear interrupt flag
  TSTAT2_bit.COMP = 1;
  // set flag
  AcquireTo = TRUE;
  LED_STAT1_OFF();
}

/*************************************************************************
 * Function Name: Touch_Handler
 * Parameters: none
 *
 * Return: none
 *
 * Description: Touchscreen interrupt handler
 *
 *************************************************************************/
void Touch_Handler (void)
{
Int32U IntrStat = PTE_ISR;
  // interrupt from the touchscreen controller
  Touch = TRUE;
  // disable PE.10 interrupt
  PTE_IMR_bit.PIN10 = 0;
  // clear the interrupt flag
  PTE_ISR = IntrStat;
}

/*************************************************************************
 * Function Name: AD7873_Transfer
 * Parameters: Int32U Data
 *
 * Return: Int32U
 *
 * Description: Send a data by SPI1 and return the received data from SPI1
 *
 *************************************************************************/
Int32U AD7873_Transfer(Int32U Data)
{
  // send 6 bit of command
  CONTROLREG1_bit.BIT_COUNT = 6-1;
  // Set pin level - 0
  PTD_DR_bit.PIN28 = 0;
  // load data into FIFO
  TXDATAREG1 = Data>>2;
  // data ready to send
  CONTROLREG1_bit.XCH = 1;
  // Wait acquire time 100 us
  // clear flag
  AcquireTo = FALSE;
  // Starting timer
  TCTL2_bit.TEN = 1;
  while(!AcquireTo);
  Data = RXDATAREG1;
  // send 18 bit of command
  CONTROLREG1_bit.BIT_COUNT = 18-1;
  TXDATAREG1 = 0;
  // data ready to send
  CONTROLREG1_bit.XCH = 1;
  while(!INTREG1_bit.RR);
  Data = RXDATAREG1;
  // Set pin level - 1
  PTD_DR_bit.PIN28 = 1;
  Data >>= 3;
  return(Data & 0x1FFF);
}

/*************************************************************************
 * Function Name: TouchScrInit
 * Parameters: none
 *
 * Return: Int32U 1 - pass
 *                0 - fault
 *
 * Description: Init SPI, Ad7873 and PE10 intr by falling edge
 *
 *************************************************************************/
Int32U TouchScrInit (void)
{
Int32U Id;
  // Init variable
  TouchResReady = Touch = FALSE;
  X = Y = 0;
  // Init GPT2 - define acquire time ~100us
  PCCR1_bit.GPT2_EN = 1;
  // Timer disable
  TCTL2_bit.TEN = 0;
  // clear tmr counter when time is disable
  TCTL2_bit.CC = 1;
  // Timer clock source PERCLK1 ~ 16MHz
  TCTL2_bit.CLKSOURCE = 1;
  // Comparator interrupt enable
  TCTL2_bit.COMP_EN = 1;
  // Set prescaler
  TPRER2_bit.PRESCALER = 0;
  // Set compare period ACQUIRE_DLY [us]
  TCMP2 = MPLL_CLK / (PERDIV1 * (1000000 / ACQUIRE_DLY));
  // Clear interrupt flag
  TSTAT2_bit.COMP = 1;
  // Init AITC GPT2 interrupt
  AITC_SetupIntr(Gpt2_Handler,FALSE,INT_GPT2,5);
  AITC_EnableIntSource(INT_GPT2);

  // PD31 assign to CSPI1 MOSI
  PTD_GIUS_bit.PIN31 = 0;PTD_GPR_bit.PIN31 = 0;
  // PD30 assign to CSPI1 MISO
  PTD_GIUS_bit.PIN30 = 0;PTD_GPR_bit.PIN30 = 0;
  // PD29 assign to CSPI1 CLK
  PTD_GIUS_bit.PIN29 = 0;PTD_GPR_bit.PIN29 = 0;
  // PD28 is GPIO
  PTD_GIUS_bit.PIN28 = 1;
  // Connect to data register
  PTD_OCR2_bit.PIN28 = 3;
  // Set direction - output
  PTD_DDIR_bit.PIN28 = 1;
  // Set pin level - 1
  PTD_DR_bit.PIN28 = 1;

  // Init PE10 input, GPIO
  PTE_DDIR_bit.PIN10 = 0; PTE_GIUS_bit.PIN10 = 0;
  // Enable SPI1 clock
  PCCR0_bit.CSPI1_EN = 1;
  // Set PERCLK2 divider  16.625MHz = MPLL_CLK / 16
  PCDR1_bit.PCLK_DIV2 = PERDIV2 - 1;
  // Init SPI POL, PHA = 0, MASTER, ~1MHz - /16, 24bit
  CONTROLREG1 = 0x00018C17;
  // Init Ad7873
  Id = AD7873_Transfer(AD7873_READ_ID);
  if(Id != AD7873_ID)
  {
    return(0);
  }
  // GPIO clock enable
  PCCR0_bit.GPIO_EN = 1;
  // flailing edge interrupt, clear interrupt
  PTE_ICR1_bit.PIN10 = 1; PTE_ISR_bit.PIN10 = 1;
  // Enable port E interrupts
  PMASK_bit.PTE = 1;
  // Init AITC
  AITC_SetupIntr(Touch_Handler,FALSE,INT_GPIO,7);
  AITC_EnableIntSource(INT_GPIO);
  // enable interrupt
  PTE_IMR_bit.PIN10 = 1;
  return(1);
}

/*************************************************************************
 * Function Name: TouchImp
 * Parameters: none
 *
 * Return: none
 *
 * Description: Implement touch - adc result filtering and set touch flag
 *
 *************************************************************************/
void TouchImp (void)
{
static Int32S MeasureCount = MEASURE_REPEAT*2;
static Int16U TouchTmp[MEASURE_REPEAT*2];
  if(Touch)
  {
    // check state of touch interrupt pin
    if(!PTE_SSR_bit.PIN10)
    {
      TouchTmp[--MeasureCount] = AD7873_Transfer(AD7873_READ_X);
      TouchTmp[--MeasureCount] = AD7873_Transfer(AD7873_READ_Y);
      if(MeasureCount == 0)
      {
        for(X = Y = 0; MeasureCount < MEASURE_REPEAT*2;)
        {
          X += TouchTmp[MeasureCount++];
          Y += TouchTmp[MeasureCount++];
        }
        X /= MEASURE_REPEAT;
        Y /= MEASURE_REPEAT;
        TouchResReady = TRUE;
      }
    }
    else
    {
      // Result is not valid
      TouchResReady =  Touch = FALSE;
      // clear pending interrupt
      PTE_ISR_bit.PIN10 = 1;
      // enable interrupt
      PTE_IMR_bit.PIN10 = 1;
      // Init filter
      MeasureCount = MEASURE_REPEAT*2;
    }
  }
}

/*************************************************************************
 * Function Name: TouchGet
 * Parameters: ToushRes_t * pData X,Y data
 *
 * Return: Int32U 0 - untouched
 *                1 - touched
 *
 * Description: Return current state of the touchscreen
 *
 *************************************************************************/
Boolean TouchGet (ToushRes_t * pData)
{
Boolean  TouchResReadyHold = TouchResReady;
Int32U X_coordinate, Y_coordinate;

  if(TouchResReadyHold)
  {
    X_coordinate = X;
    Y_coordinate = Y;
    // Calculate X coordinate in pixels
    if (X_coordinate <= LEFT_UP_X)
    {
      X_coordinate = 0;
    }
    else if (X_coordinate >= RIGHT_UP_X)
    {
      X_coordinate = IMAGE_WIDTH;
    }
    else
    {
      X_coordinate = ((X_coordinate - LEFT_UP_X) * IMAGE_WIDTH)/(RIGHT_UP_X-LEFT_UP_X);
    }
    // Calculate Y coordinate in pixels
    if (Y_coordinate <= LEFT_UP_Y)
    {
      Y_coordinate = 0;
    }
    else if (X_coordinate >= RIGHT_UP_Y)
    {
      Y_coordinate = IMAGE_HEIGHT;
    }
    else
    {
      Y_coordinate = ((Y_coordinate - LEFT_UP_Y) * IMAGE_HEIGHT)/(RIGHT_UP_Y-LEFT_UP_Y);
    }
    pData->X = X_coordinate;
    pData->Y = Y_coordinate;
  }
  return(TouchResReadyHold);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?