关于UCGUI移植是X镜像,Y镜像,以及交换XY,横竖屏的小问题
2016-06-03 16:58
567 查看
移植UCGUI的方法网上讲的很详细,大概就是三步:
1. 准备好屏的驱动函数(名字随便取, uint 即 unsigned int):
void LCD_Init(void) (屏的硬件初始化)
void LCD_DrawPoint(uint x, uint y, uint color) (在屏上(x,y)点画一个颜色为color的点)
uint LCD_GetPoint(uint x, uint y) (获取屏上点(x,y)的颜色)
2. 建好工程,把UCGUI的源码弄进去,把驱动也放进去。
3. 修改LCDDummy.c文件(有的版本是LCDTemplate.c文件)
(1)在 LCD_L0_Init 函数中调用 LCD_Init 函数
(2)把 LCD_L0_GetPixelIndex 函数的内容改成
return LCD_GetPoint(x, y)
(3)把LCD_L0_SetPixelIndex 函数的内容改成
LCD_DrawPoint(x, y, color)
最后, 修改UCGUI的一些配置
网上看了好多移植方法,(2)(3)我看到的都是直接替换。
这样移植没有什么问题,但是今天手里一块TFT屏模块(控制器ili9325),屏幕的内容一直是X镜像的,不管怎么写R3寄存器都不变。
看到UCGUI里面有几个宏定义 LCD_SWAP_XY , LCD_MIRROR_X, LCD_MIRROR_Y
。意义很明显
LCD_SWAP_XY
交换XY
LCD_MIRROR_X
镜像X
LCD_MIRROR_Y
镜像Y
这不正是我需要的吗?!
于是,把LCD_MIRROR_X的值修改为1,编译下载,居然还是那样!!是不是我把哪里不该改的地方改了??
我就改了那三个函数,和一些配置,肯定是把函数里面的东西改错了!!
原函数LCD_L0_SetPixelIndex的内容是这样的
移植时候是直接替换内容的,一直也没出什么问题,现在一看,果然有问题!!这里面有对镜像和交换XY的处理,而我们的代码只需要写到那个大括号里面。即改为
这里要注意,不能直接用x,y了,要用xPhys,yPhys,也就是物理意义上的坐标。
LCD_L0_GetPixelIndex 函数同理,这里就不再赘述!!
这个问题其实很简单,源码的注释也很明显,但是移植时候没有仔细看,是个教训。
另外,横屏也可以通过 LCD_SWAP_XY ,LCD_MIRROR_X,LCD_MIRROR_Y 这几个宏定义配合完成。
具体方法:
把屏的X和Y的大小交换
修改 LCD_SWAP_XY 的值为 1
修改 LCD_MIRROR_Y 的值为 1 (修改LCD_MIRROR_X理论上也可以,只是屏幕得反过来看)
本人水平有限,有什么遗漏或错误,欢迎指出!!
1. 准备好屏的驱动函数(名字随便取, uint 即 unsigned int):
void LCD_Init(void) (屏的硬件初始化)
void LCD_DrawPoint(uint x, uint y, uint color) (在屏上(x,y)点画一个颜色为color的点)
uint LCD_GetPoint(uint x, uint y) (获取屏上点(x,y)的颜色)
2. 建好工程,把UCGUI的源码弄进去,把驱动也放进去。
3. 修改LCDDummy.c文件(有的版本是LCDTemplate.c文件)
(1)在 LCD_L0_Init 函数中调用 LCD_Init 函数
(2)把 LCD_L0_GetPixelIndex 函数的内容改成
return LCD_GetPoint(x, y)
(3)把LCD_L0_SetPixelIndex 函数的内容改成
LCD_DrawPoint(x, y, color)
最后, 修改UCGUI的一些配置
网上看了好多移植方法,(2)(3)我看到的都是直接替换。
这样移植没有什么问题,但是今天手里一块TFT屏模块(控制器ili9325),屏幕的内容一直是X镜像的,不管怎么写R3寄存器都不变。
看到UCGUI里面有几个宏定义 LCD_SWAP_XY , LCD_MIRROR_X, LCD_MIRROR_Y
。意义很明显
LCD_SWAP_XY
交换XY
LCD_MIRROR_X
镜像X
LCD_MIRROR_Y
镜像Y
这不正是我需要的吗?!
于是,把LCD_MIRROR_X的值修改为1,编译下载,居然还是那样!!是不是我把哪里不该改的地方改了??
我就改了那三个函数,和一些配置,肯定是把函数里面的东西改错了!!
原函数LCD_L0_SetPixelIndex的内容是这样的
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) { GUI_USE_PARA(x); GUI_USE_PARA(y); GUI_USE_PARA(PixelIndex); /* Convert logical into physical coordinates (Dep. on LCDConf.h) */ #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y int xPhys = LOG2PHYS_X(x, y); int yPhys = LOG2PHYS_Y(x, y); #else #define xPhys x #define yPhys y #endif /* Write into hardware ... Adapt to your system */ { /* ... */ } }
移植时候是直接替换内容的,一直也没出什么问题,现在一看,果然有问题!!这里面有对镜像和交换XY的处理,而我们的代码只需要写到那个大括号里面。即改为
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) { GUI_USE_PARA(x); GUI_USE_PARA(y); GUI_USE_PARA(PixelIndex); /* Convert logical into physical coordinates (Dep. on LCDConf.h) */ #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y int xPhys = LOG2PHYS_X(x, y); int yPhys = LOG2PHYS_Y(x, y); #else #define xPhys x #define yPhys y #endif /* Write into hardware ... Adapt to your system */ { LCDDrawPoint(xPhys,yPhys,PixelIndex) } }
这里要注意,不能直接用x,y了,要用xPhys,yPhys,也就是物理意义上的坐标。
LCD_L0_GetPixelIndex 函数同理,这里就不再赘述!!
这个问题其实很简单,源码的注释也很明显,但是移植时候没有仔细看,是个教训。
另外,横屏也可以通过 LCD_SWAP_XY ,LCD_MIRROR_X,LCD_MIRROR_Y 这几个宏定义配合完成。
具体方法:
把屏的X和Y的大小交换
修改 LCD_SWAP_XY 的值为 1
修改 LCD_MIRROR_Y 的值为 1 (修改LCD_MIRROR_X理论上也可以,只是屏幕得反过来看)
本人水平有限,有什么遗漏或错误,欢迎指出!!
相关文章推荐
- iOS开发UI篇—Quartz2D使用(矩阵操作)
- 用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)
- iOS开发之UITextField的使用详解
- BuildYourOwnLisp Why we need enum
- C#队列(Queue)
- iOS开发UI篇—Quartz2D使用(图形上下文栈)
- EasyUI JS加载Tree
- iOS开发UI篇—Quartz2D简单使用(二)
- 转载一篇优秀博文 UICollectionView基础
- JMeter之 Non-GUI Mode (Command Line mode)
- Juicer 使用范例
- iOS开发UI篇—Quartz2D简单使用(一)
- UIDocumentInteractionController浏览文件
- iOS中UICollectionView及其常用方法
- Jira和Confluence集成Crowd实现SSO-构建高效的团队协作工具
- version `GFORTRAN_1.4' not found (required by /usr/lib/liblapack.so.3) 问题的解决方案
- break与continue
- Orocos 无锁数据操作 Muliti Writer Single Reader Queue
- 完全定制UITabBarViewController
- iOS开发之UITapGestureRecognizer单双击