📄 touch2410.c
字号:
for (i = 0; i < ADCount - 1; i++){
Uart_Printf("%d,",tmp[i]);
}
Uart_Printf("\n");
#endif
//fill table
//ArrayCmp是一个表格,表格的第一列存储各点之间的差值,
//第二列存储相同的点连续存放的个数
/* 举例:
tmp[] : 2,0,0,0,2,0,0,2,2
ArrayCmp[]如下:
下标 差值 连续个数
0 2 0
1 0 2
2 0 -2
3 0 -1
4 2 0
5 0 1
6 0 -2
7 2 1
*/
ArrayCmp[0].difsize = tmp[0];
ArrayCmp[0].continuecount = 0;
k = 0;
for(i = 1; i < ADCount - 1; i++){
if ((tmp[i] == tmp[i - 1]) && (diftag == 0)){
ArrayCmp[i].difsize = tmp[i];
ArrayCmp[i].continuecount = -2;
ArrayCmp[i - 1].continuecount = 1;
diftag = 1;
k = i - 1;
}else if ((tmp[i] == tmp[i - 1]) && (diftag == 1)){
ArrayCmp[i].difsize = tmp[i];
ArrayCmp[i].continuecount = -1;
ArrayCmp[k].continuecount += 1;
diftag = 1;
}else{ //(tmp[i] != tmp[i - 1])
ArrayCmp[i].difsize = tmp[i];
ArrayCmp[i].continuecount = 0;
diftag = 0;
}
}
#if (isDebug == 1)
Uart_Printf("ArrayCmp:\n ");
for (i = 0; i < ADCount - 1; i++){
Uart_Printf("%d, %d, %d\n",i, ArrayCmp[i].difsize, ArrayCmp[i].continuecount);
}
Uart_Printf("\n");
#endif
//scan table
//扫描ArrayCmp[]中差值最小且连续个数最多的点的下标
k = 0;
for (i = 1; i < ADCount - 1; i++){
if (ArrayCmp[i].difsize < ArrayCmp[k].difsize)
k = i;
else if (ArrayCmp[i].difsize == ArrayCmp[k].difsize){
if (ArrayCmp[i].continuecount >= ArrayCmp[k].continuecount)
k = i;
}
}
Dat0 = p[k];
#endif
return Dat0;
}
/*
***********************************************************************************************************
* 函数名称: GetTouch_XY_AD(void)
*
* 函数功能: 写给触摸屏控制器控制字,把触摸屏控制器转换的AD值放到接收变量AD_XY中
*
* 输入参数: 无
*
* 返回值 : AD_XY
***********************************************************************************************************
*/
unsigned int GetTouch_XY_AD(void){
int Dat0, i;
int* p;
//转换次数
unsigned int x, y; //存放转换结果
unsigned int AD_XY = 0; //存放最终XY的转换结果
p = ArrayDat0; //初始化累加变量
while ((rADCDAT0 & 0x8000) | (rADCDAT1 & 0x8000));//测试rADCDAT的bit15是否等于0(触笔按下状态)
//X,Y分别转换模式
rGPGUP = 0xffff; //设置GPIO,禁止GPG上拉
rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(1); //设置转换X的位置
//rADCTSC=(0<<8)|(1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(1); //设置转换X的位置
for(i = 0; i < ADCount; i++){ //开始转换X,共ADCount次
if (ad_flag==1)
{rADCCON = (1<<14)|(49<<6)|(7<<3)|(0<<2)|(0<<1)|(1); //设置控制寄存器
while(rADCCON & 0x1); //测试转换开始位
while(!(0x8000 & rADCCON)); // 测试ECFLG位,转换是否结束
Delay(20);
ArrayDat0[i] = (rADCDAT0) & 0x3ff;
ad_flag==0;
}
else
{rADCCON = (1<<14)|(49<<6)|(7<<3)|(0<<2)|(0<<1)|(0); }
//Dat0 += (rADCDAT0) & 0x3ff; //转换结果累加,最后取平均
}
Dat0 = GetDat0(p);
if (Dat0 != 0){ //如果X有效,继续转换Y
x = Dat0;
#if (isDebug == 1)
for (i = 0; i < ADCount; i ++){
Uart_Printf("%d, ", ArrayDat0[i]);
}
Uart_Printf("\n");
#endif
rADCTSC=(0<<8)|(1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(2); //设置转换Y的位置
//rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(2); //设置转换Y的位置
Delay(100);
for (i = 0; i < ADCount; i++){ //开始转换Y,共ADCount次
rADCCON = (1<<14)|(49<<6)|(5<<3)|(0<<2)|(0<<1)|(1); //设置控制寄存器
while(rADCCON & 0x1); //测试转换开始位
while(!(0x8000 & rADCCON)); // 测试ECFLG位,转换是否结束
Delay(20);
//Dat0 += (rADCDAT1) & 0x3ff; //转换结果累加,最后取平均
ArrayDat0[i] = (rADCDAT1) & 0x3ff;
}
Dat0 = GetDat0(p);
y = Dat0;
#if (isDebug == 1)
for (i = 0; i < ADCount; i ++){
Uart_Printf("%d, ",ArrayDat0[i]);
}
Uart_Printf("\n",ArrayDat0[i]);
#endif
}
rGPGUP = 0x00; //设置GPIO,使能GPG上拉
Uart_Printf("采样结果::x: %d, y: %d\n",x, y);
#if (isDebug == 1)
Uart_Printf("采样结果::x: %d, y: %d\n",x, y);
#endif
AD_XY = (x << 16) | y; //高16位存放X,低16位存放Y
//恢复等待中断模式
Touch_Init();
Delay(1000);
while (!((rADCDAT0 & 0x8000) & (rADCDAT1 & 0x8000))); //测试rADCDAT的bit15是否等于1(触笔抬起状态)
return AD_XY;
}
/*
***********************************************************************************************************
* 函数名称: AD2X(int adx)
* 函数功能: 把AD值转换成X坐标值
* 输入参数: adx
* 返回值 : X坐标值
***********************************************************************************************************
*/
int AD2X(int adx) // 把AD值转换成坐标值 x
{
return GUI_TOUCH_XSIZE * (GUI_TOUCH_AD_LEFT - adx) / (GUI_TOUCH_AD_LEFT - GUI_TOUCH_AD_RIGHT);
}
/*
***********************************************************************************************************
* 函数名称: AD2Y(int ady)
* 函数功能: 把AD值转换成Y坐标值
* 输入参数: ady
* 返回值 : Y坐标值
***********************************************************************************************************
*/
int AD2Y(int ady) // 把AD值转换成坐标值 y
{
return GUI_TOUCH_YSIZE * (GUI_TOUCH_AD_TOP - ady) / (GUI_TOUCH_AD_TOP - GUI_TOUCH_AD_BOTTOM);
}
void Timer1_init(void)
{
rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000; //配置GPG口为信号输出
rGPGDAT = rGPGDAT | 0x300;
rTCFG0 = 255; // Prescaler0=255
rTCFG1 = 0 << 4; //
rTCNTB1 = 976; // 在pclk=50MHZ下,1秒钟的记数值rTCNTB1 = 50000000 / 4 / 256 = 48828;
rTCMPB1 = 0x00;
rTCON = (1 << 11) | (1 << 9) | (0 << 8); //禁用定时器1,手动加载
rTCON = (1 << 11) | (0 << 9) | (1 << 8); //启动定时器1,自动装载
}
void __irq Timer1_ISR( void )
{
ad_flag = 1;
rSRCPND |= BIT_TIMER1;
rINTPND |= BIT_TIMER1;
}
/*
*************************************************************************************************************
- 函数名称 : void Timer1INT_Init(void)
- 函数说明 : 定时器中断初始化程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Timer1INT_Init(void) //定时器接口使能
{
if ((rINTPND & BIT_TIMER1))
{
rSRCPND |= BIT_TIMER1;
}
pISR_TIMER1 = (int)Timer1_ISR;
rINTMSK &= ~(BIT_TIMER1); //开中断;
}
/*
*************************************************************************************************************
*- 结束文件 -*
*************************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -