接上节https://blog.csdn.net/pxy198831/article/details/86434989
S3C2440之触摸屏(一)
触摸屏校正之后,可以存储在EEPROM中,校准主要是为了获取差错计算参数,通过在EEPROM中某一地址中数据
来判断是否进行了初始化校准。
校准程序如下:
/**************************************************************************
***** 函数名:touchpanelRevise()
***** 功 能:触摸屏校正程序
***** 参 数:TS_again: 1 从新校正
0 判断EEPROM对应的地址选择是否需要校正
***** 返回值:无
***** 创建者:
***** 创建时间:2011-03-30
***** 最后更新:2011-03-30
****************************************************************************/
void touchpanelRevise(U8 TS_again)
{
char h_8 = 0; //参数最高8位
U8 mh_8 = 0; //参数次高8位
U8 ml_8 = 0; //参数次低8位
U8 l_8 = 0; //参数最低8位
U16 address = 0;
U8 i;
U8 IIC_data; //判断是否已经校准过的数据
int k;
for (k=0; k<7; k++)
{
aba[k]= calibration_number[k];
// if(aba[k]==0);
}
if (TS_again == 1) //表示用户主动申请校准,不进行IIC判断直接校准,并保持校准结果
{
TSOK = 0;
ts_main();
for (i=0; i<7; i++)
{
switch(i)
{
case 0:
{
address = 0x00;
break;
}
case 1:
{
address = 0x10;
break;
}
case 2:
{
address = 0x20;
break;
}
case 3:
{
address = 0x30;
break;
}
case 4:
{
address = 0x40;
break;
}
case 5:
{
address = 0x50;
break;
}
case 6:
{
address = 0x60;
break;
}
default:
{
break;
}
}
h_8 = ((calibration_number[i]&0xff000000)>>24);
mh_8 = ((calibration_number[i]&0x00ff0000)>>16);
ml_8 = ((calibration_number[i]&0x0000ff00)>>8);
l_8 = (calibration_number[i]&0x000000ff);
Wr24C080(EEPROM_ADDRESS,address,h_8); //保存校验参数0~6 最高8位
delay(16000000);
Wr24C080(EEPROM_ADDRESS,address+1,mh_8); //保存校验参数0~6 次高8位
delay(16000000);
Wr24C080(EEPROM_ADDRESS,address+2,ml_8); //保存校验参数0~6 次低8位
delay(16000000);
Wr24C080(EEPROM_ADDRESS,address+3,l_8); //保存校验参数0~6 最低8位
delay(16000000);
}
}
else
{
IIC_data = Rd24C080(EEPROM_ADDRESS,IIC_DATA_ADDRESS);
delay(16000000);
if (IIC_data != IIC_DATA) //如果没有进行过校准
{
ts_main();
for (i=0; i<7; i++)
{
switch(i)
{
case 0:
{
address = 0x00;
break;
}
case 1:
{
address = 0x10;
break;
}
case 2:
{
address = 0x20;
break;
}
case 3:
{
address = 0x30;
break;
}
case 4:
{
address = 0x40;
break;
}
case 5:
{
address = 0x50;
break;
}
case 6:
{
address = 0x60;
break;
}
default:
{
break;
}
}
h_8 = ((calibration_number[i]&0xff000000)>>24);
mh_8 = ((calibration_number[i]&0x00ff0000)>>16);
ml_8 = ((calibration_number[i]&0x0000ff00)>>8);
l_8 = (calibration_number[i]&0x000000ff);
Wr24C080(EEPROM_ADDRESS,address,h_8); //保存校验参数0~6 最高8位
delay(16000000);
Wr24C080(EEPROM_ADDRESS,address+1,mh_8); //保存校验参数0~6 次高8位
delay(16000000);
Wr24C080(EEPROM_ADDRESS,address+2,ml_8); //保存校验参数0~6 次低8位
delay(16000000);
Wr24C080(EEPROM_ADDRESS,address+3,l_8); //保存校验参数0~6 最低8位
delay(16000000);
}
}
else //已经校准过
{
for(i=0; i<7; i++)
{
switch(i)
{
case 0:
{
address = 0x00;
break;
}
case 1:
{
address = 0x10;
break;
}
case 2:
{
address = 0x20;
break;
}
case 3:
{
address = 0x30;
break;
}
case 4:
{
address = 0x40;
break;
}
case 5:
{
address = 0x50;
break;
}
case 6:
{
address = 0x60;
break;
}
default:
{
break;
}
}
h_8 = Rd24C080(EEPROM_ADDRESS,address); //读取校验参数0~6 最高8位
delay(4000);
mh_8 = Rd24C080(EEPROM_ADDRESS,address+1); //读取校验参数0~6 次高8位
delay(4000);
ml_8 = Rd24C080(EEPROM_ADDRESS,address+2); //读取校验参数0~6 次低8位
delay(4000);
l_8 = Rd24C080(EEPROM_ADDRESS,address+3); //读取校验参数0~6 最低8位
delay(4000);
calibration_number[i] = ((h_8<<24)|(mh_8<<16)|(ml_8<<8)|(l_8));
}
TSOK = 1; //触摸屏已校正
}
}
}
校准使用的是
已上传到我的资源下载“S3C2440触摸屏程序包含校准库”
这是校准库的头文件
#ifndef __TSLIB_H__
#define __TSLIB_H__
struct ts_sample {
int x;
int y;
unsigned int pressure;
// struct timeval tv;
};
struct tsdev{
int ts_x;
int ts_y;
} ;
extern int tsflag;
extern int calibration_number[7];
extern struct tsdev ts;
#endif