全部博文(321)
分类: 嵌入式
2014-05-14 23:20:26
LCD触摸屏
4线制的电阻触摸屏
1.rADCCON=(1<<14)|(ADCPRS<<6)|(CHANNEL<<3)|(0<<2)|(0);注意:该寄存器要配完,否则有时候不进入中断。特别是后bit【0-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,自动 顺序X和Y方向的转换
(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读写时要初始化