搜索
bottom↓
回复: 7

关于S3C2440上触摸屏的问题!

[复制链接]

出0入0汤圆

发表于 2009-6-3 00:10:51 | 显示全部楼层 |阅读模式
各位大侠,小弟现在调试ARM触摸屏时候出现了一个小小的问题.请各位大侠帮小弟一下。
触摸屏采用中断方式现在只能通过单击一下屏幕就得到一个坐标。但是现在想调试成类似汉字输入的方式。也就是连续得出XY坐标,然后在屏幕上用画点函数显示出触摸轨迹。现在可以显示触摸点,却不能显示画的线。
下边是我的程序:
/*****************************************
  NAME: Touchpanel.c
  DESC: ADC & Touch screen test
  HISTORY:
  2003.09.23:Leon YH KIM: draft ver 1.0
*****************************************/
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"


#define REQCNT 30
#define ADCPRS 9        //YH 0627
#define LOOP 1

void __irq AdcTsAuto(void);
extern void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color);
extern void Write_Dot (U16 lcd_x,U16 lcd_y,U16 color);
int count=0;

volatile U16 X_Data, Y_Data,X_Coules,Y_Coules;
volatile U16 X1,Y1,X2,Y2;


void Test_Touchpanel(void)
{
   
    rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
    rADCCON=(1<<14)+(ADCPRS<<6);   //ADCPRS En, ADCPRS Value

    Uart_Printf("ADC touch screen test\n");

    rADCTSC=0xd3;  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

    pISR_ADC = (int)AdcTsAuto;
        rINTMSK=~BIT_ADC;       //ADC Touch Screen Mask bit clear
        rINTSUBMSK=~(BIT_SUB_TC);

        Uart_Printf("\nType any key to exit!!!\n");
        Uart_Printf("\nStylus Down, please...... \n");
       
   
        //rINTSUBMSK|=BIT_SUB_TC;
        //rINTMSK|=BIT_ADC;  
        //Uart_Printf("Touch Screen Test is Finished!!!\n");

}


void __irq AdcTsAuto(void)
{
        int i;
        U32 saveAdcdly;

    if(rADCDAT0&0x8000)
    {
               
                rADCTSC&=0xff;        // Set stylus down interrupt bit
    }
   
        rADCTSC=(1<<3)|(1<<2);         //Pull-up disable, Seq. X,Y postion measure.
        saveAdcdly=rADCDLY;
        rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms

        rADCCON|=0x1;                   //start ADC  启动ADC

                while(rADCCON & 0x1);                //check if Enable_start is low 等待ADC启动  
                while(!(rADCCON & 0x8000));        //check if EC(End of Conversion) flag is high, This line is necessary~!! 等待ADC转换结束
               
            while(!(rSRCPND & (BIT_ADC)));  //check if ADC is finished with interrupt bit

            Y_Data=(rADCDAT0&0x3ff);
            X_Data=(rADCDAT1&0x3ff);
            Y_Coules = 320*(Y_Data-122)/(890-122);
                X_Coules = 240*(X_Data-81)/(960-81);
            //X_Coules = (X_Data-X1)/(X2-X1)*240;
                //Y_Coules = (Y_Data-Y1)/(Y2-Y1)*320;
                DisplayTmp(66,32,X_Coules);
            DisplayTmp(66,48,Y_Coules);
            DisplayTmp(66,64,X_Data);
            DisplayTmp(66,80,Y_Data);
            Write_Dot(X_Coules,Y_Coules,0xf00f);

         //YH 0627, To check Stylus Up Interrupt.
         rSUBSRCPND|=BIT_SUB_TC;
         ClearPending(BIT_ADC);
         rINTSUBMSK=~(BIT_SUB_TC);
         rINTMSK=~(BIT_ADC);
                         
         rADCTSC =0xd3;    //Waiting for interrupt
        // rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

                /*        while(1)                //to check Pen-up state
                        {
                           if(rSUBSRCPND & (BIT_SUB_TC))        //check if ADC is finished with interrupt bit
                                 {
                                        //Uart_Printf("Stylus Up Interrupt~!\n");
                                        break;        //if Stylus is up(1) state
                                }
                        }
       */
   // Uart_Printf("count=%03d  XP=%04d, YP=%04d\n", count++, xdata, ydata);    //X-position Conversion data            

        rADCDLY=saveAdcdly;
        rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
    rSUBSRCPND|=BIT_SUB_TC;
    rINTSUBMSK=~(BIT_SUB_TC);        // Unmask sub interrupt (TC)     
    ClearPending(BIT_ADC);
}


void Touchpanel_Check (void)
     {
      Clr_Sckreen(0XFFFF);
      X_Data=Y_Data=0;
      Glib_FilledRectangle(1,10,1,10,0X0FF0);
      DrawString(0,32,(U8*)"请输入单击屏幕左上角:",0XFF00,0X0F00,1);
      while(1)
      {
         
         if((X_Data>0)&(Y_Data>0))
           {
            X1= X_Data;
            Y1= Y_Data;
            break;
            }
       }
      Clr_Sckreen(0XFFFF);
      Glib_FilledRectangle(232,240,304,320,0X0FF0);
      DrawString(0,32,(U8*)"屏幕左上角已经定位好:",0XFF00,0X0F00,1);
      DrawString(0,56,(U8*)"请输入单击屏幕右下角:",0XFF00,0X0F00,1);
      X_Data=Y_Data=0;
      while(1)
      {
         if((X_Data>0)&(Y_Data>0))
           {
            if(X1>X_Data)
              {
               X2=X1;
               X1=X_Data;
               }
            else
              {
               X2=X_Data;
               }
            if(Y1>Y_Data)
              {
               Y2=Y1;
               Y1=Y_Data;
               }
            else
              {
               Y2=Y_Data;
               }
            break;
            }
       }
     
      DrawString(0,32,(U8*)"屏幕左上角已经定位好:",0XFF00,0X0F00,1);
      DrawString(0,56,(U8*)"屏幕右下角已经定位好:",0XFF00,0X0F00,1);
      DrawString(0,80,(U8*)"正在计算请稍后。。。!",0XFF00,0X0F00,1);
           
      }

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-6-4 00:22:41 | 显示全部楼层
/*****************************************
  NAME: Touchpanel.c
  DESC: ADC & Touch screen test
  HISTORY:
  2003.09.23:Leon YH KIM: draft ver 1.0
*****************************************/
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"


#define REQCNT 30
#define ADCPRS 9        //YH 0627
#define LOOP 1

void __irq AdcTsAuto(void);
extern void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color);
extern void Write_Dot (U16 lcd_x,U16 lcd_y,U16 color);
int count=0;

volatile U16 X_Data, Y_Data,X_Coules,Y_Coules;
volatile U16 X1,Y1,X2,Y2;


void Test_Touchpanel(void)
{
   
    rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
    rADCCON=(1<<14)+(ADCPRS<<6);   //ADCPRS En, ADCPRS Value

    Uart_Printf("ADC touch screen test\n");

    rADCTSC=0xd3;  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

    pISR_ADC = (int)AdcTsAuto;
        rINTMSK=~BIT_ADC;       //ADC Touch Screen Mask bit clear
        rINTSUBMSK=~(BIT_SUB_TC);

        Uart_Printf("\nType any key to exit!!!\n");
        Uart_Printf("\nStylus Down, please...... \n");
       
   
        //rINTSUBMSK|=BIT_SUB_TC;
        //rINTMSK|=BIT_ADC;  
        //Uart_Printf("Touch Screen Test is Finished!!!\n");

}


void __irq AdcTsAuto(void)
{
        int i;
        U32 saveAdcdly;

    if(rADCDAT0&0x8000)
    {
               
                rADCTSC&=0xff;        // Set stylus down interrupt bit
    }
   
        rADCTSC=(1<<3)|(1<<2);         //Pull-up disable, Seq. X,Y postion measure.
        saveAdcdly=rADCDLY;
        rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms

        rADCCON|=0x1;                   //start ADC  启动ADC

                while(rADCCON & 0x1);                //check if Enable_start is low 等待ADC启动  
                while(!(rADCCON & 0x8000));        //check if EC(End of Conversion) flag is high, This line is necessary~!! 等待ADC转换结束
               
            while(!(rSRCPND & (BIT_ADC)));  //check if ADC is finished with interrupt bit

            Y_Data=(rADCDAT0&0x3ff);
            X_Data=(rADCDAT1&0x3ff);
            
            //Y_Coules = 320*(Y_Data-122)/(890-122);
                //X_Coules = 240*(X_Data-81)/(960-81);
                if((X1>0)&(Y1>0))
                {  
                   if((X2>0)&(Y2>0))
                     {
                  Y_Coules = 320*(Y_Data-Y1)/(Y2-Y1);
                      X_Coules = 240*(X_Data-X1)/(X2-X1);
                      DisplayTmp(66,32,X_Coules);
                  DisplayTmp(66,48,Y_Coules);
                  DisplayTmp(66,64,X_Data);
                  DisplayTmp(66,80,Y_Data);
                  Write_Dot(X_Coules,Y_Coules,0xf00f);
                 }
                else
                 {
                     if(X1>X_Data)
                       {
                        X2=X1;
                        X1=X_Data;
                        }
                     else
                       {
                        X2=X_Data;
                        }
                     if(Y1>Y_Data)
                       {
                        Y2=Y1;
                        Y1=Y_Data;
                       }
                     else
                      {
                       Y2=Y_Data;
                       }        
                 
                   }
               
                }
          if((X2==0)|(Y2==0))
             {
               X1= X_Data;
               Y1= Y_Data;  
             }

         //YH 0627, To check Stylus Up Interrupt.
         rSUBSRCPND|=BIT_SUB_TC;
         ClearPending(BIT_ADC);
         rINTSUBMSK=~(BIT_SUB_TC);
         rINTMSK=~(BIT_ADC);
                         
         rADCTSC =0xd3;    //Waiting for interrupt
         rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

                        while(1)                //to check Pen-up state
                        {
                           Delay(5);
                           if(rSUBSRCPND & (BIT_SUB_TC))        //check if ADC is finished with interrupt bit
                                 {
       
                                  break;        //if Stylus is up(1) state
                                 }
                           rADCTSC=(1<<3)|(1<<2);         //Pull-up disable, Seq. X,Y postion measure.
                   saveAdcdly=rADCDLY;
                   rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms

                   rADCCON|=0x1;                   //start ADC  启动ADC
                       while(rADCCON & 0x1);                //check if Enable_start is low 等待ADC启动  
                       while(!(rADCCON & 0x8000));        //check if EC(End of Conversion) flag is high, This line is necessary~!! 等待ADC转换结束
               
               //while(!(rSRCPND & (BIT_ADC)));  //check if ADC is finished with interrupt bit
               Y_Data=(rADCDAT0&0x3ff);
               X_Data=(rADCDAT1&0x3ff);
              // Y_Coules = 320*(Y_Data-122)/(890-122);
                  // X_Coules = 240*(X_Data-81)/(960-81);
                  if((X1>0)&(Y1>0)&(X2>0)&(Y2>0))
                   {
                  Y_Coules = 320*(Y_Data-Y1)/(Y2-Y1);
                      X_Coules = 240*(X_Data-X1)/(X2-X1);
                      DisplayTmp(66,32,X_Coules);
                  DisplayTmp(66,48,Y_Coules);
                  DisplayTmp(66,64,X_Data);
                  DisplayTmp(66,80,Y_Data);
                  Write_Dot(X_Coules,Y_Coules,0xf00f);
                 }
               rSUBSRCPND|=BIT_SUB_TC;
                   ClearPending(BIT_ADC);
                   rINTSUBMSK=~(BIT_SUB_TC);
                   rINTMSK=~(BIT_ADC);
                   
                           rADCTSC =0xd3;    //Waiting for interrupt
                   rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.
                         
                        }
                       
       
    rADCDLY=saveAdcdly;
        rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
    rSUBSRCPND|=BIT_SUB_TC;
    rINTSUBMSK=~(BIT_SUB_TC);        // Unmask sub interrupt (TC)     
    ClearPending(BIT_ADC);
}


void Touchpanel_Check (void)
     {
      Clr_Sckreen(0XFFFF);
      X_Data=Y_Data=0;
      Glib_FilledRectangle(1,1,16,16,0X0000);
      DrawString(0,32,(U8*)"请输入单击屏幕左上角:",0XFF00,0X0F00,1);
      while(1)
      {
         
         if((X1>0)&(Y1>0))
           {
            break;
            }
       }
      Clr_Sckreen(0XFFFF);
      Glib_FilledRectangle(224,304,240,320,0X0000);
      DrawString(0,32,(U8*)"屏幕左上角已经定位好:",0XFF00,0X0F00,1);
      DrawString(0,56,(U8*)"请输入单击屏幕右下角:",0XFF00,0X0F00,1);
      X_Data=Y_Data=0;
      while(1)
      {
         if((X2>0)&(Y2>0))
           {
            break;
            }
       }
     
      DrawString(0,32,(U8*)"屏幕左上角已经定位好:",0XFF00,0X0F00,1);
      DrawString(0,56,(U8*)"屏幕右下角已经定位好:",0XFF00,0X0F00,1);
      DrawString(0,80,(U8*)"正在计算请稍后。。。!",0XFF00,0X0F00,1);
           
      }

出0入0汤圆

 楼主| 发表于 2009-6-4 00:24:18 | 显示全部楼层
哎!竟然没有人响应!已经解决!一楼的帖子就是已经搞好的程序!并且加入了坐标校正程序!

出0入0汤圆

发表于 2009-9-13 18:26:49 | 显示全部楼层
我顶一个!。。。。。。。。。。。
仔细阅读一下...........................

出0入0汤圆

发表于 2009-11-5 23:34:15 | 显示全部楼层
拷贝下来,研究下

出0入0汤圆

发表于 2009-11-5 23:48:06 | 显示全部楼层
学习,这个我想把触摸屏加入bootloader,到时候做个强悍的bootloader出来。目前www.armce.com/bbs已经开始这个事情了
以后会很好玩的。

出0入0汤圆

发表于 2011-3-8 17:00:19 | 显示全部楼层
正在玩裸机,标记一下

出0入0汤圆

发表于 2011-3-10 20:23:27 | 显示全部楼层
学习一下!有时间也整整。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 23:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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