OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6193|回复: 2

ucGUI移植(uc/OS-II操作系统版本/非操作系统版本)

[复制链接]

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2011-5-21
在线时间
0 小时
发表于 2013-6-7 22:40:00 | 显示全部楼层 |阅读模式
两个uc/GUI移植范例:
Comment:
1. 编译环境: EWARM V5.41 ;
2. 实例类型: (1)基于uc/OS-II版本
                    (2)非操作系统版本
3. 硬件环境: 火牛开发板(STM32F103VET6)
4. 附件



基于红牛开发板的移植范例:
 编译环境: EWARM V5.41 ;




IMG_0138.JPG
IMG_0132.JPG
IMG_0129.JPG
IMG_0137.JPG

STM32_GUI.rar

4.84 MB, 下载次数: 314

STM32_ucOSIIGUI.rar

5.77 MB, 下载次数: 250

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2011-5-21
在线时间
0 小时
 楼主| 发表于 2013-6-7 23:16:16 | 显示全部楼层
重新移植注意事项:

一、 LCD层的移植
1. 找到上图标注目录;
2. 在该目录下有如下文件: ili9320.c、ili9320.h、ili9320_api.c、ili9320_touch.c、ili9320_ucgui.c,期中ili9320.c、ili9320.h为LCD驱动层,ili9320_api.c 中实现ili9320_ucgui.c
    需要的函数GUI_Line(u16 x0, u16 y0, u16 x1, u16 y1,u16 color);而在ili9320_ucgui.c文件中需要实现如下这些函数即可:
int LCD_L0_Init(void)

  ili9320_Initializtion();
  return 0;
}

void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
  ili9320_SetPoint(x,y,PixelIndex);
}

unsigned int LCD_L0_GetPixelIndex(int x, int y)
{
  return ili9320_GetPoint(x,y);
}

3. 以上步骤及完成LCD层的移植;

二、 Touch 移植
Touch 层真正要实现的函数只有两个:

int  Touch_MeasurementX(void)
{
    return GUI_TOUCH_X_MeasureX();
}

int  Touch_MeasurementY(void)
{
    return GUI_TOUCH_X_MeasureY();
}
其也是GUI需要直接调用的函数,而GUI_TOUCH_X_MeasureX和GUI_TOUCH_X_MeasureY的函数原型如下,
他们用于获取Touch屏的物理坐标。

int  GUI_TOUCH_X_MeasureX(void)
{
    unsigned char t=0,t1,count=0;
    unsigned short int databuffer[10]={5,7,9,3,2,6,4,0,3,1};//数据组
    unsigned short temp=0,X=0; 
   
    while(count<10) //循环读数10次
    {      
        databuffer[count]=TPReadX();
        count++;
    } 
    if(count==10)//一定要读到10次数据,否则丢弃
    { 
        do       //将数据X升序排列
        { 
            t1=0;   
            for(t=0;t<count-1;t++)
            {
                if(databuffer[t]>databuffer[t+1])//升序排列
                {
                  temp=databuffer[t+1];
                  databuffer[t+1]=databuffer[t];
                  databuffer[t]=temp;
                  t1=1;
                } 
            }
        }while(t1);              
        X=(databuffer[3]+databuffer[4]+databuffer[5])/3;  
    //  if(X<=3730&&Y<=3730) //个人的屏根据初始参数修改.
    //  {
    //   if(X>=330)X-=330;
    //   else X=0;
    //   if(Y>=420)Y-=420;
    //   else Y=0; 
    //   drawbigpoint(240-X/14,320-Y/10); 
    //  } 
    }
    return(X); 
}

int  GUI_TOUCH_X_MeasureY(void)
{
    unsigned char t=0,t1,count=0;
    unsigned short int databuffer[10]={5,7,9,3,2,6,4,0,3,1};//数据组
    unsigned short temp=0,Y=0; 
   
    while(count<10) //循环读数10次
    {      
        databuffer[count]=TPReadY();
        count++; 
    } 
    if(count==10)       //一定要读到10次数据,否则丢弃
    { 
        do              //将数据X升序排列
        { 
            t1=0;   
            for(t=0;t<count-1;t++){
                if(databuffer[t]>databuffer[t+1])       //升序排列
                {
                    temp=databuffer[t+1];
                    databuffer[t+1]=databuffer[t];
                    databuffer[t]=temp;
                    t1=1;
                } 
            }
        }while(t1);              
        Y=(databuffer[3]+databuffer[4]+databuffer[5])/3;  
        //  if(X<=3730&&Y<=3730) //个人的屏根据初始参数修改.
        //  {
        //   if(X>=330)X-=330;
        //   else X=0;
        //   if(Y>=420)Y-=420;
        //   else Y=0; 
        //   drawbigpoint(240-X/14,320-Y/10); 
        //  }  
    }
    return(Y);
}

以上为uc/GUI的简要移植步骤,当然,对于ili9320_api.c、ili9320_touch.c 两个文件还可以简化其内部函数,其调用的函数全部在Driver层实现,
这样可以简化GUI的移植步骤,且程序层次架构清晰。

作者将ili9320_api.c 简化只包含如下几个函数:

void GUI_APIInit( void )
{
   // GLCD_Init(); 
}

void GUI_APIDrawPoint(int x, int y, int PixelIndex)
{
    LCD_DrawPoint( x, y, PixelIndex);
}

int GUI_APIGetPoint(int x,int y)
{
    return LCD_ReadPoint(x,y);
}

void GUI_APIDrawLine(int x0, int y0, int x1, int y1,int color)
{
}

对于 ili9320_touch.c 文件,其包含如下函数:

static int GUI_TouchAPIX( void )
{
    return Touch_MeasureX();
}

static int GUI_TouchAPIY( void )
{
    return Touch_MeasureY();
}


int  GUI_TOUCH_X_MeasureX(void)
{
    return GUI_TouchAPIX(); 
}

int  GUI_TOUCH_X_MeasureY(void)
{
    return GUI_TouchAPIY(); 
}


void GUI_TOUCH_X_ActivateX(void)
{
 
}

void GUI_TOUCH_X_ActivateY(void)
{
 
}

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-7 23:38:47 | 显示全部楼层
回复【2楼】tmfwt:
---------------------------------
cool
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 22:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表