⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 touch.c

📁 C语言编写的监控中心终端程序。基于GPRS上传收发数据功能
💻 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 + -