📄 touch7843_44b0.c
字号:
Rect.x1 = LCD_XSIZE-50;
Rect.y1 = LCD_YSIZE-50;
Lcd_Clr(DC,bluecolor);
ellipse (Rect.x0, Rect.y0, 3, 3,redcolor);
VGA_X = 80;
VGA_Y = 150;
Lcd_printf(DC,0x0ff,ncolor," 请长按左上角的小圆,直到小圆消失");
do
{
do
{
memset( CHX_AD,0,sizeof(CHX_AD)/4 );
memset( CHY_AD,0,sizeof(CHY_AD)/4 );
if(!DPen)
{
for(i=0;i<2000000;i++){}
if(!DPen)
{
for(i=0;i<sizeof(CHX_AD)/4;i++)
{
CHX_AD[i] = ReadAD7843_X(); //读ADS7843坐标数据,连续读5个
CHY_AD[i] = ReadAD7843_Y();
}
DataSort( CHX_AD,sizeof(CHX_AD)/4 ); //排序,CHX_AD[0]最小
DataSort( CHY_AD,sizeof(CHY_AD)/4 );
}
}
}while((CHX_AD[4]-CHX_AD[0] > 1) || (CHY_AD[4]-CHY_AD[0] > 1) || CHX_AD[0]>128 || CHY_AD[0]<128 );
Phys_x0 = (CHX_AD[1]+CHX_AD[2]+CHX_AD[3])/3;
Phys_y0 = (CHY_AD[1]+CHY_AD[2]+CHY_AD[3])/3;
Lcd_Clr(DC,bluecolor);
ellipse (Rect.x1, Rect.y1, 3, 3,redcolor);
VGA_X = 80;
VGA_Y = 150;
Lcd_printf(DC,0x0ff,ncolor," 请长按右下角的小圆,直到小圆消失");
do
{
memset( CHX_AD,0,sizeof(CHX_AD)/4 );
memset( CHY_AD,0,sizeof(CHY_AD)/4 );
if(!DPen)
{
for(i=0;i<2000000;i++){}
if(!DPen)
{
for(i=0;i<sizeof(CHX_AD)/4;i++)
{
CHX_AD[i] = ReadAD7843_X(); //读ADS7843坐标数据,连续读5个
CHY_AD[i] = ReadAD7843_Y();
}
DataSort( CHX_AD,sizeof(CHX_AD)/4 ); //排序,CHX_AD[0]最小
DataSort( CHY_AD,sizeof(CHY_AD)/4 );
}
}
}while((CHX_AD[4]-CHX_AD[0] > 1) || (CHY_AD[4]-CHY_AD[0] > 1) || CHX_AD[0]<128 || CHY_AD[0]>128 );
Phys_x1 = (CHX_AD[1]+CHX_AD[2]+CHX_AD[3])/3;
Phys_y1 = (CHY_AD[1]+CHY_AD[2]+CHY_AD[3])/3;
i = WQ_TOUCH_Calibrate(0, Rect.x0, Rect.x1, Phys_x0, Phys_x1); //x
i = WQ_TOUCH_Calibrate(1, Rect.y0, Rect.y1, Phys_y0, Phys_y1); //y
}while (i);
Lcd_Clr(DC,bluecolor);
VGA_X = 170;
VGA_Y = 150;
Lcd_printf(DC,0x0ff,ncolor,"触摸屏校准完成。");
}
/**************************************************************************/
/********************* 触摸屏坐标处理函数 *********************************/
/**************************************************************************/
static void WQ_TOUCH_StoreState(int x,int y)
{
if ((x >= 0) && (y >= 0))
{
ellipse (x, y, 3, 3, redcolor);
}
else
{
}
}
/**************************************************************************/
/********************* 触摸屏事件处理函数 *********************************/
/**************************************************************************/
void WQ_TOUCH_Handle(void)
{
int CHX_AD[5],CHY_AD[5];
int Temp_X=0,Temp_Y=0;
int i,j;
/* calculate Min / Max values */
if (xyMinMax[GUI_COORD_X].Min < xyMinMax[GUI_COORD_X].Max)
{
xMin = xyMinMax[GUI_COORD_X].Min;
xMax = xyMinMax[GUI_COORD_X].Max;
}
else
{
xMax = xyMinMax[GUI_COORD_X].Min;
xMin = xyMinMax[GUI_COORD_X].Max;
}
if (xyMinMax[GUI_COORD_Y].Min < xyMinMax[GUI_COORD_Y].Max)
{
yMin = xyMinMax[GUI_COORD_Y].Min;
yMax = xyMinMax[GUI_COORD_Y].Max;
}
else
{
yMax = xyMinMax[GUI_COORD_Y].Min;
yMin = xyMinMax[GUI_COORD_Y].Max;
}
for(j=0;j<3;j++) //最多有三次读触摸屏;
{
memset( CHX_AD,0,sizeof(CHX_AD)/4 );
memset( CHY_AD,0,sizeof(CHY_AD)/4 );
for(i=0;i<sizeof(CHX_AD)/4;i++)
{
CHX_AD[i] = ReadAD7843_X(); //读ADS7843坐标数据,连续读5个
CHY_AD[i] = ReadAD7843_Y();
}
DataSort( CHX_AD,sizeof(CHX_AD)/4 ); //排序,CHX_AD[0]最小
DataSort( CHY_AD,sizeof(CHY_AD)/4 );
if(((CHX_AD[4] - CHX_AD[0]) < 3) && ((CHY_AD[4] - CHY_AD[0]) < 3) \
&& (CHX_AD[1] >xMin) && (CHX_AD[3]<xMax) && (CHY_AD[1] > yMin) && (CHY_AD[3]<yMax))
{
Temp_X = (CHX_AD[1]+CHX_AD[2]+CHX_AD[3])/3;
Temp_Y = (CHY_AD[1]+CHY_AD[2]+CHY_AD[3])/3;
Temp_X = _AD2X(Temp_X); //A\D坐标转换为象素坐标
Temp_Y = _AD2Y(Temp_Y);
break; //若读取在允许误差之内则退出;
}
else
{
for(i=0;i<100;i++);
}
}
if(Temp_X && Temp_Y)
{
WQ_TOUCH_StoreState(Temp_X,Temp_Y); //触摸屏接口函数
}
else
{
WQ_TOUCH_StoreState(-1,-1);
}
}
static unsigned char Touch_DownUp = 0; //当按下并有效置1;当松开并有效置0;
static void TouchEven_Handle(void)
{
unsigned char TouchEven = 0; //按下\松开有效时置1;
if(Touch_DownUp == 0)
{
if( !DPen )
{
TouchEven = 1; //有效点击
}
else
{
TouchEven = 0; //无效点击;或者是干扰
}
}
else
{
if(DPen)
{
TouchEven = 1; //松开触摸,有效;
}
else
{
TouchEven = 0; //干扰;而不是松开触摸
}
}
if(TouchEven)
{
if(Touch_DownUp == 0)
{
Touch_DownUp = 1;
WQ_TOUCH_Handle(); //调用自己编写的触摸屏处理函数
}
else
{
Touch_DownUp = 0;
WQ_TOUCH_StoreState(-1,-1);
}
}
}
static void Timer2_On(void)
{
rTCON |= Timer2_Update; //装载定时器初值;
rTCON &= ~Timer2_Update;
rI_ISPC = BIT_TIMER2; //清除中断标志
rINTMSK &= ~BIT_TIMER2; //Timer2 interrupt enable;
rTCON |= Timer2_Start; //启动定时器2, 20ms后中断
}
static void Timer2_Off(void)
{
rINTMSK |= BIT_TIMER2; //Timer2 interrupt disable;
rTCON &= ~Timer2_Start; //Timer2 stop;
}
static void __irq Timer2_Int(void)
{
Timer2_Off();
TouchEven_Handle();
rI_ISPC = BIT_TIMER2; //清除中断标志
}
static void Timer2Interrupt_Init(void) //定时器2中断注册
{
unsigned int kc;
kc = 0xffffff & ( ( (int)Timer2_Int - (unsigned int)ISR_TIMER2-8 )>>2 );
*(unsigned int*)ISR_TIMER2 = 0xEA000000 |kc ;
}
static void Timer2_Init(void)
{
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= (0x95<<8); //Timer2预分频->150;
rTCFG1 &= ~(0x0f<<8);
rTCFG1 |= (0x03<<8); //Timer2分割器->1/16;MCLK = 60M; Timer2CLK = 25000Hz
rTCON &= ~(0x0f<<12); //Timer2: auto load->off;inverter->off;
rTCNTB2 = 0x2ee; //Timer2 初值;定时30ms;
Timer2Interrupt_Init();
rI_ISPC = BIT_TIMER2; //清除中断标志
}
unsigned char Touch7843_Init(void)
{
//GPC2=Output(7843_DIN);GPC0=Input(7843_DOUT);GPC3=Output(7843_DCLK);
rPCONC &= ~( 0xff );
rPCONC |= ( 0x50 );
rPUPC &= ~( 0x0f );
rPUPC |= ( 0x03 ); //Pin 7843_DOUT pull up disable;
ReadAD7843_X();
ReadAD7843_Y(); //初始化ADS7843;
Timer2_Init();
return 1;
}
void GUI_Touch_Check(void)
{
if( !Touch_DownUp && !DPen && !(rTCON&Timer2_Start) )
{
Timer2_On();
}
if( Touch_DownUp && DPen && !(rTCON&Timer2_Start) )
{
Timer2_On();
}
}
void OS_Touch_Check(void)
{
if( !Touch_DownUp && !DPen )
{
//OSTimeDly(20);
TouchEven_Handle();
}
if( Touch_DownUp && DPen )
{
//OSTimeDly(20);
TouchEven_Handle();
}
}
void ReadTouch_Data(void)
{
int TempXMin,TempXMax,TempYMin,TempYMax;
TempXMin=Rd24LCxx(0xa0,0);
TempXMax=Rd24LCxx(0xa0,1);
TempYMin=Rd24LCxx(0xa0,2);
TempYMax=Rd24LCxx(0xa0,3);
if(labs(xyMinMax[GUI_COORD_X].Min-TempXMin)<20 && labs(xyMinMax[GUI_COORD_X].Max-TempXMax)<20)
{
xyMinMax[GUI_COORD_X].Min = TempXMin;
xyMinMax[GUI_COORD_X].Max = TempXMax;
}
if(labs(xyMinMax[GUI_COORD_Y].Min-TempYMin)<20 && labs(xyMinMax[GUI_COORD_Y].Max-TempYMax)<20)
{
xyMinMax[GUI_COORD_Y].Min = TempYMin;
xyMinMax[GUI_COORD_Y].Max = TempYMax;
}
}
void Touch_Task(void)
{
GUI_Touch_Check();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -