📄 touch7843_44b0.c
字号:
/****************************************Copyright (c)**************************************************
** 广州微嵌计算机科技有限公司
**
** http://www.wqlcd.com
**
**------------------------------------------------------------------------------------------------------
** 创建人: 陈华牧
** 版 本: V1.0
** 创建日期:2007年1月18日
** 发布日期:2007年3月15日
********************************************************************************************************/
#include <string.h>
#include <stdlib.h>
#include "44B.h"
#include "Touch7843_44B0.h"
#include "lcd.h"
#include "24LCXX.h"
/*************************************************************************************/
/************************************* 软件设计思路 **********************************/
/* 利用定时器延时中断实现按键去抖动方法,这种方法的好处是极大程度地减少占用系统资源, */
/* 避免传统使用延时去抖动方法带来极大耗时的缺点.使用外中断EXINT1检测触摸屏是否按下, */
/* 提高触摸屏工作的实时性.工作过程: 按下触摸屏->EXINT1发生中断->开启定时器2->20ms后 */
/* 中断发生->将EXINT1引脚设为输入I/O,检测是否触摸屏按下或是抖动引起的中断->若是触摸屏*/
/* 被按下则设置EXINT1为上边缘触发->松开触摸屏->EXINT1中断..... */
/*************************************************************************************/
#define Timer2_Update (0x1 << 13)
#define Timer2_Start (0x1 << 12)
#define PDATG1_BIT (0x01<<1)
/************* ADS7843 A/D通道选择命令字和工作寄存器 *******************/
#define ADMODE_8BIT
#define CHX_12BIT 0xd4 //通道Y+的选择控制字
#define CHY_12BIT 0x94 //通道X+的选择控制字
#define CHX_8BIT 0xdc
#define CHY_8BIT 0x9c
#ifdef ADMODE_8BIT
#define CHX CHX_8BIT
#define CHY CHY_8BIT
#endif
#ifdef ADMODE_12BIT
#define CHX CHX_12BIT
#define CHY CHY_12BIT
#endif
/*************** Define pin state of ADS7843 ***********************/
#define DCLK(a) rPDATC=(rPDATC & ~(0x01<<3))|((a<<3) & (0x01<<3))
#define DIN(a) rPDATC=(rPDATC & ~(0x01<<2))|((a<<2) & (0x01<<2))
#define DPen ((rPDATC>>1) & 0x01)
#define DOUT ((rPDATC>>0) & 0x01)
/*******************************************************************/
/*********************** 触摸屏A/D置预设置 *************************/
/*******************************************************************/
#define GUI_TOUCH_AD_LEFT 4
#define GUI_TOUCH_AD_RIGHT 240
#define GUI_TOUCH_AD_TOP 240
#define GUI_TOUCH_AD_BOTTOM 35
#define GUI_TOUCH_SWAP_XY 0
#define GUI_TOUCH_MIRROR_X 0
#define GUI_TOUCH_MIRROR_Y 0
#define GUI_TOUCH_YSIZE LCD_YSIZE
#define GUI_TOUCH_XSIZE LCD_XSIZE
#define GUI_COORD_X 0
#define GUI_COORD_Y 1
/*********************************************************************
*
* Types
*
**********************************************************************
*/
typedef struct {int Min; int Max; } tMinMax;1
/*********************************************************************
*
* Static data
*
**********************************************************************
*/
static tMinMax xyMinMax[2] = {
#if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_X==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_Y==0))
{ GUI_TOUCH_AD_LEFT, GUI_TOUCH_AD_RIGHT },
#else
{ GUI_TOUCH_AD_RIGHT, GUI_TOUCH_AD_LEFT },
#endif
#if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_Y==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_X==0))
{ GUI_TOUCH_AD_TOP, GUI_TOUCH_AD_BOTTOM }
#else
{ GUI_TOUCH_AD_BOTTOM, GUI_TOUCH_AD_TOP }
#endif
};
static int xMin;
static int xMax;
static int yMin;
static int yMax;
typedef struct
{
int x0;
int y0;
int x1;
int y1;
}
WQ_RECT;
static void SendCommand(unsigned char cmd)
{
unsigned char command;
unsigned char i,j;
//CS(1);
DIN(0);
DCLK(0);
//CS(0); //芯片允许
for(i=0;i<8;i++)
{
for(j=0;j<25;j++); //200ns
command = (cmd>>(7-i))&0x1; //MSB在前,LSB在后
DIN(command); //时钟上升沿锁存DIN
DCLK(0); //DCKL = 0;
for(j=0;j<25;j++); //200ns
DCLK(1); //Rising edge -> Send one bit;
}
DIN(0); // DIN =0
for(j=0;j<25;j++); //200ns
}
static int ReadData(void)
{
int temp,data = 0;
unsigned char i,j;
DCLK(0);
for(i=0;i<16;i++)
{
for(j=0;j<25;j++); //200ns
DCLK(1);
for(j=0;j<25;j++); //200ns
DCLK(0);
temp = DOUT; //时钟下降沿读取,一共12个,MSB在前,LSB在后
data |= (temp<<(15-i));
}
//CS(1); //禁止芯片
data &= 0xffff;
#ifdef ADMODE_8BIT
return (data>>8); //8位A/D工作模式;
#else
return (data>>4); //12为A/D工作模式
#endif
}
/*********************************************************************/
/********* 读ADS7843 X轴A/D转换结果,返回为A/D值而并非坐标值 ********/
/*********************************************************************/
int ReadAD7843_X(void)
{
int i, data;
for(i=0;i<500;i++);
rINTMSK |= BIT_GLOBAL; //关全局中断
SendCommand(CHX);
rINTMSK &= ~BIT_GLOBAL; //开全局中断
for(i=0;i<8000;i++){} //延时时间依硬件电路(低通滤波,RC电路充/放电时间常数)不同而有所差异;
rINTMSK |= BIT_GLOBAL; //关全局中断
data = ReadData();
rINTMSK &= ~BIT_GLOBAL; //开全局中断
return data;
}
/*********************************************************************/
/********* 读ADS7843 Y轴A/D转换结果,返回为A/D值而并非坐标值 ********/
/*********************************************************************/
int ReadAD7843_Y(void)
{
int i, data;
for(i=0;i<500;i++);
rINTMSK |= BIT_GLOBAL; //关全局中断
SendCommand(CHY);
rINTMSK &= ~BIT_GLOBAL; //开全局中断
for(i=0;i<8000;i++){}
rINTMSK |= BIT_GLOBAL; //关全局中断
data = ReadData();
rINTMSK &= ~BIT_GLOBAL; //开全局中断
return data;
}
static int _Log2Phys(int l, int l0, int l1, int p0, int p1)
{
return p0+ ((p1 - p0) * (l - l0)) / (l1 - l0);
}
/*********************************************************************
*
* _AD2X
*
* Purpose:
* Convert physical value into (logical) coordinates.
*/
static int _AD2X(int adx) {
int r = adx - xyMinMax[GUI_COORD_X].Min;
r *= GUI_TOUCH_XSIZE - 1;
return r / (xyMinMax[GUI_COORD_X].Max - xyMinMax[GUI_COORD_X].Min);
}
/*********************************************************************
*
* _AD2Y
*
* Purpose:
* Convert physical value into (logical) coordinates.
*/
static int _AD2Y(int ady) {
int r = ady - xyMinMax[GUI_COORD_Y].Min;
r *= GUI_TOUCH_YSIZE - 1;
return r/(xyMinMax[GUI_COORD_Y].Max - xyMinMax[GUI_COORD_Y].Min);
}
//============按大小排序(冒泡算法,由小到大)=========================
static void DataSort(int *PData,unsigned char Num)
{
unsigned char i,j;
unsigned int temp;
for(i=0;i<Num-1;i++)
{
for(j=0;j<Num-1-i;j++)
{
if(*(PData+j+1) < *(PData+j))
{
temp = *(PData+j);
*(PData+j) = *(PData+j+1);
*(PData+j+1) = temp;
}
}
}
}
/*********************************************************************/
/************************* 触摸屏校准函数 ****************************/
/*********************************************************************/
int WQ_TOUCH_Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1)
{
int l0 = 0;
int l1 = (Coord == GUI_COORD_X) ? LCD_XSIZE - 1 : LCD_YSIZE - 1;
if (labs(Phys0 - Phys1) < 20)
{
return 1;
}
if (labs(Log0 - Log1) < 20)
{
return 1;
}
xyMinMax[Coord].Min = _Log2Phys(l0, Log0, Log1, Phys0, Phys1);
xyMinMax[Coord].Max = _Log2Phys(l1, Log0, Log1, Phys0, Phys1);
switch (Coord)
{
case GUI_COORD_X:
{
Wr24LCxx(0xa0,0,(unsigned char)xyMinMax[Coord].Min);
Wr24LCxx(0xa0,1,(unsigned char)xyMinMax[Coord].Max);
}
break;
case GUI_COORD_Y:
{
Wr24LCxx(0xa0,2,(unsigned char)xyMinMax[Coord].Min);
Wr24LCxx(0xa0,3,(unsigned char)xyMinMax[Coord].Max);
}
break;
}
return 0;
}
/*****************************************************************************/
/******************************** 触摸屏校准 *********************************/
/*****************************************************************************/
void Touch_Calibrate(void)
{
int CHX_AD[5],CHY_AD[5];
int Phys_x0,Phys_y0,Phys_x1,Phys_y1; //A/D坐标
int i;
WQ_RECT Rect;
Rect.x0 = 50;
Rect.y0 = 50;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -