drv_touch_scr.c
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 242 行
C
242 行
/*************************************************************************
*
* Used with ICCARM and AARM.
*
* (c) Copyright IAR Systems 2007
*
* File name : drv_touch_scr.c
* Description : Touch screen driver module
*
* History :
* 1. Date : May, 3 2007
* Author : Stanimir Bonev
* Description : Create
*
* $Revision: 1.2 $
**************************************************************************/
#include "drv_touch_scr.h"
volatile Boolean Touch;
volatile Int16U X,Y,Z;
/*************************************************************************
* Function Name: Gpt2_Handler
* Parameters: none
*
* Return: none
*
* Description: GPT2 interrupt handler
*
*************************************************************************/
void GPT2_Handler (void)
{
Int32U Data,Buffer[8];
// Clear interrupt flag
TSTAT2_bit.COMP = 1;
Data = Data_Transfer(0, ATLAS_INTR_STAT0, 0);
if(Data & 0x04)
{
// init measurement
// ADREFEN, ADREFMODE, TSMOD = 2, ADINC1, ADINC2
Data_Transfer(0x033400, ATLAS_ADC0, 1);
// clear interrupt
Data_Transfer(0x000005, ATLAS_INTR_STAT0, 1);
// start conversion
Data_Transfer(0x310409, ATLAS_ADC1, 1);
}
else if (Data & 0x01)
{
Data = Data_Transfer(0, ATLAS_ADC1, 0);
Data &= 0x0007e0;
Data |= 4UL << 8;
Data_Transfer(Data, ATLAS_ADC1, 1);
for(Int32U i = 0; i < 4; ++i)
{
Data = Data_Transfer(0, ATLAS_ADC2, 0);
Buffer[i] = (Data>> 2) & 0x3FF;
Buffer[i+4] = (Data>>14) & 0x3FF;
}
// get pressure
Z = Buffer[6] + Buffer[7];
if(Z > TS_MIN_PRESSURE)
{
LED1_ON();
// clear interrupt
Data_Transfer(0x000001, ATLAS_INTR_STAT0, 1);
// start conversion
Data_Transfer(0x310409, ATLAS_ADC1, 1);
// collect data
X = Buffer[0] + Buffer[1] + Buffer[2];
Y = Buffer[3] + Buffer[4] + Buffer[5];
Touch = TRUE;
}
else
{
LED1_OFF();
// init touch detection
// ADREFEN, ADREFMODE, TSMOD = 1
Data_Transfer(0x001C00, ATLAS_ADC0, 1);
// clear interrupt
Data_Transfer(0x00005, ATLAS_INTR_STAT0, 1);
// touch interrupt mode
Data_Transfer(0x210001, ATLAS_ADC1, 1);
Touch = FALSE;
}
}
}
/*************************************************************************
* Function Name: Data_Transfer
* Parameters: Int32U Data, Int8U Addr, Boolean Write
*
* Return: Int32U
*
* Description: Transfer data by CSPI1
*
*************************************************************************/
static
Int32U Data_Transfer(Int32U Data, Int8U Addr, Boolean Write)
{
Data = ((Write)?1UL<<31:0) |
((Int32U)(Addr & 0x3F)<<25) |
((Write)?(Data & 0x01FFFFFF):0);
CSPI1_TXDATA = Data;
// data ready to send
CSPI1_CONREG_bit.XCH = 1;
while(!CSPI1_STATREG_bit.RR || CSPI1_CONREG_bit.XCH);
Data = CSPI1_RXDATA;
return(Data & 0x00FFFFFF);
}
/*************************************************************************
* Function Name: TouchScrInit
* Parameters: none
*
* Return: none
*
* Description: Init Touch screen
*
*************************************************************************/
void TouchScrInit (void)
{
// Init variable
Touch = FALSE;
X = Y = 0;
// Init ATLAS
// Enable ATLAS
ATLAS_PWR_ON();
// Init SPI1
// 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 assign to CSPI1 SS0
PTD_GIUS_bit.PIN28 = 0;PTD_GPR_bit.PIN28 = 0;
// Enable CSPI1 clock
PCCR0_bit.CSPI1_EN = 1;
CSPI1_CONREG_bit.MODE = 1; // Master mode
CSPI1_CONREG_bit.POL = 0; // SPI mode 0
CSPI1_CONREG_bit.PHA = 0;
CSPI1_CONREG_bit.SSPOL = 1; // SS active high
CSPI1_CONREG_bit.DR_CTL = 0; // Ignore RDY signal
CSPI1_CONREG_bit.BIT_COUNT = 32-1; // 32 bit word
// SCLK < 20MHz (PER_CLK2/16)
CSPI1_CONREG_bit.DATARATE = 6;
CSPI1_CONREG_bit.CHIP_SELECT = 0; // select CS0
// Enable CSPI1
CSPI1_CONREG_bit.EN = 1;
// Init touch detection
// ADC assignment to Prim SPI
Data_Transfer(1UL << 12, ATLAS_ARBT_PER_AUDIO, 1);
// ADREFEN, ADREFMODE, TSMOD = 1 - Touch screen interrupt mode
Data_Transfer(0x001c00, ATLAS_ADC0, 1);
// clear interrupt
Data_Transfer(0xFFFFFF, ATLAS_INTR_STAT0, 1);
// touch interrupt mode
Data_Transfer(0x210001, ATLAS_ADC1, 1);
// Init GPT2 - define acquire time ~100us
PCCR0_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
TCTL2_bit.CLKSOURCE = 1;
// Set prescaler
TPRER2_bit.PRESCALER = 0;
// Set polling period 20us
TCMP2 = MPLL_CLK / ((PCDR1_bit.PERDIV1+1) * (1000000 / 20000));
// Clear interrupt flag
TSTAT2_bit.COMP = 1;
// Comparator interrupt enable
TCTL2_bit.COMP_EN = 1;
// Init GPT2 interrupt
AITC_SetupIntr(GPT2_Handler,FALSE,INT_GPT2,0);
AITC_EnableIntSource(INT_GPT2);
// Enable timer compare interrupt
TCTL2_bit.COMP_EN = 1;
// Timer enable
TCTL2_bit.TEN = 1;
}
/*************************************************************************
* Function Name: TouchScrGetStatus
* 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 = Touch;
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 + -
显示快捷键?