微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32-触摸屏实验

STM32-触摸屏实验

时间:11-23 来源:互联网 点击:
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. }


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top