Chinaunix首页 | 论坛 | 博客
  • 博客访问: 852653
  • 博文数量: 321
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 936
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-23 11:25
文章分类

全部博文(321)

文章存档

2017年(1)

2016年(10)

2015年(61)

2014年(187)

2013年(62)

分类: 嵌入式

2014-05-14 23:20:26

LCD触摸屏

4线制的电阻触摸屏

1.rADCCON=(1<<14)|(ADCPRS<<6)|(CHANNEL<<3)|(0<<2)|(0);注意:该寄存器要配完,否则有时候不进入中断。特别是后bit0-2】;注意!->ADCCON bit[0]要注意,要为0;

2.我们这边所做的触摸屏都是等待中断按下模式;rADCTSC=0xD3;//(1100 0011)

3.中断挂起,记住还有rSUBSRCPND。。。为了AD转化产生中断;

4.配置好等待触笔按下的中断,安装触笔按下的中断函数。

   并在主函数中调用触屏校验程序,以获得Kx Ky LCD与触摸屏的相对值

5. 有触笔按下,自动调用中断函数,在该函数中

  (1)、为了不让AD转化结束后进来该中断函数,可以先屏蔽rINTSUBMSK |=  BIT_SUB_TC;

(2)、当笔尖落下,if(rADCUPDN & 0x1)//笔尖落下

(3)rADCUPDN = 0;//清楚标志rADCTSC = (1<<3)|(1<<2)|(0<<0);//bit[2]=1,自动 顺序XY方向的转换

(4)模式转变要延时rADCDLY = 50000;//延时//模式转变,要延时

rADCCON= (0<<1)|(1<<0);开始A/D转化;按下进入中断后设置AD转换启 动,等待 AD转换OK产生中断,读取x,y触屏的数据,并通过Kx Ky 出对应的像素值。

(5)

while(rADCCON&0X1);//检查是否开始转换//因为如果开始的话,该位会清零

while(!(rADCCON & (0X1<<15)));//转换结束,可以读取X,Y的坐标值

XDATA = (rADCDAT0 & 0X3FF);//将对应的触摸屏坐标记录下来

YDATA = (rADCDAT1 & 0X3FF);

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

清除中断;

(6)、if(rADCUPDN & (0x1<<1))//笔尖是否有抬起

(7) rADCUPDN = 0;//清楚标志

while(1)        //等待触笔的抬起 // 11 查询等待弹起中断标志,直到查 到弹起。

{

if(rSUBSRCPND & (BIT_SUB_TC))//中断挂起

{

break;    //说明笔尖已经抬起,一个触摸中断终于结束,下面读取数 }

        }  

8)、rADCDLY = 50000;//延时//模式转变,要延时

9)、rADCTSC = 0xD3;//再次设为中断等待模式(清除中断)

(10)、读取完成后设置成弹起中断,等待一个动作结束;结束后进入下一次准备。

6总共有三次中断,一次笔尖下去,一次AD转化结束,一次笔尖提起

7、屏幕校正,LCD屏和touch屏、注意,LCD的原坐标在座上角,触摸屏的原坐标在 右上角

算法:1、先记录四个LCD位置的坐标(给出的四个点,已知),再通过按下后,产生 四个TOUCH坐标,记录下来,因为四个每个坐标都加了两次,所以 要除以2TCx0=TCx0>>1 等;

2、记下LCD初始点:TCcal.x0 =LCDPoint[0].x_lcd; TCcal.y0  =LCDPoint[0].y_lcd;

3、记下TOUCH初始点:TCcal.ax0=TCx0;TCcal.ay0=TCy0;

4、//算出Kx,Ky   LCD的一个像素相当于TS的多少AD,之间的比例关系:

 TCcal.Kx =(float)(LCDPoint[2].x_lcd-LCDPoint[0].x_lcd)/(TCx0-TCx1);

TCcal.Ky=(float)((LCDPoint[2].y_lcd)-LCDPoint[0].y_lcd)/(TCy1-TCy0);//(TCy0 -TCy1);

K=(210(检验第三个点)-30(检验第一个点))/(第一个点在触摸屏的位置- 第三个 点在触摸屏的位置)===>因为LCD的原坐标在座上角,触摸屏的原 坐标在右上角

5、算出x,y像素 ;四个参数为四个坐标(TCx0-TCx1)(TCy1-TCy0)对应的touch 屏的坐标,你按下去的值

x=30+( proportion[2]-TCx)*proportion[0];//其中*proportion为放在iic(e2prom)

y=30+(TCy-proportion[3])*proportion[1];//30为第一个矫正点的LCD坐标

X=第一点的坐标+( ax0记下LCD初始点x对应触摸屏的x坐标-按下去的 LCD坐标)*Kx;同理Y;

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

(2)、按下进入中断后设置AD转换启动,等待AD转换OK产生中断,

 读取x,y触屏的数据,并通过Kx Ky算出对应的像素值。

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

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

(5)while(rADCCON&0X1);//检查是否开始转换//因为如果开始的话,该位会清零

while(!(rADCCON & (0X1<<15)));//转换结束,可以读取X,Y的坐标值

9、将KX,KY,还有 ax0;记下LCD初始点x对应触摸屏的x坐标 ay0; 记下LCD初始点x对应触摸屏的y坐标=====4个参数写入E2PROM里面,下次就可以直接读取,不用再校验了

void wr_to_iic(unsigned char address)

{

int i;

unsigned char *p;

float pr[4];

pr[0] = TCcal.Kx;

pr[1] = TCcal.Ky;

pr[2] =  TCcal.ax0;

pr[3] = TCcal.ay0;

p = (unsigned char*)pr;

    for(i=0; i<16; i++)//写16个字节,kx ,ky, TCcal.ax0; TCcal.ay0;(第一次按下触摸屏 的坐标)

{

iic_write(devAddr,address,p[i]);

address++;

}

}

void rd_from_iic(unsigned char address)

{

    iic_read(devAddr,address,iic_buffer,16);

    proportion = (float*)iic_buffer;

}注:用iic读写时要初始化

 

阅读(463) | 评论(0) | 转发(0) |
0

上一篇:9-字库

下一篇:14-ADC

给主人留下些什么吧!~~