最近公司事情不是很多又恰好公司有块NXP的板子所以就拿来玩玩,板子是LPC1788,哇,看了1788的简介后感觉应该能干过stm32啊,不知道国内为什么没有大面积使用。哈哈,不管这些了,还有一点1788自带LCD控制器,哈哈这个真不错!好了开始正题了。 1. 首先假设你的LCD已经能正常显示了,在移植emWin时先到NXP官网下载emWin的库,我下的是5.16版本的。下载解压后会看到三个文件和一份说明,这个自己看看就行了。
2. 在你的工程文件中添加个emWin文件,把刚才下载的emWin库拷到新建的emWin文件夹下,好了,准备工作做好了
3. 打开你的工程,并向工程中添加三个文件夹,emWin/Config、emWin/Library、emWin/Header,再想三个文件夹中分别添加emWin库中的所有文件,注意在Library中只需要添加一个对应你MCU的库文件,我的1788是M3内核的,所以选择M3。同时各文件路径也要添加上。那么整体结构如下:
4. 好了,现在开始修改文件了,首先修改 GUIConf.c 文件。这里只要修改 void GUI_X_Config(void)函数。因为我这里LCD的存储放在外部SDRAM,所以这里gui的存储空间也选择外部。修改如下:
------改成这样------
这里还要定义 LCD_GUI_RAM_BASE, 添加如下:
又来了一个,这个 LCD_VRAM_BASE_ADDR 就是你LCD存储的起始位置,这个定义在我的LCD驱动文件中,后面会介绍的;这里不要忘了包含你LCD驱动的头文件。
5. 修改 GUIConf.h 文件, 这里修改一些宏定义 ,选择不使用OS、不使用触摸屏,不使用鼠标, 那个GUI_NUM_LAYER (16)就可以了。
6. 再来修改 LCDConf.c 文件, 首先配置你的 LCD 分辨率及像素:
- //
- // Physical display size
- //
- #define XSIZE_PHYS (480)
- #define YSIZE_PHYS (272)
- #define VXSIZE_PHYS (XSIZE_PHYS)
- #define VYSIZE_PHYS (YSIZE_PHYS)
- //
- // Color conversion
- //
- #define COLOR_CONVERSION GUICC_M565
- //
- // Display driver
- //
- #define DISPLAY_DRIVER GUIDRV_LIN_16
- //
- // Pixel width in bytes
- //
- #define PIXEL_WIDTH 2
复制代码 我的是480*272, RGB565的。然后在修改两个函数就可以了。 7. 还是 LCDConf.c 文件,修改 void LCD_X_Config(void)函数,修改成这样:
- void LCD_X_Config(void) {
- //
- // Set display driver and color conversion for 1st layer
- //
- GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
- //
- // Display driver configuration, required for Lin-driver
- //
- LCD_SetPosEx(0, 0, 0);
- if (LCD_GetSwapXYEx(0)) {
- LCD_SetSizeEx (0, YSIZE_PHYS, XSIZE_PHYS);
- LCD_SetVSizeEx(0, VYSIZE_PHYS, VXSIZE_PHYS);
- } else {
- LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS);
- LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
- }
- LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR);
- //
- // Set user palette data (only required if no fixed palette is used)
- //
- #if defined(PALETTE)
- LCD_SetLUTEx(0, PALETTE);
- #endif
- }
复制代码 再修改 int LCD_X_DispDriver()函数,改成如下形式:- int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
- int r;
- switch (Cmd) {
- case LCD_X_INITCONTROLLER: {
- //
- // Called during the initialization process in order to set up the
- // display controller and put it into operation. If the display
- // controller is not initialized by any external routine this needs
- // to be adapted by the customer...
- //
- // ...
- _InitController(0);
- // GLCD_Init(NULL, NULL);
- return 0;
- }
- case LCD_X_SETORG: {
- //
- // Required for setting the display origin which is passed in the 'xPos' and 'yPos' element of p
- //
- LCD_X_SETORG_INFO * p;
- p = (LCD_X_SETORG_INFO *)pData;
- _SetDisplayOrigin(p->xPos, p->yPos);
- //...
- return 0;
- }
- default:
- r = -1;
- }
- return r;
- }
复制代码
|