tag 标签: 嵌入式,屏幕

相关博文
  • 热度 9
    2013-7-25 20:40
    2875 次阅读|
    0 个评论
      最近做项目,碰到写触摸屏的校准和去抖,在网上找了找都没有找到,憋了很长时间,在同事和经理的帮助下今天终于完美的解决了,完成的那一刻很激动,这是毕业半个月后攻克的最难得问题(对于我来说).下面具体说说是怎么实现的. void screen_adjust(void) {           uint8_t n = 1,k = 0,n1 = 0,n2 = 0,n3 = 0,n4 = 0;   //  float tpkbuf ,tpbbuf ;  float lcdx = 0,lcdy = 0;  float AA ,BB ,CC ,DD ;  float AA_tpx,AA_tpy,BB_tpx,BB_tpy,CC_tpx,CC_tpy,DD_tpx,DD_tpy;  float Atp ,Btp ,Ctp ,Dtp ;  uint16_t quit_location ; //  quit_position = (uint16_t *)malloc(sizeof(uint16_t)*2);       Active_Window(0,319,0,239);  Chk_Busy();  Memory_Clear_with_Font_BgColor();//8E中的0位为1 , 以文字背景色清除  Chk_Busy();  Memory_Clear();//开始清除  Chk_Busy();  Draw_cross(n);//画四个十字坐标  while(1)  {    TP_enable();//开启触摸屏中断   if(wipe_shake())//是否有触摸,如果有触摸为真且把值存放到tpx和tpy中   {    wipe_shake_count();    TP_disable(); clear_lcd_position(lcd); // coordinate_to_pixel(lcd);    lcd = 320 - 320*tpx/1024; lcd = 240*tpy/1024;    if(1 == n) { if(in_scope(lcd,gImage_cross1_value)) {    TP_disable();    buzzer300();    n++;    Draw_cross(2); AA = tpx; AA = tpy; n1++; continue; } } if(2 == n) { if(in_scope(lcd,gImage_cross2_value)) { buzzer300(); n++;    Draw_cross(3); BB = tpx; BB = tpy; n2++; continue; } } if(3 == n) { if(in_scope(lcd,gImage_cross3_value)) {       buzzer300(); n++;    Draw_cross(4); CC = tpx; CC = tpy; n3++; continue; } } if(4 == n) { if(in_scope(lcd,gImage_cross4_value)) { buzzer300(); n = 1; Draw_cross(n); DD = tpx; DD = tpy; n4++; if(n1=1 n2=1 n3= 1 n4 = 1) { break; } } } }  }  TP_disable();  Draw_cross(0);//最后点击完显示都是黑色的cross  //把四个点本来正常的tpx,tpy求出来  pixel_to_tp(25,25,Atp);  pixel_to_tp(295,25,Btp);  pixel_to_tp(295,215,Ctp);  pixel_to_tp(25,215,Dtp);  //count_ABCDEF(Atp,Btp,Ctp,AA,BB,CC);  /*  AA_tpx = (AA + AA + AA )/3;  AA_tpy = (AA + AA + AA )/3;  BB_tpx = (BB + BB + BB )/3;  BB_tpy = (BB + BB + BB )/3;  CC_tpx = (CC + CC + CC )/3;  CC_tpy = (CC + CC + CC )/3;  DD_tpx = (DD + DD + DD )/3;  DD_tpy = (DD + DD + DD )/3;   */  AA_tpx = AA ;  AA_tpy = AA ;  BB_tpx = BB ;  BB_tpy = BB ;  CC_tpx = CC ;  CC_tpy = CC ;  DD_tpx = DD ;  DD_tpy = DD ;  lefttop_x = (AA_tpx + DD_tpx)/2;  //  这里得到的值是模数转换后的值 数字值  rightbot_x = (CC_tpx + BB_tpx)/2;  //  lefttop_y = (AA_tpy + BB_tpy)/2; //lefttop相当于A的位置 LCD像素的位置为25,25  rightbot_y = (CC_tpy + DD_tpy)/2; //rightbot相当于C的位置 LCD像素方向的坐标为295,215 // lefttop_x = AD_coordinate(ts_lefttop_x,1); // lefttop_y = AD_coordinate(ts_lefttop_x,0); // rightbot_x = AD_coordinate(ts_rightbot_x,1); // rightbot_y = AD_coordinate(ts_rightbot_y,0);    //根据ts_lefttop 和 ts_rightbot的坐标可以校准了,把这个值应该写入flash中  tpkx = 280/(lefttop_x-rightbot_x);  tpbx = 20;  tpky = 200/(rightbot_y-lefttop_y);  tpby = 20; //上面的几个值的意义,tpkx,tpky分别是x,y方向的斜率,tpbx,tpby分别是x,y方向的b值 求LCD像素方向的x,y要分别求每个方向的k,b 这是一个线性关系  RA_Button_create(140,100,40,50,150,110,"Quit",0,0); // RA_Button_create(20,20,280,200,150,110,"Quit",0,0);  TP_enable();    //下面是对触摸是否准确进行测试用的  while(1)  {   TP_enable(); if(wipe_shake()) { wipe_shake_count(); lcdx = 0;            lcdy = 0;    lcdx = 320 - (tpkx*(tpx-rightbot_x)+tpbx); lcdy = tpky*(tpy-lefttop_y)+tpby; //lcdx = tpkx*(tpx-rightbot_x)+tpbx; //lcdy = tpky*(tpy-rightbot_x)+tpby; // lcdx = 320-tpx*320/1024; // lcdy = 320*tpy/1024; buzzer300(); Text_Foreground_Color(0xE0);                  Geometric_Coordinate(lcdx,lcdx+2,lcdy,lcdy+2);                 Draw_square_fill();        TP_disable(); }  }    while(1)  {   TP_enable();   if(TP_XY())//是否有触摸,如果有触摸为真且把值存放到tpx和tpy中   {     //   wipe_shake_count(); clear_lcd_position(lcd);          //  lcd = 0;          //  lcd = 0;        TP_disable(); coordinate_to_pixel(lcd);   // lcdx = tpkx*(tpx-rightbot_x)+tpbx; // lcdy = tpky*(tpy-lefttop_y)+tpby; //  pixel_to_coordinate(gImage_quit_value,quit_location);//获取点击位置的坐标 // tpx = A*tpx1 + B*tpy1 + C; // tpy = D*tpx1 + E*tpy1 + F; if(in_scope(lcd,gImage_quit_value)) { buzzer300(); break; } }  } } uint8_t wipe_shake(void)//去抖动函数,关键点是要去除前十次的值和最后一次的值,你可以用串口输出值看看,前面的值比较不稳定,而且是间隔10ms采样一次 { uint8_t ss,i = 0,j = 0,k = 0; if(is_touch())         {            tpx=0;         tpy=0;         } // mSDelay(100);         for(ss=0;ss20;ss++)     {    tpx = 0;    tpy = 0;             if(is_touch())             {             i++; tpy_array =tpy;             tpx_array =tpx;    }    else    { break;     }    mSDelay(10);     } TP_disable(); tpx = 0; tpy = 0; if(i == 20) {      return 1; } return 0; } void wipe_shake_count(void) { uint32_t sumx = 0,sumy = 0;                 uint8_t times = 1;  for(times = 10; times19 ;times++) {    sumx = sumx + tpx_array ;     sumy = sumy + tpy_array ; } tpx = sumx/9; tpy = sumy/9; } 具体代码都贴出来了,有什么不懂的可以留言