当前位置:首页 > 单片机 > 单片机
[导读]一、触摸屏原理: 可以参考相关资料,本人参考的是阿南的>中有关触摸屏的内容。二、2440触摸屏的设置1、ADCON: ADC控制寄存器#define ADCPRS 24rADCCON=(1

一、触摸屏原理:

可以参考相关资料,本人参考的是阿南的<<>入门与实践>>中有关触摸屏的内容。

二、2440触摸屏的设置

1、ADCON: ADC控制寄存器

#define ADCPRS 24

rADCCON=(1<<14)+(ADCPRS<<6);

使能读启动操作。

AD转换器的预分频值为24,注意:

AD转换频率=PCLK/(分频值+1),且AD的最高频率为2.5M,这里PCLK=50M,所以AD的转换频率为2M.

2、ADCTSC ADC触摸屏控制寄存器

rADCTSC=0xd3;

当笔尖落下时触摸屏控制器产生中断(INT_TC)信号。

YM输出驱动器使能

YP输出驱动器禁止

XM输出驱动器禁止

XP输出驱动器禁止

等待中断模式

注意:自动x,y方向测量是指当测完x跟y后产生ADC中断。

3、ADCDLY ADC启动或初始化延时寄存器

rADCDLY=50000;

设置一个适当的便可

4、设置中断服务函数

pISR_ADC = (int)AdcTsAuto;//设置中断函数地址

rINTMSK=~BIT_ADC;//ADC Touch Screen Mask bit clear

rINTSUBMSK=~(BIT_SUB_TC); //触摸屏中断

三、触摸屏检测及校正

1、触摸屏的检测思路类似于按键检测,以下为检测一个点的思路:

(1)、设置等待中断,按下有效

(2)、按下进入中断后读取x,y数据

(3)、读取完成后设置成弹起中断,等待一个动作结束

(4)、结束后进入下一次准备。


程序如下:

void __irq AdcTsAuto(void)

{

//解摸屏按下,产生中断

U32 saveAdcdly;

if(rADCDAT0&0x8000)

rADCTSC&=0xff;// Set stylus down interrupt bit

//关闭XP上拉,启动自动顺序x/y转换

rADCTSC=(1<<3)|(1<<2);//Pull-up disable, Seq. X,Y postion measure.

//设置延时时间

saveAdcdly=rADCDLY;

rADCDLY=40000;

//开始AD转换

rADCCON|=0x1;//start ADC

//AD转换启动后开始位会被清0

while(rADCCON & 0x1);//check if Enable_start is low

//等待转换结束

while(!(rADCCON & 0x8000));//check if EC(End of Conversion) flag is high, This line is necessary~!!

//查询INT_ADC中断,直到查到结束中断标志

while(!(rSRCPND & (BIT_ADC)));//check if ADC is finished with interrupt bit

//产生中断标志说明x,y已经转换结束,读取数据。

xdata=(rADCDAT0&0x3ff);

ydata=(rADCDAT1&0x3ff);

//按下标志

touchedflag=TRUE;

//check Stylus Up Interrupt.

//清中断,并且重开中断,再次设置等待中断,这一次设置等待弹起中断。

rSUBSRCPND|=BIT_SUB_TC;

ClearPending(BIT_ADC);

rINTSUBMSK=~(BIT_SUB_TC);

rINTMSK=~(BIT_ADC);

rADCTSC =0xd3;//Waiting for interrupt

rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

//查询等待弹起中断标志,直到查到弹起。

while(1)//to check Pen-up state

{

if(rSUBSRCPND & (BIT_SUB_TC))//check if ADC is finished with interrupt bit

{

//Uart_Printf("Stylus Up Interrupt~!n");

break;//if Stylus is up(1) state

}

}

//此时,一个触摸屏动作检测已经完成,输出坐标信息。

Uart_Printf("count=%03dXP=%d, YP=%dn", count++, xdata, ydata);//X-position Conversion data

//再次设置成按下中断,等待下一次动作

rADCDLY=saveAdcdly;

rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.

rSUBSRCPND|=BIT_SUB_TC;

rINTSUBMSK=~(BIT_SUB_TC);// Unmask sub interrupt (TC)

ClearPending(BIT_ADC);

}

2、触摸屏的校正

触摸屏校正的目的是为了把触摸屏上的坐标跟LCD上坐标一一对应起来。


如上图,假设LCD与触摸屏的点是一一对应的,LCD上四个角的点为人为设置的点(实际只需要上左上跟右下两个点就可以了,还有两个点是用来做平均的),触摸屏上四个角的点为LCD上四个点对应转换来的数值。(ax,ay)为正常工作时点击的点,(x,y)为(ax,ay)对应的坐标。

那么LCD与触摸屏的关系为:

x=x0+(x1-x0)*(ax-ax0)/(ax1-ax0)

y=y0+(y1-y0)*(ay-ay0)/(ay1-ay0)

具体步骤:

以320*240的屏举例:

(1)、设置四个LCD点(30,30)、(30,210)、(290,210)、(290,30)

(2)、在屏幕上依次画出这四个点(以四个点为中心点的十字形),并且依次点击这四个点,分别记下四个点转换出来的数值。(ax0,ay0),(ax0,ax1),(ax1,ay1),(ax1,ay0)

(3)、由x=x0+(x1-x0)*(ax-ax0)/(ax1-ax0),可以把(x1-x0)/(ax1-ax0)转换成常量系数Kx,那么

