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

📄 touch_screen.c

📁 三星ARM9 s3c2410 触摸屏控制 实现触摸屏的矫正和触摸屏状态返回
💻 C
字号:
/**************************************************************
Touch Screen control
**************************************************************/
#include "def.h"
#include "option.h"
#include "2410addr.h"
#include "2410lib.h"
#include "uart.h"
#include "interrupt.h"
#include "2410lib.h"
#include "touch_screen.h"
#include "240_320TFT_LCD.h"
#include "text.h"
#include "pwm_timer.h"



#define ST_IDENTIFY_BLANK    60




 



  volatile   static U32 ts_state;
  volatile   static int ts_lefttop_x;
  volatile   static int ts_lefttop_y;
  volatile   static int ts_righttop_x;
  volatile   static int ts_righttop_y;
  volatile   static int ts_leftbuttom_x;
  volatile   static int ts_leftbuttom_y;
  volatile   static int ts_rightbuttom_x;
  volatile   static int ts_rightbuttom_y;
  volatile    int xdata_lcd_width  = -759;
  volatile    int ydata_lcd_heigth = -775;
  volatile    int xdata_at_first_block_middle = 509;
  volatile    int ydata_at_first_block_middle = 532;
  
  volatile    U8  stylus = STYLUS_UP  ; 
  


//*************************************************************

