📄 touch.c
字号:
#include "config.h"
#include "regmap.h"
#include "memmap.h"
#include "global.h"
#include "sio.h"
#include "gpio.h"
#include "func.h"
#ifdef SUPPORT_TOUCH_SCREEN
#ifdef SUPPORT_GPIO_BUS_FUNCTION
#define TOUCH_CS (1 << 7)
#define TOUCH_CS_LOW (Bus2SetBit(TOUCH_CS, 0))
#define TOUCH_CS_HIGH (Bus2SetBit(TOUCH_CS, 1))
#define TOUCH_DCLK 24
#define TOUCH_DIN 48
#define TOUCH_DOUT 53
#define TOUCH_PENIRQ 54
#else
#ifdef TMLH_MODULE_626
#define TOUCH_CS 14
#define TOUCH_DCLK 26
#define TOUCH_DIN 23
#define TOUCH_DOUT 22
#define TOUCH_PENIRQ 21
#else
#define TOUCH_CS 23
#define TOUCH_DCLK 22
#define TOUCH_DIN 24
#define TOUCH_DOUT 53
#define TOUCH_PENIRQ 54
#endif
#define TOUCH_CS_LOW (GPIO_O_SET(TOUCH_CS, 0))
#define TOUCH_CS_HIGH (GPIO_O_SET(TOUCH_CS, 1))
#endif
#define TOUCH_BUSY 12 // Not used
#define TOUCH_DCLK_LOW (GPIO_O_SET(TOUCH_DCLK, 0))
#define TOUCH_DCLK_HIGH (GPIO_O_SET(TOUCH_DCLK, 1))
#define TOUCH_DIN_LOW (GPIO_O_SET(TOUCH_DIN, 0))
#define TOUCH_DIN_HIGH (GPIO_O_SET(TOUCH_DIN, 1))
#define TOUCH_DOUT_TEST (GPIO_I_GET(TOUCH_DOUT))
#define TOUCH_PENIRQ_TEST (GPIO_I_GET(TOUCH_PENIRQ))
#define TOUCH_BUSY_TEST (GPIO_I_GET(TOUCH_BUSY))
void TouchInitGPIO()
{
#ifdef SUPPORT_GPIO_BUS_FUNCTION
// Input mode
GPIO_G_SET(3, 0, (1 << (TOUCH_DOUT - 48)) | (1 << (TOUCH_PENIRQ - 48)));
// Output mode
GPIO_G_SET(1, 1, (1 << (TOUCH_DCLK - 16)));
GPIO_G_SET(3, 1, (1 << (TOUCH_DIN - 48)));
#elif defined(TMLH_MODULE_626)
// Input mode
GPIO_G_SET(1, 0, (1 << (TOUCH_DOUT - 16)) | (1 << (TOUCH_PENIRQ - 16)));
// Output mode
GPIO_G_SET(0, 1, (1 << (TOUCH_CS - 0)));
GPIO_G_SET(1, 1, (1 << (TOUCH_DCLK - 16)) | (1 << (TOUCH_DIN - 16)));
#else
// Input mode
GPIO_G_SET(3, 0, (1 << (TOUCH_DOUT - 48)) | (1 << (TOUCH_PENIRQ - 48)));
// Output mode
GPIO_G_SET(1, 1, (1 << (TOUCH_CS - 16)) | (1 << (TOUCH_DCLK - 16)) |
(1 << (TOUCH_DIN - 16)));
#endif
TOUCH_CS_HIGH;
}
BYTE TouchOneByte(BYTE SendData)
{
BYTE ReadData = 0;
BYTE BitMap;
BYTE i;
BitMap = 0x80;
for (i = 0; i < 8; i++) {
if (SendData & BitMap) { TOUCH_DIN_HIGH; }
else { TOUCH_DIN_LOW; }
TOUCH_DCLK_HIGH;
BitMap >>= 1;
MicroDelay(100);
ReadData <<= 1;
if (TOUCH_DOUT_TEST)
ReadData |= 0x01;
TOUCH_DCLK_LOW;
}
return ReadData;
}
#define BIT_S (0x01 << 7)
#define BIT_ADDR_X (0x01 << 4)
#define BIT_ADDR_Y (0x05 << 4)
#define BIT_MODE (0x00 << 3) /* 12-Bit */
#define BIT_SGL (0x01 << 2)
#define BIT_DIF (0x00 << 2)
#define BIT_PD (0x00 << 0)
#define CTRL_BYTE_X BIT_S | BIT_ADDR_X | BIT_MODE | BIT_SGL | BIT_PD
#define CTRL_BYTE_Y BIT_S | BIT_ADDR_Y | BIT_MODE | BIT_SGL | BIT_PD
const BYTE ControlByte[2] = { CTRL_BYTE_X, CTRL_BYTE_Y, };
UINT32 TouchPosition()
{
UINT16 Data[2];
UINT16 Data1, Data2;
BYTE DataHi;
BYTE DataLo;
BYTE i;
BYTE Try;
TOUCH_DCLK_LOW;
TOUCH_CS_LOW;
for (i = 0; i < 2; i++) {
Data1 = (UINT16)-1;
Try = 0;
while (1) {
if (TOUCH_PENIRQ_TEST || ++Try > 10 /* 100 */) {
TOUCH_CS_HIGH;
return (UINT32)-1;
}
Data2 = Data1;
TouchOneByte(ControlByte[i]);
MicroDelay(2000);
DataHi = TouchOneByte(0);
DataLo = TouchOneByte(0);
Data1 = (DataHi << 8) | DataLo;
if (Data1 == Data2) {
MicroDelay(2000);
break;
}
}
Data[i] = Data1 >> 3;
}
TOUCH_CS_HIGH;
return ((Data[0] << 16) | Data[1]);
}
void TouchStartTimer()
{
if (TouchForbid) TouchForbid--;
}
UINT16 TouchX = (UINT16)(-1);
UINT16 TouchY = (UINT16)(-1);
#define TSCR_ZONE_MIN_X (348)
#define TSCR_ZONE_MIN_Y (320)
#define TSCR_ZONE_MAX_X (3800)
#define TSCR_ZONE_MAX_Y (3600)
#define TSCR_ZONE_WIDTH (TSCR_ZONE_MAX_X - TSCR_ZONE_MIN_X + 1)
#define TSCR_ZONE_HEIGHT (TSCR_ZONE_MAX_Y - TSCR_ZONE_MIN_Y + 1)
void PollingTouchScreen()
{
UINT32 Data;
UINT16 DataX, DataY;
if (TouchForbid) return;
if (!TOUCH_PENIRQ_TEST) {
Data = TouchPosition();
if (Data != (UINT32)(-1)) {
DataX = (Data >> 16) & 0x0fff;
DataY = Data & 0x0fff;
if (TouchX == (UINT16)(-1)) {
TouchX = DataX;
TouchY = DataY;
return;
}
TouchX = DataX;
TouchY = DataY;
}
}
else if (TouchX != (UINT16)(-1) && TouchY != (UINT16)(-1)) {
if (TouchX < TSCR_ZONE_MIN_X) TouchX = TSCR_ZONE_MIN_X;
if (TouchY < TSCR_ZONE_MIN_Y) TouchY = TSCR_ZONE_MIN_Y;
if (TouchX > TSCR_ZONE_MAX_X) TouchX = TSCR_ZONE_MAX_X;
if (TouchY > TSCR_ZONE_MAX_Y) TouchY = TSCR_ZONE_MAX_Y;
TouchX = TouchX - TSCR_ZONE_MIN_X;
TouchY = TSCR_ZONE_MAX_Y - TouchY;
TouchX = TouchX * TSCR_MAP_WIDTH / TSCR_ZONE_WIDTH + TSCR_MAP_START_X;
TouchY = TouchY * TSCR_MAP_HEIGHT / TSCR_ZONE_HEIGHT + TSCR_MAP_START_Y;
TouchScreen.x = TouchX;
TouchScreen.y = TouchY;
TouchScreenFlag = 1;
// psprintf(LineBuffer, "TOUCH : %04d-%04d", TouchX, TouchY);
// MenuPrintMessage(2);
TouchX = (UINT16)(-1);
TouchY = (UINT16)(-1);
}
}
#endif SUPPORT_TOUCH_SCREEN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -