📄 touch.c
字号:
//*****************************************************************************
//
// touch.c - Touch screen driver for the DK-LM3S9B92 board.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup touch_api
//! @{
//
//*****************************************************************************
#include "inc/hw_adc.h"
#include "inc/hw_gpio.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_timer.h"
#include "inc/hw_types.h"
#include "driverlib/adc.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "grlib/grlib.h"
#include "grlib/widget.h"
#include "drivers/touch.h"
#include "drivers/set_pinout.h"
#include "drivers/kitronix320x240x16_ssd2119_8bit.h"
//*****************************************************************************
//
// This driver operates in four different screen orientations. They are:
//
// * Portrait - The screen is taller than it is wide, and the flex connector is
// on the left of the display. This is selected by defining
// PORTRAIT.
//
// * Landscape - The screen is wider than it is tall, and the flex connector is
// on the bottom of the display. This is selected by defining
// LANDSCAPE.
//
// * Portrait flip - The screen is taller than it is wide, and the flex
// connector is on the right of the display. This is
// selected by defining PORTRAIT_FLIP.
//
// * Landscape flip - The screen is wider than it is tall, and the flex
// connector is on the top of the display. This is
// selected by defining LANDSCAPE_FLIP.
//
// These can also be imagined in terms of screen rotation; if portrait mode is
// 0 degrees of screen rotation, landscape is 90 degrees of counter-clockwise
// rotation, portrait flip is 180 degrees of rotation, and landscape flip is
// 270 degress of counter-clockwise rotation.
//
// If no screen orientation is selected, "landscape flip" mode will be used.
//
//*****************************************************************************
#if ! defined(PORTRAIT) && ! defined(PORTRAIT_FLIP) && \
! defined(LANDSCAPE) && ! defined(LANDSCAPE_FLIP)
#define PORTRAIT
#endif
//*****************************************************************************
//
// The GPIO pins to which the touch screen is connected.
//
//*****************************************************************************
#define TS_P_PERIPH SYSCTL_PERIPH_GPIOE
#define TS_P_BASE GPIO_PORTE_BASE
#define TS_N_PERIPH SYSCTL_PERIPH_GPIOE
#define TS_N_BASE GPIO_PORTE_BASE
#define TS_XP_PIN GPIO_PIN_6
#define TS_YP_PIN GPIO_PIN_7
#define TS_XN_PIN GPIO_PIN_2
#define TS_YN_PIN GPIO_PIN_3
//*****************************************************************************
//
// The ADC channels connected to each of the touch screen contacts.
//
//*****************************************************************************
#define ADC_CTL_CH_XP ADC_CTL_CH1
#define ADC_CTL_CH_YP ADC_CTL_CH0
//*****************************************************************************
//
// The coefficients used to convert from the ADC touch screen readings to the
// screen pixel positions.
//
//*****************************************************************************
#define NUM_TOUCH_PARAM_SETS 2
#define NUM_TOUCH_PARAMS 7
#define SET_NORMAL 0
#define SET_SRAM_FLASH 1
//*****************************************************************************
//
// Touchscreen calibration parameters. We store several sets since different
// LCD configurations require different calibration. Screen orientation is a
// build time selection but the calibration set used is determined at runtime
// based on the hardware configuration.
//
//*****************************************************************************
const long g_lTouchParameters[NUM_TOUCH_PARAM_SETS][NUM_TOUCH_PARAMS] =
{
//
// Touchscreen calibration parameters for use when no LCD-controlling
// daughter board is attached.
//
{
#ifdef PORTRAIT
-3200, // M0
-78080, // M1
78313600, // M2
-80760, // M3
5232, // M4
65998800, // M5
187100, // M6
#endif
#ifdef LANDSCAPE
86784, // M0
-1536, // M1
-17357952, // M2
-144, // M3
-78576, // M4
69995856, // M5
201804, // M6
#endif
#ifdef PORTRAIT_FLIP
-864, // M0
-79200, // M1
70274016, // M2
-85088, // M3
1056, // M4
80992576, // M5
199452, // M6
#endif
#ifdef LANDSCAPE_FLIP
-83328, // M0
1664, // M1
78919456, // M2
-336, // M3
80328, // M4
-22248408, // M5
198065, // M6
#endif
},
//
// Touchscreen calibration parameters for use when the SRAM/Flash daughter
// board is attached.
//
{
#ifdef PORTRAIT
-1152, // M0
94848, // M1
-5323392, // M2
107136, // M3
256, // M4
-5322624, // M5
300720, // M6
#endif
#ifdef LANDSCAPE
107776, // M0
1024, // M1
-7694016, // M2
-1104, // M3
-92904, // M4
76542840, // M5
296274, // M6
#endif
#ifdef PORTRAIT_FLIP
2496, // M0
-94368, // M1
74406768, // M2
-104000, // M3
-1600, // M4
100059200, // M5
290550, // M6
#endif
#ifdef LANDSCAPE_FLIP
-104576, // M0
-384, // M1
99041888, // M2
24, // M3
93216, // M4
-6681312, // M5
288475, // M6
#endif
},
};
//*****************************************************************************
//
// A pointer to the current touchscreen calibration parameter set.
//
//*****************************************************************************
const long *g_plParmSet;
//*****************************************************************************
//
// The minimum raw reading that should be considered valid press.
//
//*****************************************************************************
short g_sTouchMin = TOUCH_MIN;
//*****************************************************************************
//
// The current state of the touch screen driver's state machine. This is used
// to cycle the touch screen interface through the powering sequence required
// to read the two axes of the surface.
//
//*****************************************************************************
static unsigned long g_ulTSState;
#define TS_STATE_INIT 0
#define TS_STATE_READ_X 1
#define TS_STATE_READ_Y 2
#define TS_STATE_SKIP_X 3
#define TS_STATE_SKIP_Y 4
//*****************************************************************************
//
// The most recent raw ADC reading for the X position on the screen. This
// value is not affected by the selected screen orientation.
//
//*****************************************************************************
volatile short g_sTouchX;
//*****************************************************************************
//
// The most recent raw ADC reading for the Y position on the screen. This
// value is not affected by the selected screen orientation.
//
//*****************************************************************************
volatile short g_sTouchY;
//*****************************************************************************
//
// A pointer to the function to receive messages from the touch screen driver
// when events occur on the touch screen (debounced presses, movement while
// pressed, and debounced releases).
//
//*****************************************************************************
static long (*g_pfnTSHandler)(unsigned long ulMessage, long lX, long lY);
//*****************************************************************************
//
// The current state of the touch screen debouncer. When zero, the pen is up.
// When three, the pen is down. When one or two, the pen is transitioning from
// one state to the other.
//
//*****************************************************************************
static unsigned char g_cState = 0;
//*****************************************************************************
//
// The queue of debounced pen positions. This is used to slightly delay the
// returned pen positions, so that the pen positions that occur while the pen
// is being raised are not send to the application.
//
//*****************************************************************************
static short g_psSamples[8];
//*****************************************************************************
//
// The count of pen positions in g_psSamples. When negative, the buffer is
// being pre-filled as a result of a detected pen down event.
//
//*****************************************************************************
static signed char g_cIndex = 0;
//*****************************************************************************
//
//! Debounces presses of the touch screen.
//!
//! This function is called when a new X/Y sample pair has been captured in
//! order to perform debouncing of the touch screen.
//!
//! \return None.
//
//*****************************************************************************
static void
TouchScreenDebouncer(void)
{
long lX, lY, lTemp;
//
// Convert the ADC readings into pixel values on the screen.
//
lX = g_sTouchX;
lY = g_sTouchY;
lTemp = (((lX * g_plParmSet[0]) + (lY * g_plParmSet[1]) + g_plParmSet[2]) /
g_plParmSet[6]);
lY = (((lX * g_plParmSet[3]) + (lY * g_plParmSet[4]) + g_plParmSet[5]) /
g_plParmSet[6]);
lX = lTemp;
//
// See if the touch screen is being touched.
//
if((g_sTouchX < g_sTouchMin) || (g_sTouchY < g_sTouchMin))
{
//
// See if the pen is not up right now.
//
if(g_cState != 0x00)
{
//
// Decrement the state count.
//
g_cState--;
//
// See if the pen has been detected as up three times in a row.
//
if(g_cState == 0x80)
{
//
// Indicate that the pen is up.
//
g_cState = 0x00;
//
// See if there is a touch screen event handler.
//
if(g_pfnTSHandler)
{
//
// Send the pen up message to the touch screen event
// handler.
//
g_pfnTSHandler(WIDGET_MSG_PTR_UP, g_psSamples[g_cIndex],
g_psSamples[g_cIndex + 1]);
}
}
}
}
else
{
//
// See if the pen is not down right now.
//
if(g_cState != 0x83)
{
//
// Increment the state count.
//
g_cState++;
//
// See if the pen has been detected as down three times in a row.
//
if(g_cState == 0x03)
{
//
// Indicate that the pen is up.
//
g_cState = 0x83;
//
// Set the index to -8, so that the next 3 samples are stored
// into the sample buffer before sending anything back to the
// touch screen event handler.
//
g_cIndex = -8;
//
// Store this sample into the sample buffer.
//
g_psSamples[0] = lX;
g_psSamples[1] = lY;
}
}
else
{
//
// See if the sample buffer pre-fill has completed.
//
if(g_cIndex == -2)
{
//
// See if there is a touch screen event handler.
//
if(g_pfnTSHandler)
{
//
// Send the pen down message to the touch screen event
// handler.
//
g_pfnTSHandler(WIDGET_MSG_PTR_DOWN, g_psSamples[0],
g_psSamples[1]);
}
//
// Store this sample into the sample buffer.
//
g_psSamples[0] = lX;
g_psSamples[1] = lY;
//
// Set the index to the next sample to send.
//
g_cIndex = 2;
}
//
// Otherwise, see if the sample buffer pre-fill is in progress.
//
else if(g_cIndex < 0)
{
//
// Store this sample into the sample buffer.
//
g_psSamples[g_cIndex + 10] = lX;
g_psSamples[g_cIndex + 11] = lY;
//
// Increment the index.
//
g_cIndex += 2;
}
//
// Otherwise, the sample buffer is full.
//
else
{
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -