野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27964|回复: 3

[emWin] 如何修改emWin的触摸方向

[复制链接]

发表于 2020-4-15 22:07:26 | 显示全部楼层 |阅读模式
本帖最后由 ZZZ_XXJ 于 2020-11-6 15:09 编辑

2020.11.06更新
经过多次测试发现原来的电阻屏左转90°和右转90°的参数配置有问题,需要修改两个文件,这里把正确的配置贴出来,原来的仍然保留正常竖屏和旋转180°的配置没问题。

电阻屏右转90°:
  1. GUI_X_Touch_Anlog.c
  2. int GUI_TOUCH_X_MeasureX(void)
  3. {return XPT2046_ReadAdc_Fliter(macXPT2046_CHANNEL_X);}
  4. int GUI_TOUCH_X_MeasureY(void)
  5. {return XPT2046_ReadAdc_Fliter(macXPT2046_CHANNEL_Y);}

  6. LCDConf_FlexColor.c
  7. /*设置触摸原点,显示方向:右转90° */
  8. GUI_TOUCH_SetOrientation((GUI_MIRROR_X * LCD_GetMirrorYEx(0)));
  9. /*设置触摸校准,显示方向为左转或右转90°时,需要交换 */
  10. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 240-1, TOUCH_AD_RIGHT, TOUCH_AD_LEFT);
  11. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 320-1, TOUCH_AD_BOTTOM, TOUCH_AD_TOP);
复制代码
电阻屏左转90°:
  1. GUI_X_Touch_Anlog.c
  2. int GUI_TOUCH_X_MeasureX(void)
  3. {return XPT2046_ReadAdc_Fliter(macXPT2046_CHANNEL_X);}
  4. int GUI_TOUCH_X_MeasureY(void)
  5. {return XPT2046_ReadAdc_Fliter(macXPT2046_CHANNEL_Y);}

  6. LCDConf_FlexColor.c
  7. /*设置触摸原点,显示方向:左转转90° */
  8. GUI_TOUCH_SetOrientation((GUI_MIRROR_Y * LCD_GetMirrorXEx(0)));
  9. /*设置触摸校准,显示方向为左转或右转90°时,需要交换 */
  10. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 240-1, TOUCH_AD_RIGHT, TOUCH_AD_LEFT);
  11. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 320-1, TOUCH_AD_BOTTOM, TOUCH_AD_TOP);
复制代码






之前发过一篇帖子,讲了下修改emWin显示方向的方法,链接在这:如何修改emWin的屏幕显示方向不过当时只讲了显示方向,没有讲触摸方向怎么改,所以就再写一篇帖子讲下触摸方向的修改。下面这些方法仅针对野火的开发板和emWin配套例程。

和改显示方向一样,改触摸方向也分两种:电阻屏和电容屏。

1. 电阻屏:
电阻屏的触摸方向修改同样是在GUIConf_flexcolor.c文件中,主要修改的地方在第203行到第209行两个函数的参数,见下图:
企业微信截图_20200415213033.png
首先是GUI_TOUCH_SetOrientation,其实就是靠它来设置触摸方向的,这个函数的原型和可选参数我就不放上来了,在帖子下面会给出每个方向具体的配法。如果不清楚为什么这么调的,可以到《STemWin5.44英文手册第1074页查看。
然后是GUI_TOUCH_Calibrate函数,这个是在触摸校准的时候设置触摸范围用的,只需要改第一个参数就可以了,在左右两侧横屏的时候,把208行和209行的GUI_COORD_X和GUI_COORD_Y换个位置。

这个就是电阻屏改触摸方向需要修改的地方,下面我会把四个方向的触摸配置全部放上来。

正常竖屏:
  1. /*设置触摸原点 */
  2. GUI_TOUCH_SetOrientation((GUI_MIRROR_X * LCD_GetMirrorXEx(0)) |
  3.               (GUI_MIRROR_Y * LCD_GetMirrorYEx(0)) |
  4.               (GUI_SWAP_XY  * LCD_GetSwapXYEx (0)));

  5. /*设置触摸校准 */
  6. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 240-1, TOUCH_AD_RIGHT ,TOUCH_AD_LEFT );
  7. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 320-1,TOUCH_AD_BOTTOM ,TOUCH_AD_TOP );
复制代码


