完整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度四种方向的任意切换,具体实现的关键代码如下:
- /*
- *********************************************************************************************************
- * 函 数 名: MainTask
- * 功能说明: GUI主函数
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void MainTask(void)
- {
- WM_HWIN hWin;
- WM_CALLBACK *OldCallBack;
- uint8_t ucKeyCode;
- OS_ERR err;
-
-
- /* 初始化 */
- GUI_Init();
-
- /*
- 关于多缓冲和窗口内存设备的设置说明
- 1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
- WM_MULTIBUF_Enable(1);
- 2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
- 3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
- STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
- 感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
- 4. 所有emWin例子默认是开启三缓冲。
- */
- WM_MULTIBUF_Enable(1);
-
- /*
- 触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
- 此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
- */
- //TOUCH_Calibration();
-
- /* 设置桌面窗口的回调函数 */
- OldCallBack = WM_SetCallback(WM_HBKWIN, _cbBkWindow);
-
- /* 创建对话框 */
- hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
-
- /* 设置UTF-8编码 */
- GUI_UC_SetEncodeUTF8();
-
- while(1)
- {
- ucKeyCode = bsp_GetKey();
- if(ucKeyCode != KEY_NONE)
- {
- switch (ucKeyCode)
- {
-
- case KEY_DOWN_K1: /* K1键按下 打印任务执行情况 */
- DispTaskInfo();
- break;
-
- case KEY_DOWN_K2: /* K2键按下 向消息队列发送数据 */
- OSSemPost((OS_SEM *)&SEM_SYNCH,
- (OS_OPT )OS_OPT_POST_1,
- (OS_ERR *)&err);
- break;
-
- case JOY_DOWN_OK: /* 摇杆OK键按下 实现显示方向的切换 */
-
- /*第1步: 删除当前显示的对话框**************************/
- WM_DeleteWindow(hWin);
- WM_SetCallback(WM_HBKWIN, OldCallBack);
- GUI_Delay(1);
-
- /*第2步: 设置emWin的显示方向,0表示横屏,1表示横屏180°,2表示竖屏,3表示竖屏180° */
- g_LcdDirection++; //--------------(1)
- if(g_LcdDirection > 3)
- {
- g_LcdDirection = 0;
- }
-
- switch(g_LcdDirection)
- {
- /* 横屏显示,设置显示方向 */
- case 0: //--------------(2)
- LCD_SetDirection(g_LcdDirection);
- GUI_SetOrientation(0);
- break;
-
- /* 横屏180°,设置显示方向 */
- case 1: //--------------(3)
- LCD_SetDirection(g_LcdDirection);
- GUI_SetOrientation(GUI_MIRROR_X | GUI_MIRROR_Y);
- break;
-
- /* 竖屏,设置显示方向 */
- case 2: //--------------(4)
- LCD_SetDirection(g_LcdDirection);
- GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_Y);
- break;
-
- /* 竖屏180°,设置显示方向 */
- case 3: //--------------(5)
- LCD_SetDirection(g_LcdDirection);
- GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_X);
- break;
- }
-
-
- /*第3步: 现在就可以直接在新窗口上面显示了************************** */
- WM_SetCallback(WM_HBKWIN, _cbBkWindow);
-
- /* 创建对话框 */
- hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback,
- 0, 0, 0);
- break;
-
- default:
- /* 其它的键值不处理 */
- break;
- }
- }
-
- GUI_Delay(5);
- }
- }
复制代码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分辨率: 下图是竖屏和竖屏180°的显示效果,截图是一样的,480*800分辨率: =========================================================== 学会了程序运行时任意切换的方法,也许有初学者更想知道上电后就按照某个方向显示的方法,因为项目中仅需按照某个方向显示即可,无需运行时做切换。这种情况下,用户仅需在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); |