
一、实验目的
1.了解触摸屏的基本概念与原理。
2.理解触摸屏工作原理。
二、实验设备
计算机;博创UP-3000实验箱
三、实验步骤
1.新建工程,将“\\3000的ADS实验\\Exp8 触摸屏实验”中的文件添加到工程中。
2.定义头文件中的宏定义。
3.阅读触摸屏读取触摸点x,y电压值、坐标程序,画出流程图。
4.编写触摸点坐标及动作判断函数U32 TchScr_GetOSXY(int *x, int *y),返回值为触摸动作,画出程序流程图。
5.提高部分:与LCD结合,实现手写板功能,在触摸屏上画线,在LCD上显示出来。
6.提高部分:与LCD结合,实现按钮功能,在LCD上画一矩形按钮,点击该按钮,实现某个操作。
程序流程图,程序源代码及注释和程序运行结果(截屏)。
触摸点坐标判断函数:
U32 TchScr_GetOSXY(int *x, int *y)
{//获得触摸点坐标并返回触摸动作
static U32 mode=0;
static int oldx,oldy;
int i,j;
for(;;){
if((mode!=TCHSCR_ACTION_DOWN) && (mode!=TCHSCR_ACTION_MOVE)){
if(!TCHSCR_IsPenNotDown){//有触摸动作
TchScr_GetScrXY(x, y,TRUE);//得到触摸点坐标
for(i=0;i<40;i++){
if(TCHSCR_IsPenNotDown)//抬起
break;
Delay(100);
}
if(i<40){ //在规定的双击时间之内抬起,检测是不是及时按下
for(i=0;i<60;i++){
if(!TCHSCR_IsPenNotDown){
if (i<10) {i=60;break;}//如果单击后很短时间内按下,不视为双击
mode=TCHSCR_ACTION_DBCLICK;
for(j=0;j<40;j++) Delay(100);//检测到双击后延时,防止拖尾
break;
}
Delay(100);
}
if(i==60) //没有在规定的时间内按下
mode=TCHSCR_ACTION_CLICK;
}
else{ //没有在规定的时间内抬起
mode=TCHSCR_ACTION_DOWN;
}
break;
}
}
else{
if(TCHSCR_IsPenNotDown){ //抬起
mode=TCHSCR_ACTION_UP;
*x=oldx;
*y=oldy;
return mode;
}
else{
TchScr_GetScrXY(x, y,TRUE);
if(ABS(oldx-*x)>4 ||ABS( oldy-*y)>4){//有移动动作
mode=TCHSCR_ACTION_MOVE;
break;
}
}
}
Delay(50);
}
oldx=*x;
oldy=*y;
//编写该函数
return mode;
}
画线函数:
void TchScr_Test()
{
U32 mode1,mode2;
int x1,y1,x2,y2,i,j,p,q;
float k;
Uart_Printf("\\nplease touch the screen\\n");
//画直线
for(;;){
mode1=TchScr_GetOSXY(&x1, &y1);//获得触摸点坐标并返回触摸动作
if(mode1==TCHSCR_ACTION_CLICK)
{ Uart_Printf("Action=click:x=%d,\y=%d\\n",x1,y1);
Delay(1000);
Uart_Printf("please touch another click");
mode2=TchScr_GetOSXY(&x2, &y2);//获得触摸点坐标并返回触摸动作
Uart_Printf("Action=click:x=%d,\y=%d\\n",x2,y2);
Delay(1000);
if(x1==x2) //无斜率情况
{
for(i=y1;i<=y2;i++)
{
LCDBuffer[i][x1]=0x0000e000;
}
}
else if(abs(x1-x2)>=abs(y1-y2))
{
k=(y2-y1)/(x2-x1);
if(x1 for(j=x1;j<=x2;j++) { i=(int)(y1+k*(j-x1)); LCDBuffer[i][j]=0x0000e000; } } else{ for(j=x2;j<=x1;j++) { i=(int)(y1-k*(x1-j)); LCDBuffer[i][j]=0x0000e000; } } } else{ k=(y2-y1)/(x2-x1); if(y1 for(i=y1;i<=y2;i++) { j=(int)(x1+(i-y1)/k); LCDBuffer[i][j]=0x0000e000; } } else{ for(i=y2;y<=y1;y++) { j=(int)(x1-(y1-i)/k); LCDBuffer[i][j]=0x0000e000; } } } LCD_Refresh(); } } } 矩形按键控制步进电机函数: void TchScr_Test() { U32 mode,mode1,mode2; int x,y,x1,y1,x2,y2,i,j,p,q; float k; //////////////A, AB, B, BC, C CD, D, DA int stepdata[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//正向转动时的位控制数组 int stepdata1[]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};//反向转动时的*** Uart_Printf("\\nplease touch the screen\\n"); //控制电机 for(i=70;i<=120;i++) for(j=150;j<=210;j++) { LCDBuffer[i][j]=0x0000e000; } LCD_Refresh(); for(;;) { mode=TchScr_GetOSXY(&x,&y); if(x>=150&&x<=210&&y>=70&&y<=120)//区域判断 { if(mode==TCHSCR_ACTION_CLICK)//单击正转 { for(j=0;j<20000;j++)//设置转动次数,尽量大会效果明显 { for(i=0;i<8;i++)//步距角为360/512/8,所以即使四相步机转一次也不会有明显转动现象 { SETEXIOBITMASK(stepdata[i],0xF0);//通过宏定义空位EXIO的高四位来控制步进机正向转动 Delay(3000); } } } else if(mode==TCHSCR_ACTION_DBCLICK)//双击反转 { for(j=0;j<20000;j++) { for(i=0;i<8;i++) { SETEXIOBITMASK(stepdata1[i],0xF0);//反向转 Delay(3000); } } } } } } 结果截图: 四、实验心得 通过本次实验,了解的触摸屏的基本实现原理,我们所用的实验箱的触摸屏为电阻式,基本原理是检测触摸点被压下后的电压值来返回坐标,还有一种触摸屏为电容式。编程时应注意,由于每个触摸屏对检测电压有偏值差,所以,获取点坐标操作之前,要对点坐标进行校正处理。另外,画线时应注意直线斜率的处理,应以差值较大的坐标值为准确定另一点坐标,否则会出现点状线。此外,触摸屏返回的是坐标值(x,y),x,y分别对应横坐标和纵坐标,而在画线时则分别对应列值与行值。 六、流程图