/**************************************************************
The interrupt function for Touch Screen
**************************************************************/
void __irq Touch_Screen(void)
{      

    int i;
    int Ptx[6];
    int Pty[6];
    int ts_lcd_x;
    int ts_lcd_y;
    

    
    lcd_window_start_point  lcd_window_start_point0;  
  
    rINTSUBMSK |= (BIT_SUB_ADC|BIT_SUB_TC); // Mask sub interrupt (ADC and TC) 

      // TC(Touch screen Control) Interrupt 
    if(rADCTSC & 0x100) //用到了rADCTSC保留的第八位。下面按下时下面中断程序将其设为一。
    {
        rADCTSC &= 0xff;    // Set stylus down interrupt
       // Uart_Printf("stylus up.......\n");
        stylus = STYLUS_UP;
        if(ts_state==TS_START) {
           Text_Show_OnePage(0x001f);
         }
    }
    else 
    {   
        stylus = STYLUS_DOWN;
      //  Uart_Printf("stylus down.......\n");  
          // <X-Position Read>
        rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(1);
          // Down,Hi-Z,AIN5,GND,Ext vlt,Pullup Dis,Normal,X-position
        for(i=0;i<LOOP;i++);            //delay to set up the next channel
        for(i=0;i<5;i++)
        {
            rADCCON|=0x1;               // Start X-position conversion
            while(rADCCON & 0x1);       // Check if Enable_start is low
            while(!(0x8000&rADCCON));   // Check ECFLG
            Ptx[i]=(0x3ff&rADCDAT0);
        }
        Ptx[5]=(Ptx[0]+Ptx[1]+Ptx[2]+Ptx[3]+Ptx[4])/5;

          // <Y-Position Read>
        rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(2);
          // Down,GND,Ext vlt,Hi-Z,AIN7,Pullup Dis,Normal,Y-position
        for(i=0;i<LOOP;i++);            //delay to set up the next channel
        for(i=0;i<5;i++)
        {
            rADCCON|=0x1;               // Start X-position conversion
            while(rADCCON & 0x1);       // Check if Enable_start is low
            while(!(0x8000&rADCCON));   // Check ECFLG
            Pty[i]=(0x3ff&rADCDAT1);
        }
        Pty[5]=(Pty[0]+Pty[1]+Pty[2]+Pty[3]+Pty[4])/5;
        rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
          // Up,GND,AIN,Hi-z,AIN,Pullup En,Normal,Waiting mode
          
      if(ts_state==TS_FIRST){
            Lcd_ClearScr(0);
            Uart_Printf("[1].Touch the    LEFT TOP      cross,please.......\n");
            LCD_Puts(16*2,16*5,"1.请触摸屏幕的左上点",0xffff);
            Lcd_Cross(LCD_CROSS_SIZE,LCD_CROSS_SIZE,0xffff);
            ts_state=TS_JUTSTIFY_LEFTTOP;
          }
      else if(ts_state==TS_JUTSTIFY_LEFTTOP) {
            ts_state=TS_JUTSTIFY_RIGHTTOP; 
            ts_lefttop_x = Ptx[5];
            ts_lefttop_y = Pty[5]; 
            Lcd_Cross(SCR_XSIZE_TFT_240_320/2-LCD_CROSS_SIZE-1,LCD_CROSS_SIZE,0xffff);    
            Uart_Printf("[2].Touch the   RIGHT TOP      cross,please.......\n");  
            LCD_Puts(16*2,16*7,"2.请触摸屏幕的右上点",0xffff);
            Beep(50000000 ,400, 100);
             }
      else if(ts_state==TS_JUTSTIFY_RIGHTTOP) {
            ts_righttop_x = Ptx[5];
            ts_righttop_y = Pty[5]; 
            if(abs(ts_righttop_x -ts_lefttop_x)<ST_IDENTIFY_BLANK && abs(ts_righttop_y -ts_lefttop_y)<ST_IDENTIFY_BLANK)
                  { Beep(50000000 ,50, 100); return; }
            Lcd_Cross(SCR_XSIZE_TFT_240_320/2-LCD_CROSS_SIZE-1,SCR_YSIZE_TFT_240_320/2-LCD_CROSS_SIZE-1,0xffff);
            Uart_Printf("[3].Touch the  RIGHT BOUTTOM   cross,please.......\n");
            LCD_Puts(16*2,16*9,"3.请触摸屏幕的右下点",0xffff);
            ts_state=TS_JUTSTIFY_RIGHTBUTTOM;
            Beep(50000000 ,400, 100);
      }   
      else if(ts_state==TS_JUTSTIFY_RIGHTBUTTOM) {
            ts_rightbuttom_x = Ptx[5];
            ts_rightbuttom_y = Pty[5]; 
            if(abs(ts_righttop_x -ts_rightbuttom_x)<ST_IDENTIFY_BLANK && abs(ts_righttop_y -ts_rightbuttom_y)<ST_IDENTIFY_BLANK)
                  { Beep(50000000 ,50, 100); return; }
            Lcd_Cross(LCD_CROSS_SIZE,SCR_YSIZE_TFT_240_320/2-LCD_CROSS_SIZE-1,0xffff);
            Uart_Printf("[4].Touch the  LEFT BOUTTOM    cross,please.......\n"); 
            LCD_Puts(16*2,16*11,"4.请触摸屏幕的左下点",0xffff);
            ts_state=TS_JUTSTIFY_LEFTBUTTOM;
            Beep(50000000 ,400, 100);   
      }      
      else if(ts_state==TS_JUTSTIFY_LEFTBUTTOM) {  
            ts_leftbuttom_x = Ptx[5];
            ts_leftbuttom_y = Pty[5];
            if(abs(ts_leftbuttom_x -ts_rightbuttom_x)<ST_IDENTIFY_BLANK && abs(ts_leftbuttom_y -ts_rightbuttom_y)<ST_IDENTIFY_BLANK) 
                { Beep(50000000 ,50, 100); return; }   
            Uart_Printf("[5].Touch the     CENTER       cross,please.......\n");
            LCD_Puts(16*2,16*13,"5.完成校正,点击继续",0xffff);
            ts_state=TS_JUTSTIFY_MIDDLE;
            Beep(50000000 ,400, 100);  
      } 
      
      else if(ts_state==TS_JUTSTIFY_MIDDLE) {
            ts_state=TS_START;   
            Uart_Printf("[6].Touch screen has been justified !!!\n");
            xdata_lcd_width  = (ts_righttop_x - ts_lefttop_x + ts_rightbuttom_x -ts_leftbuttom_x)/2;
            ydata_lcd_heigth = (ts_rightbuttom_y - ts_righttop_y +ts_leftbuttom_y - ts_lefttop_y)/2;
            xdata_at_first_block_middle = (ts_righttop_x + ts_lefttop_x + ts_rightbuttom_x + ts_leftbuttom_x)/4;
            ydata_at_first_block_middle = (ts_righttop_y + ts_lefttop_y + ts_rightbuttom_y + ts_leftbuttom_y)/4;
            Uart_Printf(" xdata_lcd_width=%d ydata_lcd_heigth=%d\n",xdata_lcd_width,ydata_lcd_heigth); 
            Uart_Printf(" xdata_at_first_block_middle=%d ydata_at_first_block_middle=%d\n",xdata_at_first_block_middle,ydata_at_first_block_middle); 

      }        
      else if(ts_state==TS_START){
            ts_lcd_x = ((Ptx[5] - xdata_at_first_block_middle)*(LCD_XSIZE_TFT_240_320 -2*LCD_CROSS_SIZE))*1.0/xdata_lcd_width +  LCD_XSIZE_TFT_240_320/2;
            ts_lcd_y = ((Pty[5] - ydata_at_first_block_middle)*(LCD_YSIZE_TFT_240_320 -2*LCD_CROSS_SIZE))*1.0/ydata_lcd_heigth + LCD_YSIZE_TFT_240_320/2;
            if(ts_lcd_x >239 ) ts_lcd_x = 239;
            if(ts_lcd_x <0   ) ts_lcd_x = 0;
            if(ts_lcd_y >319 ) ts_lcd_y = 319;
            if(ts_lcd_y <0 )   ts_lcd_y = 0;
            lcd_window_start_point0=Get_LcdViewPort_StartPoint();
            ts_lcd_x += lcd_window_start_point0.X ;
            ts_lcd_y += lcd_window_start_point0.Y ;
            LCD_String_Set(0,0,0xf800);
            LCD_Printf(" 坐标:(%3d,%3d)",ts_lcd_x,ts_lcd_y); 
           // Uart_Printf("LCD position at (%3d , %3d)\n",ts_lcd_x,ts_lcd_y);
           // Glib_FilledRectangle(ts_lcd_x,ts_lcd_y,ts_lcd_x+1,ts_lcd_y+1 ,0x0); 


           } 

    }
    rSUBSRCPND |= BIT_SUB_TC;
    rINTSUBMSK =~ (BIT_SUB_TC);         // Unmask sub interrupt (TC)     
    ClearPending(BIT_ADC);       
}
    
  
            
/**************************************************************
The Initial of Touch Screen
**************************************************************/
void Touch_Screen_Init(void)
{
    Uart_Printf("[Touch Screen Test.]\n");
    Uart_Printf("Separate X/Y position conversion mode test\n");
    rADCDLY = (0x7fff);  // ADC Start or Interval Delay
    rADCCON = (1<<14)|(ADCPRS<<6)|(0<<3)|(0<<2)|(0<<1)|(0);
      // Enable Prescaler,Prescaler,AIN7/5 fix,Normal,Disable read start,No operation
    rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
      // Down,YM:GND,YP:AIN5,XM:Hi-z,XP:EXTENAL,XP pullup En,Normal,Waiting for interrupt mode
      // 2410 427页上设置。为等待中断状态 xp : pull up  and external V;  xm : Hi-z ;  YP :AIN[5]  ; YM :GND
      // 相当于 X导电片X+ X-都为高电平(xp : pull up  and external;xm : Hi-z)
      // 而Y-接地 ,Y+接ain[5],Y-、Y+为同一导电片,则Y+也为低电平,那么当接触时,Y+由低变高,
      // 产生中断。
      
    pISR_ADC   = (unsigned)Touch_Screen;
    EnableIrq(BIT_ADC);
    EnableSubIrq(BIT_SUB_TC);
    
   // ts_state=TS_FIRST;
    ts_state=TS_START;
    
    xdata_lcd_width  = -759;
    ydata_lcd_heigth = -775;
    xdata_at_first_block_middle = 509;
    ydata_at_first_block_middle = 532;
    

   

    Lcd_ClearScr(0);
    Lcd_MoveViewPort(0,0);
    if(ts_state==TS_FIRST){
    	Glib_Rectangle(0,0,SCR_XSIZE_TFT_240_320/2-1,SCR_YSIZE_TFT_240_320/2-1,0x001f);      
    	Uart_Printf("\nTouch the touch_sreen to begin touch_sreen justify !! .......\n");
    	LCD_Puts(16*3,16*9,"请触摸屏幕的任意点",0xffff);
    	while(1) {
       		if(ts_state==TS_START) break;
       	}
    }   	
}
//*************************************************************

⌨️ 快捷键说明

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