UCGUI移植

1. 必须编写好LCD的驱动函数,当然如果uCGUI中已经包含了移植需要的LCD底层驱动,就不用再编写。如果没有就需要编写好LCD的底层驱动。底层驱动需要包含如下函数:

①.LCD_Init    ():LCD初始化函数。

②.LCD_SetPixel(): LCD画点函数。

③.LCD_GetPixel(): LCD读点颜色函数。 

2.编写好这三个函数后,可以直接在LCDDummy.C或LCDTemplate.C文件中添加相应的代码

 

①.添加画点函数:

void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex){

  /* Write into hardware ... Adapt to yoursystem */

  {

    /* ... */ 添加画点函数

  }

}

 

    ②.添加获取像素点颜色函数:

unsigned int LCD_L0_GetPixelIndex(int x, int y) {

  /* Read from hardware ... Adapt to yoursystem */

  {

PixelIndex = 0;

/* ... */ 添加获取像素点颜色函数

  }

  return PixelIndex;

}

③.添加初始化函数:

int  LCD_L0_Init(void) {

  LCD_INIT_CONTROLLER(); // 把这句改成LCD_Init    ();

  return 0;

}

 

       2.触摸屏的移植

       在使用触摸屏之前必须将Config目录下GUIConf.h中的GUI_SUPPORT_TOUCH设置为1,由于项目中使用了操作系统所以同时将GUI_OS也设置为1。触摸屏触点位置的获得是通过调用GUI/core/目录中GUI_TOUCH_DriverAnalog.c文件中的 GUI_TOUCH_Exec()函数来实现的,对该函数进行修改后的伪代码如下:

void GUI_TOUCH_Exec(void)

{

             读取触点在触摸屏上(x,y)点实际坐标值;

             进行实际坐标值到逻辑坐标的转换;

             调用GUI_TOUCH_StoreState(x,y)保存逻辑坐标值;

}

系统为了实时得到触点坐标,就要不断调用GUI_TOUCH_Exec()函数。因此需要在uc/os-ii操作系统中建立一个单独的任务对该函数进行调用,这样可以保证触摸屏任务的实时响应。实现方式如下:

voidTask_Touch(void*id){                     //建立触摸屏任务

  while(1){ GUI_TOUCH_Exec();            //调用此函数

            OSTimeDly(1);     }          //延时一个时钟节拍

  }

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

五点校准算法

typedef struct {
    int x[5], xfb[5];
    int y[5], yfb[5];
    int a[7];
} calibration;

calibration rev;

int perform_calibration(calibration *cal)  //五点校准算法

{
    int j= 0;
    float n= 0, x= 0, y= 0, x2= 0, y2= 0, xy= 0, z= 0, zx= 0, zy= 0;
    float det= 0, a= 0, b= 0, c= 0, e= 0, f= 0, i= 0;
    float scaling = 65536.0;

// Get sums for matrix   
    for(j=0;j<5;j++) {
        n  += 1.0;
        x  += (float)cal->x[j];                       //ljg:??X
        y  += (float)cal->y[j];                       //ljg:??Y;
        x2 += (float)(cal->x[j]*cal->x[j]);      //ljg:??X  ???
        y2 += (float)(cal->y[j]*cal->y[j]);      //ljg:??Y  ???
        xy += (float)(cal->x[j]*cal->y[j]);      //ljg:??XY??
    }

// Get determinant of matrix -- check if determinant is too small
    det = n*(x2*y2 - xy*xy) + x*(xy*y - x*y2) + y*(x*xy - y*x2);
    if(det < 0.1 && det > -0.1) {
        //printf("ts_calibrate: determinant is too small -- %f\n",det);
        return 0;
    }


// Get elements of inverse matrix     //??D[J]
    a = (x2*y2 - xy*xy)/det;
    b = (xy*y - x*y2)/det;
    c = (x*xy - y*x2)/det;
    e = (n*y2 - y*y)/det;
    f = (x*y - n*xy)/det;
    i = (n*x2 - x*x)/det;
// Get sums for x calibration
    z = 0;
    zx = 0;
    zy = 0;
    for(j=0;j<5;j++) {
        z += (float)cal->xfb[j];
        zx += (float)(cal->xfb[j]*cal->x[j]);
        zy += (float)(cal->xfb[j]*cal->y[j]);
    }

// Now multiply out to get the calibration for framebuffer x coord
    cal->a[0] = (int)((a*z + b*zx + c*zy)*(scaling));
    cal->a[1] = (int)((b*z + e*zx + f*zy)*(scaling));
    cal->a[2] = (int)((c*z + f*zx + i*zy)*(scaling));

    /*printf("%f %f %f\n",(a*z + b*zx + c*zy),
                (b*z + e*zx + f*zy),
                (c*z + f*zx + i*zy));
    */

// Get sums for y calibration
    z = 0;
    zx = 0;
    zy = 0;
    for(j=0;j<5;j++) {
        z += (float)cal->yfb[j];
        zx += (float)(cal->yfb[j]*cal->x[j]);
        zy += (float)(cal->yfb[j]*cal->y[j]);
    }


// Now multiply out to get the calibration for framebuffer y coord
    cal->a[3] = (int)((a*z + b*zx + c*zy)*(scaling));
    cal->a[4] = (int)((b*z + e*zx + f*zy)*(scaling));
    cal->a[5] = (int)((c*z + f*zx + i*zy)*(scaling));

    /*printf("%f %f %f\n",(a*z + b*zx + c*zy),
                (b*z + e*zx + f*zy),
                (c*z + f*zx + i*zy));
    */

// If we got here, we're OK, so assign scaling to a[6] and return
    cal->a[6] = (int)scaling;
    return 1;
}

 

void TOUCH_Adjust(void)
{
    //LCD屏坐标-表示十字的中心坐标
    int rev_x= 0,rev_y= 0;
    int LCD_table[5][2]={{50,50},{750,50},{50,430},{750,430},{400,240}};
    //存放按下屏得到的触摸坐标
    int TOUCH_table[5][2]={0};
    u8 i;
    for(i=0;i<5;i++){
        //显示十字
        LCD_Disshizi(LCD_table[i][0],LCD_table[i][1],GUI_RED);
        //等待触摸
        while(Touchflag==0){ //
            OSTimeDly(200);
        }
        TOUCH_table[i][0]=Cmreadx;
        TOUCH_table[i][1]=Cmready;
        //消除原有十字
        rev.x[i] = TOUCH_table[i][0];
        rev.y[i] = TOUCH_table[i][1];
        rev.xfb[i] =LCD_table[i][0];
        rev.yfb[i] =LCD_table[i][1];
        LCD_Disshizi(LCD_table[i][0],LCD_table[i][1],GUI_BLACK);
        Touchflag=0;
        OpenTouch();
    }
     perform_calibration(&rev);
 
}
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值