UCGUI移植经验总结 BYBYBYBY :机长
如果没有找到 ucGUI 没有提供你所使用的 LCD 驱动,看完本文章,定有大收获。
本教程是将 ucGUI 移植到 STM32 单片机 。 LCD 驱动器为 HX8347 。 为了教程有更大的通用性, LCD 驱动程序未采用 ucGUI 官方提供。编译环境为 5.4 。
本教程可作为其它单片机、 LCD 、编译环境的参考。
不足之处,敬请指出。
1 解压 “ u c GUI-V3-90a---- 非常好用 .rar ”
这个版本的优点:需要改动的地方少;编译时不会由于在 Linux 环境下编辑源代码 , 然后又拿回 IAR 环境编译造成 大量 “ Warning[Pa050]: …… ” ; LCD 底层驱动获取方便,不依赖于 u c GUI 官方驱动。
顺次打开 “ uCGUI-V3-90a → UCGUI390a → Start ” 。 将 Start 文件夹下的 Config 和 GU I
文件夹复制的自己所建立工程文件夹。
然后打开 IAR ,在 Workspace 中添加 Config 和 GUI 文件夹内容。添加完后,如下图所示。其中 “ FWLib ” 是我的工程中所需要的,属于多余项。
对应 LCD 驱动程序,此处填 -1 ,然后 解压 “ u c GUI-V3-90a---- 非常好用 .rar ” ,打开 GUI 文件夹下的 LCDDriver 文件夹,打开 LCDDummy.c 文件进一步配置,具体配置在第 5 步讲 */
#define LCD_FIXEDPALETTE 565 /* 定义颜色查询表,此处选择与 LCD 有关,具体参数查看 LCD 资料,查询颜色格式。然后打开 GUI 文件夹下的 ConvertColor 文件夹 ,查找对应文件进行配置 */
#define LCD_SWAP_RB 1 /* 激活红 、 蓝基色的交换 。 此处建议首先配置为 0 。待所有配置完成后,运行程序,设定全屏显示为蓝色。如果显示为红色,改为 1 ,即可正常显示 */
#define LCD_INIT_CONTROLLER() LCD_InitPanel() /*LCD_InitPanel() 是之前已经编写好的 LCD 初始化程序,非 ucGUI 自带 */
如果说 LCD 自带的驱动程序已经对寄存器进行了配置,那么以下寄存器配置语句,请注释掉,否则在程序运行时可能会出现错误。
LCD_WRITE_REGLH(0x00>>1,LCD_REG0,LCD_REG1); \
LCD_WRITE_REGLH(0x02>>1,LCD_REG2,LCD_REG3); \
LCD_WRITE_REGLH(0x04>>1,LCD_REG4,LCD_REG5); \
同理,找到 void LCD_L0_GetPixelIndex 函数,在其留空处,调用 LCD 在获取( x,y )处以某一颜色的函数。
通过以上几步 , ucGUI 移植基本完成 。 接下来所要做的就是 , 编写测试函数 , 然后将整个程序进行编译。有错误,该错误。如果遇到 ucGUI 的变量没有定义,则在出现的错误文件开头加入 ucGUI 对应的头文件。
Ex: 调用 GUI_SetColor(GUI_BLACK);
编译时,出现错误,提示 GUI_BLACK 没有定义。则只需在出现错误的 C 文件开头加上 “ #include "GUI.h" ” ,即可解决。
6 底层配置优化
如果 ucGUI 已经移植成功,并通过测试,那么请继续看这一节。如果没有,请跳过。
在测试 ucGUI 时 , 我发现 , 在刷屏 ( 将 LCD 屏幕全部填充为某一颜色 ) 时 , 调用 ucGU I的刷屏函数 , 远不如 LCD 的刷屏函数执行速度快 。 通过测试 , ucGUI 的刷屏速度不及 LC D的 20 分之 1 。
通过查看 ucGUI 的底层文件,我找到了 ucGUI 刷屏速度慢的原因。
ucGUI 的画图机制是找到某一个点 , 然后对其进行颜色填充 ; 然后再找下一个点对其进行颜色填充。我们通常所用的 LCD 驱动器,如果说所画图像,某一区域颜色单一,在设定绘图区域后,顺次进行颜色填充,无需找一个点画一个点。这就是 ucGUI 画图时不如 LC D速度快的原因。
优化的方法很简单:
打开对应的 ucGUI 的 LCDDriver 文件夹下的 LCD 驱动程序 C 文件。找到 “ voidLCD_L0_DrawHLine (int x0, int y, int x1) ” 函 数 。 将 “ else ” 语 句 下 的“ LCD_L0_SetPixelIndex(x0, y, LCD_COLORINDEX); ” 改写为 LCD 颜色填充函数 。 比如说 ,我将其改为了 “ LCD_WriteRAM(LCD_COLORINDEX) ” 。这样的话,不再找一个点画一个点。大大加快了 ucGUI 的画图执行速率。
本节小结:此种优化方法并不适用于所有的 LCD 驱动器。 ucGUI 画图时采取找一个点画一个点的方法,应该是出于程序通用性的考虑。如果 ucGUI 移植完成后,刷屏效果可以接受,为了程序稳定性考虑,不建议进行优化。
常见问题解决:
如果移植后,显示的画面进行了横竖翻转,或者镜像翻转。只需要在 LCDConf.h 文件中,加入以下语句
完整的pdf格式文档51黑下载地址:
ucGUI移植经验总结.pdf
(290.02 KB, 下载次数: 63)
|