右转90°:
  1. /*设置触摸原点,显示方向:右转90° */
  2. GUI_TOUCH_SetOrientation((GUI_MIRROR_Y * LCD_GetMirrorXEx(0)));
  3. /*设置触摸校准,显示方向为左转或右转90°时,需要交换 */
  4. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 240-1, TOUCH_AD_RIGHT ,TOUCH_AD_LEFT );
  5. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 320-1,TOUCH_AD_BOTTOM ,TOUCH_AD_TOP );
复制代码


左转90°:
  1.   /*设置触摸原点,显示方向:左转90° */
  2.   GUI_TOUCH_SetOrientation((GUI_MIRROR_X * LCD_GetMirrorYEx(0)));
  3.   /*设置触摸校准,显示方向为左转或右转90°时,需要交换 */
  4.   GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 240-1, TOUCH_AD_RIGHT ,TOUCH_AD_LEFT );
  5.   GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 320-1,TOUCH_AD_BOTTOM ,TOUCH_AD_TOP );
复制代码


旋转180°:
  1. /*设置触摸原点,显示方向:旋转180° */
  2. GUI_TOUCH_SetOrientation((GUI_SWAP_XY  * LCD_GetSwapXYEx (0)));
  3. /*设置触摸校准 */
  4. GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 240-1, TOUCH_AD_RIGHT ,TOUCH_AD_LEFT );
  5. GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 320-1,TOUCH_AD_BOTTOM ,TOUCH_AD_TOP );
复制代码


2.电容屏:
因为电容屏是直接返回的触摸点坐标,所以只需要处理触摸坐标就可以了,这方面的例子还是F429挑战者V2的RGB竖屏例程,具体是在触摸检测函数里实现的,见下面的代码:
  1. void GT9xx_GetOnePiont(uint8_t Orientation)
  2. {
  3.     GUI_PID_STATE State;
  4.     GTP_DEBUG_FUNC();
  5.         
  6.     __disable_irq();
  7.    
  8.     Goodix_TS_Work_Func();
  9.         
  10.     __enable_irq();
  11.         
  12.     if((pre_x==-1) || (pre_y==-1))
  13.     {
  14.             State.x = -1;
  15.             State.y = -1;
  16.             State.Pressed = 0;
  17.             State.Layer = 0;
  18.             GUI_TOUCH_StoreStateEx(&State);
  19.             return;
  20.    }
  21.   else
  22.   {
  23.     switch(Orientation)
  24.     {
  25.       case 0:/* 正常 */
  26.         State.x = pre_x;
  27.         State.y = pre_y;
  28.         break;
  29.       case 1:/* 右侧竖屏 */
  30.         State.x = pre_y;
  31.         State.y = LCD_PIXEL_WIDTH - pre_x - 1;  
  32.         break;
  33.       case 2:/* 翻转180° */
  34.         State.x = LCD_PIXEL_WIDTH - pre_x - 1;
  35.         State.y = LCD_PIXEL_HEIGHT - pre_y - 1;
  36.         break;
  37.       case 3:/* 左侧竖屏 */
  38.         State.x = LCD_PIXEL_HEIGHT - pre_y - 1;
  39.         State.y = pre_x;
  40.         break;
  41.       default:
  42.         State.x = pre_x;
  43.         State.y = pre_y;
  44.         break;
  45.     }
  46.     State.Pressed = 1;
  47.     State.Layer = 0;
  48.     GUI_TOUCH_StoreStateEx(&State);
  49.   }
  50. }
复制代码

上面的switch用来判断屏幕方向,然后根据不同的屏幕方向对读到的触摸坐标进行处理。这个就是电容屏修改触摸方向的方法。

================================================================我 是 分 割 线 ================================================================


电容屏里面,F407开发板的修改还不太一样。对于F407,只需要修改LCDConf_FlexColor.c的第186行的LCD_SCAN_MODE就可以了。
企业微信截图_15870910048763.png
407的显示和触摸方向见下面的代码。


正常竖屏: 企业微信截图_20200417105503.png

右转90°横屏:
企业微信截图_20200417105519.png

左转90°横屏:
企业微信截图_20200417105543.png









回复

使用道具 举报

发表于 2020-4-16 21:15:44 | 显示全部楼层

回复

使用道具 举报

发表于 2020-11-6 20:12:01 | 显示全部楼层
野火F103指南者修改横屏GUI_X_Touch_Analog.c也要改
野火论坛202011062011547412..png
回复 支持 反对

使用道具 举报

发表于 2020-11-6 20:12:35 | 显示全部楼层
weirdo 发表于 2020-11-6 20:12
野火F103指南者修改横屏GUI_X_Touch_Analog.c也要改

感谢野火客服帮我解决问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 04:42 , Processed in 0.036708 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表