touch_scr.c

来自「NXP LPC系列AMR7的开发程序源码(LCD」· C语言 代码 · 共 266 行

C
266
字号
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2006
 *
 *    File name   : touch_scr.c
 *    Description : Driver for the ADS7843 touch screen
 *
 *    History :
 *    1. Date        : 19 May 2006
 *       Author      : Stanimir Bonev
 *       Description : Create
 *
 *    $Revision: 6827 $
 **************************************************************************/
#include "touch_scr.h"

volatile Int32U  X,Y;
volatile TouchScrState_t TouchScrState;
volatile Boolean TouchMeasureEnable;

/*************************************************************************
 * Function Name: Touch_PenHandler
 * Parameters: none
 *
 * Return: none
 *
 * Description: Touchscreen Pen interrupt handler
 *
 *************************************************************************/
static void Touch_PenHandler (void)
{
  // interrupt from the touchscreen controller (pen touch)
  TouchScrState = TS_MesureX1;
  // Disable interrupt
  IC_DisableInt(1<<IC_GPIO3INTR);
}

/*************************************************************************
 * Function Name: Dly_us
 * Parameters: unsigned long Dly
 *
 * Return: none
 *
 * Description: Delay for usec microSeconds base on Timer 3
 *
 * Notes: Max delay 17777 [us]
 *
 *************************************************************************/
#pragma location="ICODE"
static void Dly_us(unsigned long Dly)
{
register unsigned long long Count = (unsigned long long)TIMR3_INTR_CLK*Dly/1000000;

  if(Count > MAX_DELAY)
  {
    return;
  }
  TIMER_CONTROL3_bit.ENABLE = 0;  // Stop Timer 3 Count
  TIMER_CONTROL3_bit.MODE   = 1;  // Periodic
  // Set period
  TIMER_LOAD3_bit.LOAD      = Count;
  TIMER_TCEOI3 = 0;               // Clear interrupt flag
  TIMER_CONTROL3_bit.ENABLE = 1;  // Start Timer 3 Count
  while(!IC_INTRSR_bit.TC3OI);
  TIMER_CONTROL3_bit.ENABLE = 0;  // Stop Timer 3 Count
}

/*************************************************************************
 * Function Name: AD7843_Transfer
 * Parameters: Int32U Data
 *
 * Return: Int32U
 *
 * Description: Send a data by SPI1 and return the received data from SPI1
 *
 *************************************************************************/
Int32U ADS7843_Transfer(Int32U Data)
{
  CPLD_SPI_CTRL = 0;                    // Deassert all nCS
  // Send Data (fist 5 bits)
  CPLD_SPI_DATA = Data >> 3;            // Load data
  CPLD_SPI_CTRL = SPI_STCS | SPI_SPST;  // Start transition
  while(!(CPLD_SPI_CTRL & SPI_SPLD));   // Wait until data is loaded
  CPLD_SPI_CTRL &= ~SPI_SPST;
  while(!(CPLD_SPI_CTRL & SPI_SPDN));   // Wait until data is sanded
  // Wait Acquire time
  Dly_us(TC_ACQUIRE_TIME);
  // Send Data (last 3 bits)
  CPLD_SPI_DATA = Data << 5;            // Load data
  // Start transition
  CPLD_SPI_CTRL = SPI_STCS | SPI_SPST | SPI_SPRW;
  while(!(CPLD_SPI_CTRL & SPI_SPLD));   // Wait until data is loaded
  CPLD_SPI_CTRL &= ~SPI_SPST;
  while(!(CPLD_SPI_CTRL & SPI_SPDN));   // Wait until data is sanded

  // Receiving First 5 bit
  Data = CPLD_SPI_DATA << 8;
  // Receiving 5 -  11 bits
  CPLD_SPI_DATA = 0;
  CPLD_SPI_CTRL = SPI_STCS | SPI_SPST | SPI_SPRW;
  while(!(CPLD_SPI_CTRL & SPI_SPLD));
  CPLD_SPI_CTRL &= ~SPI_SPST;
  while(!(CPLD_SPI_CTRL & SPI_SPDN));
  Data |= CPLD_SPI_DATA;
  CPLD_SPI_CTRL = 0;                    // Deassert all nCS
  return(Data & 0xFFF);
}

/*************************************************************************
 * Function Name: TouchScrInit
 * Parameters: none
 *
 * Return: none
 *
 * Description: Init SPI and External interrupt - LOW-level triggered
 *
 *************************************************************************/
void TouchScrInit (void)
{
  // Init variable
  TouchScrState = TS_NotTouch;
  TouchMeasureEnable = FALSE;
  X = (Int32U)-1; // Invalid data
  // Acquire timer interrupt disable
  IC_DisableInt(1<<IC_TC3OI);
  // Init CPLD SPI
  ADS7843_Transfer(AD7843_READ_Y);
  // Pen Interrupt Init
  GPIO_PFDD_bit.Py3DIR = 0; // PF3 input
  GPIO_GPIODB_bit.F3   = 0; // Disable pin debouncing
  GPIO_INTTYPE1_bit.F3 = 0; // level sensitive
  GPIO_INTTYPE2_bit.F3 = 0; // LOW-level triggered
  GPIO_GPIOINTEN_bit.F3= 1; // Configures F3 as an External Interrupt
  // registered the interrupt handler of Touchscreen Pen
  // Set address of the handler
  IC_SetVectoredIRQ(Touch_PenHandler,IC_GPIO3INTR);
  // Enable Ext. interrupt
  CPLD_INTR_MASK = 0x00;  // Touch interrupt enable
  IC_EnableInt(1<<IC_GPIO3INTR);
}


/*************************************************************************
 * Function Name: TouchScrStartMesure
 * Parameters: none
 *
 * Return: none
 *
 * Description: Starting the measurement
 *
 *************************************************************************/
void TouchScrStartMesure (void)
{
  if(TouchScrState != TS_NotTouch)
  {
    TouchMeasureEnable = TRUE; // Enable measure
  }
}

/*************************************************************************
 * Function Name: TouchImp
 * Parameters: none
 *
 * Return: none
 *
 * Description: Implement touch - adc result filtering and set touch flag
 *
 *************************************************************************/
void TouchImp (void)
{
static Int32U X_coordinate, Y_coordinate;
  if(TouchMeasureEnable)
  {
    switch(TouchScrState)
    {
    case TS_MesureX1:
      X_coordinate = Y_coordinate = 0;
    case TS_MesureX2:
    case TS_MesureX3:
    case TS_MesureX4:
      // Get X data
      X_coordinate += ADS7843_Transfer(AD7843_READ_X);
      ++TouchScrState;  // Next state
      break;
    case TS_MesureY1:
    case TS_MesureY2:
    case TS_MesureY3:
    case TS_MesureY4:
      // Get Y data
      Y_coordinate += ADS7843_Transfer(AD7843_READ_Y);
      ++TouchScrState;  // Next state
      break;
    case TS_PenCheckLast:
      TouchMeasureEnable = FALSE;
      // Pan interrupt line setup time
      Dly_us(TC_PEN_INTR_ACQUIRE_TIME);
      if(!(CPLD_INTR_MASK & 2))
      {
        X = (X_coordinate >> 2) & 0xFFF;
        Y = (Y_coordinate >> 2) & 0xFFF;
        TouchScrState = TS_MesureX1;
        break;
      }
    default:
      X = (Int32U)-1; // Invalid data
      // return to Touch detection state
      TouchScrState = TS_NotTouch;
      IC_EnableInt(1<<IC_GPIO3INTR);
    }
  }
}

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

  if(X == (Int32U)-1) // Discard invalid data
  {
    return(FALSE);
  }
  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 = LCD_WIDTH;
  }
  else
  {
    X_coordinate = ((X_coordinate - LEFT_UP_X) * LCD_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 = LCD_HEIGHT;
  }
  else
  {
    Y_coordinate = ((Y_coordinate - LEFT_UP_Y) * LCD_HEIGHT)/(RIGHT_UP_Y-LEFT_UP_Y);
  }
  pData->X = LCD_WIDTH - X_coordinate;
  pData->Y = Y_coordinate;
  return(TRUE);
}

⌨️ 快捷键说明

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