UCGUI+触摸在STM32上的移植

首先要准备好TFT屏幕的驱动(包括TFT显示以及触摸的驱动),要求在裸机的情况下实现TFT屏幕的正常显示以及触摸。
其中UCGUI的移植需要两个函数:一个是设置某个点颜色的函数 LCD_SetPointColor()。另一个是读取某个点的函数 LCD_GetPointColor()。
当然,这两个函数的名字可以随便设置。


触摸的移植也需要两个函数:一个是读取X方向AD值的函数(),一个是读取Y方向AD值的函数()


驱动写好了之后,接下来就可以开始移植了。


首先是UCGUI的移植。


第一步:
需要配置几个文件:




GUIConf.h的配置如下,如果有些东西不需要的话,可以把相应的定义改为0。例如,只移植UCGUI,不移植操作系统,可以把GUI_OS改为0.


#define GUI_OS                    (1)  /* Compile with multitasking support */
#define GUI_SUPPORT_TOUCH         (1)  /* Support a touch screen (req. win-manager) */
#define GUI_SUPPORT_UNICODE       (1)  /* Support mixed ASCII/UNICODE strings */


#define GUI_DEFAULT_FONT          &GUI_Font6x8
#define GUI_ALLOC_SIZE            5000  /* Size of dynamic memory ... For WM and memory devices*/




/*********************************************************************
*
*         Configuration of available packages
*/


#define GUI_WINSUPPORT            1  /* Window manager package available */
#define GUI_SUPPORT_MEMDEV        1  /* Memory devices available */
#define GUI_SUPPORT_AA            1  /* Anti aliasing available */
















LCDConf.h的配置如下


#define LCD_XSIZE          (320)
#define LCD_YSIZE          (240)
#define LCD_CONTROLLER     (1289)
#define LCD_BITSPERPIXEL   (16)
#define LCD_FIXEDPALETTE   (565)
#define LCD_SWAP_RB        (1)
//#define LCD_SWAP_XY        (1)
#define LCD_INIT_CONTROLLER()  {Touch_Init();SSD1289_Init();}


其中LCD_XSIZE,LCD_YSIZE这两个根据自己的屏幕的大小来修改。
LCD_CONTROLLER         控制器型号的定义
LCD_INIT_CONTROLLER() 这是系统UCGUI在初始化的时候要调用的宏定义,所以这里需要包含你TFT屏的初始化和触摸屏的初始化(如果需要触摸的话)。














LCDDummy.c文件
LCDDummy.c文件需要修改3个函数以及一个宏定义


(1)宏修改
#if (LCD_CONTROLLER == -1) \


