void Touch_Init(void);//初始化
u8 Read_ADS(u16 *x,u16 *y); //带放弃的双方向读取
u8 Read_ADS2(u16 *x,u16 *y); //带加强滤波的双方向坐标读取
u16 ADS_Read_XY(u8 xy); //带滤波的坐标读取(单方向)
u16 ADS_Read_AD(u8 CMD); //读取AD转化值
void ADS_Write_Byte(u8 num); //向操控芯片写入一个数据
void Drow_Touch_Point(u8 x,u16 y);//画一个坐标叫准点
void Draw_Big_Point(u8 x,u16 y); //画一个大点
void Touch_Adjust(void); //触摸屏校准
void Save_Adjdata(void); //保存校准参数
u8 Get_Adjdata(void);//读取校准参数
void Pen_Int_Set(u8 en);//PEN中止使能/封闭
void Convert_Pos(void); //成果转化函数
以上是touch.c里边的首要函数:
1.void Touch_Init(void); //初始化
包括时钟初始化、EXTI1中止设置,敞开了line1上的中止,设置了下降沿触发
2.u8 Read_ADS(u16 *x,u16 *y); //带放弃的双方向读取
单次读取坐标函数
3.u8 Read_ADS2(u16 *x,u16 *y); //带加强滤波的双方向坐标读取
二次读取坐标
4.u16 ADS_Read_XY(u8 xy); //带滤波的坐标读取(单方向)
接连读取READ_TIMES次数据,对这些数据升序摆放,然后去掉最低和最高LOST_VAL个数,取平均值
5.u16 ADS_Read_AD(u8 CMD); //读取AD转化值
6.void ADS_Write_Byte(u8 num); //向操控芯片写入一个数据
7.void Drow_Touch_Point(u8 x,u16 y);//画一个坐标叫准点
8.void Draw_Big_Point(u8 x,u16 y); //画一个大点
绘图写字函数
9.void Touch_Adjust(void); //触摸屏校准
10.void Save_Adjdata(void); //保存校准参数
校准出来的坐标参数保存在2401里边
11.void Pen_Int_Set(u8 en);//PEN中止使能/封闭
触摸屏被按下即触发中止,能够运用这个函数暂时关掉中止,等候绘图结束再翻开
12.void Convert_Pos(void); //成果转化函数
触摸屏读出的坐标是物理坐标,程序中运用的坐标是LCD像素坐标,用这个函数作为转化
main函数中有一个问题,看了论坛里好多人问了这个问题:
- while(1)
- {
- key=KEY_Scan();
- if(Pen_Point.Key_Sta==Key_Down)//触摸屏被按下
- {
- Pen_Int_Set(0);//封闭中止
- do
- {
- Convert_Pos();
- Pen_Point.Key_Sta=Key_Up;
- if(Pen_Point.X0>216&&Pen_Point.Y0<16)Load_Drow_Dialog();//RST区域,点击这个区域将履行清屏
- else
- {
- Draw_Big_Point(Pen_Point.X0,Pen_Point.Y0);//画图
- GPIOC->ODR|=1<<1;//PC1上拉
- }
- }while(PEN==0);//假如PEN一向有用,则一向履行
- Pen_Int_Set(1);//敞开中止
- }elsedelay_ms(10);
- if(key==1)//KEY0按下,则履行校准程序
- {
- LCD_Clear(WHITE);//清屏
- Touch_Adjust();//屏幕校准
- Save_Adjdata();
- Load_Drow_Dialog();
- }
- i++;
- if(i==20)
- {
- i=0;
- LED0=!LED0;
- }
- }
这个是论坛里的发问帖,相关帖子及解决办法:http://www.openedv.com/posts/list/1813.htm用到了再研讨。
在正点原子的战舰版例程里,没有运用PEN作为判别条件,规避了这个问题:
- while(1)
- {
- key=KEY_Scan(0);
- tp_dev.scan(0);
- if(tp_dev.sta&TP_PRES_DOWN)//触摸屏被按下
- {
- if(tp_dev.x
- {
- if(tp_dev.x>(lcddev.width-24)&&tp_dev.y<16)Load_Drow_Dialog();//铲除
- elseTP_Draw_Big_Point(tp_dev.x,tp_dev.y,RED);//画图
- }
- }elsedelay_ms(10);//没有按键按下的时分
- if(key==KEY_RIGHT)//KEY_RIGHT按下,则履行校准程序
- {
- LCD_Clear(WHITE);//清屏
- TP_Adjust();//屏幕校准
- TP_Save_Adjdata();
- Load_Drow_Dialog();
- }
- i++;
- if(i==20)
- {
- i=0;
- LED0=!LED0;
- }
- }