x=x0+(ax-ax0)*Kx,Kx=(x1-x0)/(ax1-ax0),这样只需记下x0,ax0,Kx三个值便可。

同样的:

y=y0+(y1-y0)*(ay-ay0)/(ay1-ay0), y=y0+(ay-ay0)*Ky, Ky=(y1-y0)/(ay1-ay0),只需记下y0,ay0,Ky便可.

(4)、校正完成,正常工作时当点击触摸屏时产生(ax,ay),则

x=x0+(ax-ax0)*Kx

y=y0+(ay-ay0)*Ky

便可以很容易求出实际坐标。

校正程序如下:

//触摸屏校正

//x=x0+(x1-x0)*(ax-ax0)/(ax1-ax0)

//x=x0+(ax-ax0)*Kx

//Kx=(x1-x0)/(ax1-ax0)

//x0,ax0,Kx

//同理

//y=y0+(y1-y0)*(ay-ay0)/(ay1-ay0)

//y=y0+(ay-ay0)*Ky

//Ky=(y1-y0)/(ay1-ay0)

//y0,ay0,Ky

volatile U32 touchedflag=FALSE;

//必要的参数

typedef struct cali

{

intx0;

intax0;

floatKx;

inty0;

intay0;

floatKy;

}TCpara;

typedef struct Point

{

int x;

int y;

}POINT;

//LCD四个校正点

POINT LCDPoint[4]=

{

30,30,//左上

30,210,//左下

290,210,//右下

290,30//右上

};

TCpara TCcal;

void touchsrc_calibration()

{

U32 i;

//int x=30,y=30;

//int LCDx1=30,LCDy1=30,LCDx2=30,LCDy2=150,LCDx3=290,LCDy3=210;

//TCx3=0,TCy3=0,TCx4=0,TCy4=0;

//float A,B,C,D,E,F,K;

//float K

Lcd_ClearScr(0);

for(i=0;i<4;i++)

{

//分别画出四个点Glib_Line(LCDPoint[i].x-10,LCDPoint[i].y,LCDPoint[i].x+10,LCDPoint[i].y,(U32)(255<<11));

Glib_Line(LCDPoint[i].x,LCDPoint[i].y-10,LCDPoint[i].x,LCDPoint

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

基于ABB机器人生产线 ,设计了一种西门子PLC自保护智能控制系统 。该系统采用HK-FKGD40无线手持报警器 , 受机器人挤压时人员通过该报警器便可触发机器人智能判断 、自动回退运动实现自我解救 , 同时系统发出声光...

关键字: 无线手持报警器 自保护;智能 PLC ABB机器人 触摸屏

在科技飞速发展的当下,智能设备已深度融入人们的生活与工作。其中,PDA(Personal Digital Assistant,个人数字助理)作为一款集信息输入、存储、管理和传递于一体,且具备办公、娱乐、移动通信等多种功能...

关键字: 智能设备 触摸屏 微控制器

苏州 2025年5月27日 /美通社/ -- 5月24日-26日,第26届全国医院建设大会暨国际医院建设、装备及管理展览会(CHCC 2025)在武汉举行。艺卓(EIZO)携手术室视觉显示解决方案参展,以科技...

关键字: HC 医学影像 IO 触摸屏

随着手工酿造的普及和复杂程度的不断提高,许多酿酒师——尤其是小规模或独立的酿酒师——仍然依靠手工方法来记录和跟踪关键数据,如温度、pH值、体积和比重。这些读数通常使用手动仪器,记录在纸上或分散在电子表格和文档中,没有集中...

关键字: 触摸屏 物联网 DS18B20 传感器

随着嵌入式系统的广泛应用,触摸屏作为人机交互的重要接口,其驱动开发变得愈发重要。本文将详细介绍在嵌入式Linux环境下,触摸屏驱动的开发流程,从设备树的配置到校准算法的实现,为读者提供一个全面的开发指南。

关键字: 嵌入式Linux 触摸屏 校准算法 设备树

将您的树莓派Pico变成带有触摸屏界面的USB-HID设备!在这个项目中,我们将在Arduino IDE中设置编程环境,为3.5”Pico Touch LCD屏蔽配置库,测试基本功能,创建简单的按钮(用于复制和粘贴),显...

关键字: 树莓派 触摸屏 LCD Windows

ADS7846是美国Burr-Brown公司推出的新一代4线制触摸屏控制器,当与触摸屏连用,只要笔或手指点触摸在屏上时,即可迅速得到该点的位置信号以达到在触摸屏表面寻址的目的。

关键字: ADS7846 触摸屏

‌激光治疗仪触摸屏接口设计‌主要包括触摸屏的工作原理、控制器工作原理以及在激光治疗仪中的应用。

关键字: 触摸屏 激光治疗仪

中国深圳 – TITAN Haptics泰坦触觉宣布推出DRAKE LFi触觉马达,旨在满足中国电子市场不断增长的需求。DRAKE LFi专为需要触觉反馈的设备设计,例如触摸屏和触觉按钮。这款新型触觉马达能够提供精准的局...

关键字: 消费电子 触摸屏 可穿戴设备

虽然无数关于未来交通的文章都以四轮电动车作为讨论重点,但在印度、马来西亚、泰国和印度尼西亚等诸多国家,出行更依赖于经济的两轮电动车,包括踏板式摩托车、重型摩托车、电动摩托车、电动轻便摩托车和电动自行车。这些两轮电动车紧跟...

关键字: 电动车 触摸屏 触摸控制器
关闭