硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2608|回复: 0
收起左侧

[emWin教程入门篇] 第74章      附件I--程序运行时横竖屏任意切换简易

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2017-4-19 15:40:49 | 显示全部楼层 |阅读模式
完整65章+12章附件教程下载地址:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=19834





第74章      附件I--程序运行时横竖屏任意切换简易说明


        本教程配套的横竖屏切换例子是通过函数GUI_SetOrientation来实现(关于这个函数的使用和相关知识,看官方手册即可,讲解比较清楚),通过这个函数可以在程序运行时任意切换。显示切换后,触摸也要跟着切换,否则触摸是不正确的。
        横竖屏切换的两个例子是:
            V6-613_STemWin实验_程序运行时横竖屏任意切换(RTOS)
            V6-614_STemWin实验_程序运行时横竖屏任意切换(裸机)
        这两个例子的功能是一样的,都实现了横屏,横屏180度,竖屏和竖屏180度四种方向的任意切换,具体实现的关键代码如下:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: MainTask
  4. *    功能说明: GUI主函数
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void MainTask(void)
  10. {
  11.      WM_HWIN hWin;
  12.      WM_CALLBACK *OldCallBack;
  13.      uint8_t ucKeyCode;
  14.      OS_ERR      err;
  15.    
  16.    
  17.      /* 初始化 */
  18.      GUI_Init();
  19.    
  20.      /*
  21.       关于多缓冲和窗口内存设备的设置说明
  22.         1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
  23.            WM_MULTIBUF_Enable(1);
  24.         2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
  25.         3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
  26.            STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
  27.            感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
  28.         4. 所有emWin例子默认是开启三缓冲。
  29.      */
  30.      WM_MULTIBUF_Enable(1);
  31.    
  32.      /*
  33.        触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
  34.         此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
  35.      */
  36.     //TOUCH_Calibration();
  37.    
  38.      /* 设置桌面窗口的回调函数 */
  39.      OldCallBack = WM_SetCallback(WM_HBKWIN, _cbBkWindow);
  40.    
  41.      /* 创建对话框 */
  42.      hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  43.    
  44.      /* 设置UTF-8编码 */
  45.      GUI_UC_SetEncodeUTF8();
  46.    
  47.      while(1)
  48.      {
  49.          ucKeyCode = bsp_GetKey();
  50.          if(ucKeyCode != KEY_NONE)
  51.          {
  52.               switch (ucKeyCode)
  53.               {
  54.                   
  55.                    case KEY_DOWN_K1:           /* K1键按下 打印任务执行情况 */
  56.                        DispTaskInfo();        
  57.                        break;
  58.                   
  59.                    case KEY_DOWN_K2:           /* K2键按下 向消息队列发送数据 */
  60.                        OSSemPost((OS_SEM *)&SEM_SYNCH,
  61.                                   (OS_OPT  )OS_OPT_POST_1,
  62.                                   (OS_ERR *)&err);         
  63.                        break;
  64.                   
  65.                    case JOY_DOWN_OK:           /* 摇杆OK键按下 实现显示方向的切换 */
  66.                      
  67.                        /*第1步: 删除当前显示的对话框**************************/
  68.                        WM_DeleteWindow(hWin);
  69.                        WM_SetCallback(WM_HBKWIN, OldCallBack);
  70.                        GUI_Delay(1);
  71.                    /*第2步: 设置emWin的显示方向,0表示横屏,1表示横屏180°,2表示竖屏,3表示竖屏180° */
  72.                        g_LcdDirection++;         //--------------(1)
  73.                        if(g_LcdDirection > 3)
  74.                        {
  75.                             g_LcdDirection = 0;
  76.                        }
  77.                      
  78.                        switch(g_LcdDirection)
  79.                        {
  80.                             /* 横屏显示,设置显示方向 */
  81.                             case 0:               //--------------(2)
  82.                                  LCD_SetDirection(g_LcdDirection);
  83.                                  GUI_SetOrientation(0);
  84.                                  break;
  85.                            
  86.                             /* 横屏180°,设置显示方向 */
  87.                             case 1:              //--------------(3)
  88.                                  LCD_SetDirection(g_LcdDirection);
  89.                                  GUI_SetOrientation(GUI_MIRROR_X | GUI_MIRROR_Y);
  90.                                  break;
  91.                            
  92.                             /* 竖屏,设置显示方向 */                     
  93.                             case 2:             //--------------(4)
  94.                                  LCD_SetDirection(g_LcdDirection);
  95.                                  GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_Y);
  96.                                  break;
  97.                             /* 竖屏180°,设置显示方向 */                              
  98.                             case 3:              //--------------(5)
  99.                                  LCD_SetDirection(g_LcdDirection);
  100.                                  GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_X);
  101.                                  break;                          
  102.                        }
  103.                      
  104.                      
  105.                        /*第3步: 现在就可以直接在新窗口上面显示了************************** */
  106.                        WM_SetCallback(WM_HBKWIN, _cbBkWindow);
  107.                      
  108.                         /* 创建对话框 */
  109.                        hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback,
  110. 0, 0, 0);
  111.                        break;
  112.                    default:
  113.                         /* 其它的键值不处理 */
  114.                        break;
  115.               }
  116.          }   
  117.         
  118.          GUI_Delay(5);
  119.      }
  120. }
复制代码
1.     变量g_LcdDirection(用户自己定义的全局变量,非emWin的全局变量)是在bsp_tft_lcd.c文件中定义的,用来作为显示屏显示方向的标识,0表示横屏,1表示横屏180°,2表示竖屏,3表示竖屏180°。这个变量要被:
        电阻触摸屏bsp_touch.c文件中的触摸扫描函数TOUCH_CapScan,
        电容触摸屏bsp_gt811.c文件中的触摸扫描函数GT811_OnePiontScan
        电容触摸屏bsp_ts_ft5x06.c文件中的触摸扫描函数FT5X06_OnePiontScan所调用,
        因为显示屏显示方向切换后,触摸检测也需要跟着切换。
2.     横屏显示,通过函数LCD_SetDirection更新显示屏的宽的全局变量g_LcdWidth和高的全局变量g_LcdHeight(用户定义的函数和全局变量),宽和高的全局变量要被:
        电阻触摸屏bsp_touch.c文件中的触摸扫描函数TOUCH_CapScan,
        电容触摸屏bsp_gt811.c文件中的触摸扫描函数GT811_OnePiontScan,
        电容触摸屏bsp_ts_ft5x06.c文件中的触摸扫描函数FT5X06_OnePiontScan所调用。
        通过函数GUI_SetOrientation设置显示屏的显示方向,这个是emWin提供的函数,特别注意这个函数比较耗emWin动态内存,要保证emWin的动态内存至少能够存储整个显示屏的一帧数据才可以使用。
3.     横屏180°显示,实现方法同第2条,其中函数GUI_SetOrientation参数在emWin手册中讲解比较清楚。
4.     竖屏显示,实现方法同第2条,其中函数GUI_SetOrientation参数在emWin手册中讲解比较清楚。
5.     竖屏180°显示,实现方法同第2条,其中函数GUI_SetOrientation参数在emWin手册中讲解比较清楚。
下图是横屏和横屏180°的显示效果,截图是一样的,800*480分辨率:
74.1.png
下图是竖屏和竖屏180°的显示效果,截图是一样的,480*800分辨率:
74.2.png
===========================================================
        学会了程序运行时任意切换的方法,也许有初学者更想知道上电后就按照某个方向显示的方法,因为项目中仅需按照某个方向显示即可,无需运行时做切换。这种情况下,用户仅需在emWin初始化函数GUI_Init后调用如下三个函数即可(根据不同的显示方向,选择其中的一组)。
/* 横屏显示调用如下三个函数  */
g_LcdDirection = 0
LCD_SetDirection(g_LcdDirection);
GUI_SetOrientation(0);
/* 横屏180°显示调用如下三个函数  */
g_LcdDirection = 0
LCD_SetDirection(g_LcdDirection);
GUI_SetOrientation(GUI_MIRROR_X | GUI_MIRROR_Y);
/* 竖屏显示调用如下三个函数  */
g_LcdDirection = 0
LCD_SetDirection(g_LcdDirection);
GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_Y);
/* 竖屏180°显示调用如下三个函数  */
g_LcdDirection = 0
LCD_SetDirection(g_LcdDirection);
GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_X);
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 21:21 , Processed in 0.235331 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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