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

📄 touch7843_44b0.c

📁 AD7843在ADS1.2环境下的一个驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************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 + -