您的位置:首页 > 产品设计 > UI/UE

关于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的内容是这样的

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理论上也可以,只是屏幕得反过来看)

本人水平有限,有什么遗漏或错误,欢迎指出!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: