您的位置 首页 硬件

STM32-触摸屏试验

voidTouch_Init(void);初始化u8Read_ADS(u16*x,u16*y);带舍弃的双方向读取u8Read_ADS2(u16*x,u16*y);带加强滤波的

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函数中有一个问题,看了论坛里好多人问了这个问题:

[cpp]view plaincopy

  1. while(1)
  2. {
  3. key=KEY_Scan();
  4. if(Pen_Point.Key_Sta==Key_Down)//触摸屏被按下
  5. {
  6. Pen_Int_Set(0);//封闭中止
  7. do
  8. {
  9. Convert_Pos();
  10. Pen_Point.Key_Sta=Key_Up;
  11. if(Pen_Point.X0>216&&Pen_Point.Y0<16)Load_Drow_Dialog();//RST区域,点击这个区域将履行清屏
  12. else
  13. {
  14. Draw_Big_Point(Pen_Point.X0,Pen_Point.Y0);//画图
  15. GPIOC->ODR|=1<<1;//PC1上拉
  16. }
  17. }while(PEN==0);//假如PEN一向有用,则一向履行
  18. Pen_Int_Set(1);//敞开中止
  19. }elsedelay_ms(10);
  20. if(key==1)//KEY0按下,则履行校准程序
  21. {
  22. LCD_Clear(WHITE);//清屏
  23. Touch_Adjust();//屏幕校准
  24. Save_Adjdata();
  25. Load_Drow_Dialog();
  26. }
  27. i++;
  28. if(i==20)
  29. {
  30. i=0;
  31. LED0=!LED0;
  32. }
  33. }

这个是论坛里的发问帖,相关帖子及解决办法:http://www.openedv.com/posts/list/1813.htm用到了再研讨。

在正点原子的战舰版例程里,没有运用PEN作为判别条件,规避了这个问题:

[cpp]view plaincopy

  1. while(1)
  2. {
  3. key=KEY_Scan(0);
  4. tp_dev.scan(0);
  5. if(tp_dev.sta&TP_PRES_DOWN)//触摸屏被按下
  6. {
  7. if(tp_dev.x
  8. {
  9. if(tp_dev.x>(lcddev.width-24)&&tp_dev.y<16)Load_Drow_Dialog();//铲除
  10. elseTP_Draw_Big_Point(tp_dev.x,tp_dev.y,RED);//画图
  11. }
  12. }elsedelay_ms(10);//没有按键按下的时分
  13. if(key==KEY_RIGHT)//KEY_RIGHT按下,则履行校准程序
  14. {
  15. LCD_Clear(WHITE);//清屏
  16. TP_Adjust();//屏幕校准
  17. TP_Save_Adjdata();
  18. Load_Drow_Dialog();
  19. }
  20. i++;
  21. if(i==20)
  22. {
  23. i=0;
  24. LED0=!LED0;
  25. }
  26. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/261467.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部