&& (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
将-1改为跟LCDConf.h文件中定义的一样。在这里即为1289




(2)LCD_L0_Init   LCD初始化函数
int  LCD_L0_Init(void) 
{


  LCD_INIT_CONTROLLER() ;          //对应LCDConf.h文件中的宏定义


  return 0;


}


(3)LCD_L0_GetPixelIndex  
unsigned int  LCD_L0_GetPixelIndex(int  x , int  y)
{
  LCD_PIXELINDEX 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


  /* Read from hardware ... Adapt to your system 需要自己添加的部分*/


  {
     //这里添加自己的代码,就是读取坐标为(x,y)处的颜色的代码或者函数。我的是LCD_GetPointColor(x,y);
     //所以我在这添加的代码是
     PixelIndex=LCD_GetPointColor(x,y);
  }


  return PixelIndex;


}


(4)LCD_L0_SetPixelIndex


void  LCD_L0_SetPixelIndex (int  x , int  y , int  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 以下部分需要自己去写的,对应自己的lcd驱动文件*/






  {


//这里添加自己的代码,就是设置坐标为(x,y)处的颜色的代码或者函数。我的是LCD_SetPointColor(x,y);
        //所以我在这添加的代码是
LCD_SetPointColor(x,y);


  }






}






















这些都修改完毕之后,在程序的开头只要调用GUI_Init()函数,就可以用UCGUI库中的函数来进行显示了。












一直好显示之后,接下来移植触摸


GUI_X_Touch.c文件


需要自己修改以及修改之后的函数如下.
int  GUI_TOUCH_X_MeasureX(void) 






{






  return   Touch_MeasurementX(); //对应触摸驱动中的读取x值函数 ,需要一些简单的滤波,中值滤波就够了






}












int  GUI_TOUCH_X_MeasureY(void) 






{






  return  Touch_MeasurementY(); //对应触摸驱动中的读取y值函数,需要一些简单的滤波,中值滤波就够了






}






GUI_X.c文件




需要自己修改以及修改之后的函数如下.


void  GUI_X_Log (const char *s)  { GUI_USE_PARA(s); }






void  GUI_X_Warn (const char *s)  { GUI_USE_PARA(s); }






void  GUI_X_ErrorOut(const char *s)  { GUI_USE_PARA(s); }




GUI_X_uCOS.c文件


static  void  CheckInit (void) 






{






if (KeyIsInited == 0) 






{






        KeyIsInited = 1;






        GUI_X_Init();






}






}


/*WM空闲时调用*/


void GUI_X_ExecIdle (void) 






{






    //OS_X_Delay(1); 原内容  //没一直操作系统






    OSTimeDly(50); //新内容   //一直了操作系统






}



GUITouchConf.h文件

#define GUI_TOUCH_SWAP_XY       0
#define GUI_TOUCH_MIRROR_X      0
#define GUI_TOUCH_MIRROR_Y      0


#define GUI_TOUCH_AD_LEFT       350      //上,下,左,右的AD值,根据实际修改,不要一般都差不多。
#define GUI_TOUCH_AD_RIGHT      3860
#define GUI_TOUCH_AD_TOP        300
#define GUI_TOUCH_AD_BOTTOM     3900
















最近在弄ucGUI移植,网上搜了不少资料,也问了同学,总算把简单的一个程序弄好了,现在跟大家分享下心得。该程序是直接用的原子大哥的TFTLCD显示的例子,直接拿过来移植的。所用到的是原子大哥TFTLCD例子(库函数版本)和ucGUI3.90源码。 建工程就不说了,附件里有,相信大家也看到别人建的工程了,下面直接说重点。 由于ucGUI移植笔记内容太多,就介绍其中几点(具体的还需看附件内容): 1. 如果LCD驱动文件是lcd.c和lcd.h,最好改为别的名字,比如ili93xx.c和ili93xx.h。然后还要把LCD_Init()初始化函数改为LCDx_Init(); 2. 需要改的地方: A. LCDConf.h中按照下面的图就行,其余的可以删除掉,注意红框中是刚刚改过的LCD初始化函数,改为刚刚更改的初始化函数就行。 B.接下来事GUIConf.h中的设置,目前只是用到简单的一个现实函数,多以就全部设为0 C. 这个是LCD驱动函数的修改,这三个最好改红框选中的文件。 接下来就是更改的第一块,首先的把第1部所更改的相应的LCD底层函数的头文件加进来,不然ucGUI没办法正常工作。然后就是第二个红框给为自己的驱动芯片型号。 再就是第二块,找到画蓝线的两个函数,用方框里的函数取代,如果是用原子大哥的,第一个函数必须要用快速画点函数,因为函数参数里有颜色这个参数,画点函数没有,如果是别的程序,也是一样,加入画点函数就行,但必须要有颜色的参数。第二个函数就是读取某点的颜色值的函数,加进来就行,我这儿直接就用了原子大哥的程序。 3. 最后修改主函数 有人纳闷了,为什么把LCD初始化函数 给注释掉了,没关系,在前面 文件中不是有个宏定义嘛 这个宏定义已经在 这个文件中调用,见下图哦 还有一项特别注意的,如果你用原子大哥的LCD初始化函数,移植完后,你会发现你的屏幕先白屏一下之后就马上黑屏,而且后面无论设置什么颜色都是这样的情况。在调用GUI_Init()的时候,这个函数会进入LCD_Init(),然后再LCD_Init()函数里面有这样的语句 #if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR) /* Clear video memory */ LCD_SetDrawMode(GUI_DRAWMODE_REV); LCD_FillRect(0,0, GUI_XMAX, GUI_YMAX); LCD_SetDrawMode(0); #endif 这句#if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR)里面的GUI_DEFAULT_BKCOLOR 初值是OXFFFF, GUI_INVALID_COLOR 初值也是0XFFFF,而原子哥的初始化函数最后有一句LCD_Clear(WHITE);这样就把 GUI_INVALID_COLOR 的值设置成了0X0000;导致调用了下面的三个函数。从而出现上面的问题。只要把 原子哥 的初始化函数LCD_Clear(WHITE); 注释掉就不会错了,小问题大错误。这是引用的hua290565456的帖子里的话,觉得很有用,就粘贴过来了。 这就是一个基本的ucGUI移植。该笔记放在附件了,有工程和源码,还有此贴的word文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值