📄 sys_tchscr.c.svn-base
字号:
/****************************************************************************
Copyright (c) 深圳市民德电子科技有限公司 http://www.szminde.cn
文件名称:sys_TchScr.c
版本号: 1.0
日期: 2005-05-25
说明: 此文件包含对ES-TAD7100开发板上的触摸屏模块操作的函数
调用列表:sys_LCD.c
修改历史:--
****************************************************************************/
#include"44b.h"
#include "sys_TchScr.h"
#include "sys_LCD.h"
/*延时函数*/
extern void Delay(int time);
/*用于触摸屏返回坐标值与LCD坐标值对应校正的几个参数*/
float adjust_a=-0.088508,
adjust_b=345.499578533,
adjust_c=0.06582633,
adjust_d=-17.35294117647;
/****************************************************************************
函数名称:Start7843()
说明: 选通器件ADS7843,准备开始操作。
调用函数:无
输入参数:无
输出参数:无
****************************************************************************/
void Start7843(void)
{
rPDATC &=~ ADS7843_PIN_DCLK; //DCLK=0;
rPDATC |= ADS7843_PIN_CS; //CS=1;
rPDATC |= ADS7843_PIN_DIN; //DIN=1;
rPDATC |= ADS7843_PIN_DCLK; //DCLK=1
rPDATC &=~ ADS7843_PIN_CS; //CS=0;
}
/****************************************************************************
函数名称:WriteCharTo7843()
说明: 向器件ADS7843写一个字节的数据。
调用函数:Delay()
输入参数:num 要写的数据
输出参数:无
****************************************************************************/
void WriteCharTo7843(U8 num)
{
U8 count=0;
U8 TempNum=0;
U8 DIN=0;
rPDATC&=~ADS7843_PIN_DCLK; // DCLK=0;
for(count=0;count<8;count++)
{
TempNum = num;
TempNum >>= (7-count);
DIN = TempNum&0x1;
rPDATC &=~ ADS7843_PIN_DIN;
rPDATC |= (DIN<<6);
rPDATC &=~ ADS7843_PIN_DCLK; // DCLK=0;上升沿有效
Delay(2);
rPDATC |= ADS7843_PIN_DCLK; // DCLK=1;
Delay(2);
}
}
/****************************************************************************
函数名称:ReadCharFrom7843()
说明: 从器件ADS7843读回数据。
调用函数:Delay()
输入参数:无
输出参数:返回一个整型数据
****************************************************************************/
S32 ReadCharFrom7843(void)
{
U8 count=0;
U32 Num=0;
U32 DOUT=0;
for(count=0;count<12;count++)
{
Num<<=1;
rPDATC|=ADS7843_PIN_DCLK; //DCLK=1; 下降沿有效
Delay(2);
rPDATC&=~ADS7843_PIN_DCLK; //DCLK=0;
Delay(2);
DOUT=(rPDATC&0x80); //ADS7843_PIN_DOUT
if(DOUT) Num++;
}
return(Num);
}
/****************************************************************************
函数名称:TchScr_GetScrXY()
说明: 从器件ADS7843读回触摸点在触摸屏上的X,Y坐标。
调用函数:WriteCharTo7843()
ReadCharFrom7843()
Delay()
输入参数:*x 用来存储x坐标的整型指针
*y 用来存储x坐标的整型指针
输出参数:无
****************************************************************************/
void TchScr_GetScrXY(S32 *x, S32 *y)
{
S32 a=0,b=0;
Start7843();
Delay(2);
WriteCharTo7843(0x90); //送控制字 10010000 即用差分方式读X坐标
Delay(2);
rPDATC&=~ADS7843_PIN_DCLK;
Delay(2);
a=ReadCharFrom7843();
*x=a;
Start7843();
WriteCharTo7843(0xd0); //送控制字 11010000 即用差分方式读Y坐标
Delay(2);
rPDATC&=~ADS7843_PIN_DCLK;
Delay(2);
b=ReadCharFrom7843();
*y=b;
rPDATC|=ADS7843_PIN_CS;
}
/****************************************************************************
函数名称:LCD_Touch()
说明: 将从器件ADS7843读回触摸点在触摸屏上的X,Y坐标转换为对应LCD的坐标。
调用函数:TchScr_GetScrXY()
Delay()
输入参数:*x 用来存储x坐标的整型指针
*y 用来存储x坐标的整型指针
输出参数:无
****************************************************************************/
void LCD_Touch(int* x,int* y)
{
int TchScrAction=TCHSCR_ACTION_UP;
while(TchScrAction==TCHSCR_ACTION_UP) //未压下状态位
{
if(!((rPDATC&ADS7843_PIN_PEN)>>4)) //得到压下中断信号
{
Delay(30);
if(!((rPDATC&ADS7843_PIN_PEN)>>4))
{
TchScr_GetScrXY(x, y);
*x=adjust_a*(*x)+adjust_b;
if((*x)<0)(*x)=0;
if((*x)>=320)(*x)=319;
*y=adjust_c*(*y)+adjust_d;
if((*y)<0)(*y)=0;
if((*y)>=240)(*y)=239;
TchScrAction=TCHSCR_ACTION_DOWN; //设置压下状态
}
}
}
while(TchScrAction==TCHSCR_ACTION_DOWN) //已压下状态位
{
if((rPDATC&ADS7843_PIN_PEN)>>4) //中断信号已经消失
{
Delay(30);
if((rPDATC&ADS7843_PIN_PEN)>>4)
{
TchScrAction=TCHSCR_ACTION_UP; //设置未压状态位
}
}
}
}
/****************************************************************************
函数名称:TchScr_Adjust()
说明: 校正在触摸屏上的坐标和LCD坐标的对应关系。
调用函数:TchScr_GetScrXY()
LCD_Cls()
ClearScr()
LCD_Printf()
DrawLine()
Delay()
输入参数:无
输出参数:无
****************************************************************************/
void TchScr_Adjust(void)
{
S32 x_1=0,y_1=0,x_2=0,y_2=0,x_3=0,y_3=0,x_4=0,y_4=0;
S32 TchScrAction=TCHSCR_ACTION_UP;
TchScr_GetScrXY(&x_1, &y_1);
x_1=0;y_1=0;
LCD_Cls();
ClearScr();
LCD_Printf(" Please click the cross.");
Delay(3000);
DrawLine(39,27,39,31,15);
DrawLine(37,29,41,29,15);
while(0==x_1&&0==y_1)
{
if(TchScrAction==TCHSCR_ACTION_UP) //未压下状态位
{
if(!((rPDATC&ADS7843_PIN_PEN)>>4)) //得到压下中断信号
{
Delay(30);
if(!((rPDATC&ADS7843_PIN_PEN)>>4)) //两次检测防干扰
{
TchScr_GetScrXY(&x_1, &y_1);
TchScrAction=TCHSCR_ACTION_DOWN;//设置压下状态
}
}
}
}
while(TchScrAction==TCHSCR_ACTION_DOWN) //已压下状态位
{
if((rPDATC&ADS7843_PIN_PEN)>>4) //中断信号已经消失
{
Delay(30);
if((rPDATC&ADS7843_PIN_PEN)>>4) //两次检测防干扰
{
TchScrAction=TCHSCR_ACTION_UP; //设置未压状态位
}
}
}
Delay(3000);
x_2=0;y_2=0;
ClearScr();
LCD_Printf(" Please click the cross.");
DrawLine(279,27,279,31,15);
DrawLine(277,29,281,29,15);
while(0==x_2&&0==y_2)
{
if(TchScrAction==TCHSCR_ACTION_UP) //未压下状态位
{
if(!((rPDATC&ADS7843_PIN_PEN)>>4)) //得到压下中断信号
{
Delay(30);
if(!((rPDATC&ADS7843_PIN_PEN)>>4)) //两次检测防干扰
{
TchScr_GetScrXY(&x_2, &y_2);
TchScrAction=TCHSCR_ACTION_DOWN;//设置压下状态
}
}
}
}
while(TchScrAction==TCHSCR_ACTION_DOWN) //已压下状态位
{
if((rPDATC&ADS7843_PIN_PEN)>>4) //中断信号已经消失
{
Delay(30);
if((rPDATC&ADS7843_PIN_PEN)>>4) //两次检测防干扰
{
TchScrAction=TCHSCR_ACTION_UP; //设置未压状态位
}
}
}
Delay(3000);
x_4=0;y_4=0;
ClearScr();
LCD_Printf(" Please click the cross.");
DrawLine(279,207,279,211,15);
DrawLine(277,209,281,209,15);
while(0==x_4&&0==y_4)
{
if(TchScrAction==TCHSCR_ACTION_UP) //未压下状态位
{
if(!((rPDATC&ADS7843_PIN_PEN)>>4)) //得到压下中断信号
{
Delay(30);
if(!((rPDATC&ADS7843_PIN_PEN)>>4)) //两次检测防干扰
{
TchScr_GetScrXY(&x_4, &y_4);
TchScrAction=TCHSCR_ACTION_DOWN;//设置压下状态
}
}
}
}
while(TchScrAction==TCHSCR_ACTION_DOWN) //已压下状态位
{
if((rPDATC&ADS7843_PIN_PEN)>>4) //中断信号已经消失
{
Delay(30);
if((rPDATC&ADS7843_PIN_PEN)>>4) //两次检测防干扰
{
TchScrAction=TCHSCR_ACTION_UP; //设置未压状态位
}
}
}
Delay(3000);
x_3=0;y_3=0;
ClearScr();
LCD_Printf(" Please click the cross.");
DrawLine(39,207,39,211,15);
DrawLine(37,209,41,209,15);
while(0==x_3&&0==y_3)
{
if(TchScrAction==TCHSCR_ACTION_UP) //未压下状态位
{
if(!((rPDATC&ADS7843_PIN_PEN)>>4)) //得到压下中断信号
{
Delay(30);
if(!((rPDATC&ADS7843_PIN_PEN)>>4)) //两次检测防干扰
{
TchScr_GetScrXY(&x_3, &y_3);
TchScrAction=TCHSCR_ACTION_DOWN;//设置压下状态
}
}
}
}
while(TchScrAction==TCHSCR_ACTION_DOWN) //已压下状态位
{
if((rPDATC&ADS7843_PIN_PEN)>>4) //中断信号已经消失
{
Delay(30);
if((rPDATC&ADS7843_PIN_PEN)>>4) //两次检测防干扰
{
TchScrAction=TCHSCR_ACTION_UP; //设置未压状态位
}
}
}
//上述几个点在LCD上的大概位置如下:
//////////////////////////////////////////////////////////////
//(x_1,y_1) (x_2,y_2)//
// //
// //
//(x_3,y_3) (x_4,y_4)//
//////////////////////////////////////////////////////////////
x_1=(x_1+x_3)/2;
x_2=(x_2+x_4)/2;
y_1=(y_1+y_2)/2;
y_2=(y_3+y_4)/2;
adjust_a=(float)(240.0/(x_2-x_1));
adjust_b=(float)(279-adjust_a*x_2);
adjust_c=(float)(180.0/(y_2-y_1));
adjust_d=(float)(209-adjust_c*y_2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -