⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 touchpad.lst

📁 hx8347 初始化,刷屏,图片显示
💻 LST
📖 第 1 页 / 共 2 页
字号:
 282          /*==================================================================
 283          * Function      : tp_read_adc
 284          * Description   : 得到触摸坐标
 285          * Input Para    : void
 286          * Output Para   : U16 * X, U16 * Y,若全为0表示获得坐标不成功
 287          * Return Value: void
 288          ==================================================================*/
 289          void tp_read_adc(U16 * X, U16 * Y)
 290          {
 291   1              U8 cmd = 0;
 292   1              
 293   1         /*读取X 坐标X ADC*/
 294   1              cmd=TOUCH_PANEL_START_BIT|TOUCH_PANEL_Y_PLUS|TOUCH_PANEL_12BIT_SAMPLE| TOUCH_PANEL_DIFF_MODE;
 295   1              serial_write_data(cmd);
 296   1              *X=serial_read_data();
 297   1              
 298   1              cmd = 0;
 299   1         /*读取Y 坐标Y ADC*/
 300   1              cmd=TOUCH_PANEL_START_BIT|TOUCH_PANEL_X_PLUS|TOUCH_PANEL_12BIT_SAMPLE| TOUCH_PANEL_DIFF_MODE ;
 301   1              serial_write_data(cmd);
 302   1              *Y=serial_read_data();
C51 COMPILER V7.10   TOUCHPAD                                                              04/14/2009 23:28:41 PAGE 6   

 303   1      
 304   1              /*触摸屏的范围大于LCD屏幕范围,判断是否超出了四周的边框*/
 305   1              if(*X < 0x0080 || *Y < 0x0080 || *X > 0xF80 || *Y > 0xF80)
 306   1              {
 307   2                      *X = 0;
 308   2                      *Y = 0;
 309   2              }
 310   1      
 311   1      }
 312          
 313          
 314          /*
 315          由于触摸部分的应用和各自系统紧密相关,
 316          单纯的触摸屏驱动只需提供tp_init()和tp_read_adc()两个函数即可。
 317          用户可以用类似下面的函数打印函数或者触摸坐标,以此知道是否调试成功:
 318          void TestTP(void)
 319          {
 320                  U16 XPos = 0;
 321                  U16 YPos = 0;
 322                  
 323                  while (1)
 324                  {
 325                          tp_read_adc(&XPos, &YPos);
 326          
 327                          if ((XPos == 0) || (YPos == 0))
 328                          {
 329                                  uty_delay(0x1000);
 330                          }
 331                          else
 332                          {
 333                                  XPos = (XPos - TPargX.A) / TPargX.K;
 334                                  YPos = (YPos - TPargY.A) / TPargY.K;
 335                                  
 336                                  uprintf("\nX=");
 337                                  uputchar(XPos >> 8);
 338                                  uputchar(XPos& 0xFF);
 339                                  uprintf("  Y=");
 340                                  uputchar(YPos >> 8);
 341                                  uputchar(YPos & 0xFF);
 342                                  break;
 343                          }
 344                  }
 345          
 346                  return;
 347          }
 348          
 349          
 350          在设计各自的触摸应用程序时,可以参考以下3个函数,
 351          完成校准和显示轨迹
 352          */
 353          
 354          
 355          
 356          
 357          /*以下两部分,在创易demo系统中放在别的文件中,这里拷贝过来,供参考*/
 358          #if 0  
              
              
              /*==================================================================
              * Function      : extern_interrupt1
              * Description   : 触摸中断处理函数,检测到触摸后需要调用tp_task
              * Input Para    : 
C51 COMPILER V7.10   TOUCHPAD                                                              04/14/2009 23:28:41 PAGE 7   

              * Output Para   : 
              * Return Value: 
              ==================================================================*/
              void extern_interrupt1(void) interrupt 2
              {
                      EX1 = 0;
                      
                      tp_read_adc(&TP_X, &TP_Y);
                      
                      if(TP_X > 0)
                      {
                              /*一笔的开始*/
                              bTP_INT = TRUE;
                              
                              MSTimerStart(MSTIMERMODE_HANDLE_IN_MSG, 10, tp_task);
                      }
                      else
                      {
                              IE1 = 0;
                              EX1 = 1;        
                      }
              }
              
              
              
              /*==================================================================*/
              extern void lcd_display(EColor color);
              /*case LCD_TP_CALI: 分支,显示了校准的界面*/
              
              
              #endif
 396          
 397          
 398          
 399          
 400          U8 Cali_Cnt = 0;
 401          
 402          
 403          /*==================================================================
 404          * Function      : tp_task
 405          * Description   : 触摸应用的主要函数,在触摸中断处理中需要调用这个函数
 406                                    在5ms定时器处理中也需要调用这个函数
 407          * Input Para    : void
 408          * Output Para   : void
 409          * Return Value: void
 410          ==================================================================*/
 411          void tp_task(void)
 412          {
 413   1              if(bTP_Cali == TRUE)
 414   1              {
 415   2      
 416   2                      /*校准,需要先后采集两个点,都是从中断处理中获得的坐标,
 417   2                      所以处理完不要完了开中断*/
 418   2      
 419   2                      if(Cali_Cnt == 0)
 420   2                      {
 421   3                              /*采集第一个点*/
 422   3      
 423   3      
 424   3                              /*大致判断是否在右下*/
 425   3                              if(TP_X < 2048 || TP_Y < 2048)
 426   3                              {
C51 COMPILER V7.10   TOUCHPAD                                                              04/14/2009 23:28:41 PAGE 8   

 427   4                                      IE1 = 0;
 428   4                                      EX1 = 1;
 429   4                                      return;
 430   4                              }
 431   3                              
 432   3                              TPposA.X= TP_X;
 433   3                              TPposA.Y = TP_Y;
 434   3                              Cali_Cnt++;
 435   3      
 436   3                              /* 清除第一个点,画第二个点 */
 437   3                              lcd_display_rectangle_color(58, 78, 62, 82, BLUE);
 438   3                              lcd_display_rectangle_color(178, 238, 182, 242, WHITE);                 
 439   3                      }
 440   2                      else
 441   2                      {
 442   3                              /*采集第二个点*/
 443   3                              
 444   3      
 445   3                              /*大致判断是否在左上*/
 446   3                              if(TP_X > 2048 || TP_Y > 2048)
 447   3                              {
 448   4                                      IE1 = 0;
 449   4                                      EX1 = 1;
 450   4                                      return;
 451   4                              }
 452   3                              
 453   3                              TPposB.X= TP_X;
 454   3                              TPposB.Y = TP_Y;
 455   3      
 456   3                              /*校准结束,恢复标志变量*/
 457   3                              Cali_Cnt = 0;
 458   3      
 459   3                              /*清除第二个点*/
 460   3                              lcd_display_rectangle_color(58, 78, 62, 82, WHITE);
 461   3                              bTP_Cali = FALSE;
 462   3      
 463   3                              /*重新计算参数*/
 464   3                              TPargX.K = (TPposA.X - TPposB.X) / 120;         /*120 = 180 -60*/
 465   3                              TPargY.K = (TPposA.Y - TPposB.Y) / 160;         /*160 = 240 - 80*/
 466   3      
 467   3                              TPargX.A = TPposB.X -(TPargX.K * 60);                   /*60 = Bx*/
 468   3                              TPargY.A = TPposB.Y -(TPargY.K * 80);           /*80 = By*/
 469   3      
 470   3                              /*用户可以自己考虑校验失败的可能,
 471   3                              最简单的方法就是限定TPargX TPargY的四个值在一定范围内*/
 472   3      
 473   3      #if 0/*通过打印获取初始值*/
                                      uprintf("\nAx=");
                                      uputchar(TPposA.X >> 8);
                                      uputchar(TPposA.X & 0xFF);
                                      uprintf("Ay=");
                                      uputchar(TPposA.Y >> 8);
                                      uputchar(TPposA.Y & 0xFF);
                                      uprintf("Bx=");
                                      uputchar(TPposB.X >> 8);
                                      uputchar(TPposB.X & 0xFF);
                                      uprintf("By=");
                                      uputchar(TPposB.Y >> 8);
                                      uputchar(TPposB.Y & 0xFF);
              
                                      
                                      uprintf("\nXk=");
C51 COMPILER V7.10   TOUCHPAD                                                              04/14/2009 23:28:41 PAGE 9   

                                      uputchar(TPargX.K >> 8);
                                      uputchar(TPargX.K & 0xFF);
                                      uprintf("Xa=");
                                      uputchar(TPargX.A >> 8);
                                      uputchar(TPargX.A & 0xFF);
                                      
                                      uprintf("Yk=");
                                      uputchar(TPargY.K >> 8);
                                      uputchar(TPargY.K & 0xFF);
                                      uprintf("Ya=");
                                      uputchar(TPargY.A >> 8);
                                      uputchar(TPargY.A & 0xFF);              
              #endif
 502   3                      }
 503   2                      IE1 = 0;
 504   2                      EX1 = 1;
 505   2              }
 506   1              else
 507   1              {
 508   2                      /*显示触摸轨迹*/
 509   2                      
 510   2                      if(bTP_INT)
 511   2                      {
 512   3                                      /*一笔的起点,坐标从中断中获得*/
 513   3                                      lcd_display_dot((TP_X - TPargX.A) / TPargX.K, (TP_Y - TPargY.A) / TPargY.K);
 514   3                                      #if 0
                                              uprintf("\nX1=");
                                              uputchar(TP_X);
                                              uprintf("  Y1=");
                                              uputchar(TP_Y);
                                              #endif
 520   3                                      
 521   3                                      bTP_INT = FALSE;
 522   3      
 523   3                                      /*5ms之后再次调用tp_task*/
 524   3                                      MSTimerStart(MSTIMERMODE_HANDLE_IN_MSG, 5, tp_task);
 525   3                      }
 526   2                      else
 527   2                      {
 528   3                              /*定时器处理,需要主动读取坐标*/
 529   3                              tp_read_adc(&TP_X, &TP_Y);
 530   3      
 531   3                              if(TP_X > 0)
 532   3                              {
 533   4                                      lcd_display_dot((TP_X - TPargX.A) / TPargX.K, (TP_Y - TPargY.A) / TPargY.K);
 534   4                                      #if 0
                                              uprintf("\nX2=");
                                              uputchar(TP_X);
                                              uprintf("  Y2=");
                                              uputchar(TP_Y);
                                              #endif
 540   4      
 541   4                                      /*5ms之后再次调用tp_task*/
 542   4                                      MSTimerStart(MSTIMERMODE_HANDLE_IN_MSG, 5, tp_task);
 543   4                              }
 544   3                              else
 545   3                              {
 546   4                                      /*没有读到有效的坐标,一笔结束,重新打开中断*/
 547   4                                      IE1 = 0;
 548   4                                      EX1 = 1;
 549   4                              }
 550   3                      }
C51 COMPILER V7.10   TOUCHPAD                                                              04/14/2009 23:28:41 PAGE 10  

 551   2              }
 552   1      }
 553          
 554            
 555             


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    756    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     21      10
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -