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

📄 ads7843_method.c

📁 一个很好的关于ARM触摸屏试验程序代码
💻 C
字号:
#include "ads7843.h"

#define GPDR0	(*((volatile unsigned long *)(0x40e0000c)))
#define GAFR0_L   (*((volatile unsigned long *)(0x40e00054)))
#define GPDR2     (*((volatile unsigned long *)(0x40e00014)))
#define GAFR2_L   (*((volatile unsigned long *)(0x40e00064)))
#define GFER0     (*((volatile unsigned long *)(0x40e0003c)))
#define GPLR0     (*((volatile unsigned long *)(0x40e00000)))

#define ICMR      (*((volatile unsigned long *)(0x40d00004)))
#define ICLR      (*((volatile unsigned long *)(0x40d00008)))

extern void print_num(short int);
extern void print_string(char * str1);

void udelay(int time )
{
   int i=0;
   int j=0;

    for(i=0; i<10; i++)
        for(j=0; j<time; j++);
}


void port0_setbit(char bits)
{
  char value=0;
  value = 1<<bits;
  PORT0_temp |= value;
  PORT0 = PORT0_temp;
}


void port0_clearbit(char bits)
{
  char value=0;
  value = ~(1<<bits);
  PORT0_temp &= value;
  PORT0 = PORT0_temp;

}


void ads7843_din(char command)
{
   char i=0;
   port0_clearbit(ADS7843_CS);
   udelay(50);
       
   for(i=0;i<8;i++)
     {
       port0_clearbit(ADS7843_DCLK);
        if ((command>>i) & 0x1)
             port0_setbit(ADS7843_DIN);
        else
             port0_clearbit(ADS7843_DIN);
         
       udelay(delay);

       port0_setbit(ADS7843_DCLK);
       udelay(delay);
     }     

    port0_clearbit(ADS7843_DCLK);

}


void ads7843_dout(short int * value)
{
  int i;
  port0_clearbit(ADS7843_DCLK);

  * value = 0;
  for(i=0;i<12;i++)
   {
      if (GPLR0 & (1<<4))
         {
             *value |= 0x1;
          }
      else 
             *value &= ~0x1;

       (*value ) <<= 1;

       port0_setbit(ADS7843_DCLK);
       udelay(delay);
       port0_clearbit(ADS7843_DCLK);
       udelay(delay);

   }  
    (*value) >>=1;
   
   //*value &= 0xfff;

}


short int read_x()
{
   short int value=0;

   ads7843_din(SPIMDATA_X);
   port0_clearbit(ADS7843_DCLK);

   //make CS falling
   while (GPLR0 & (1<<1))
      { 
        port0_setbit(ADS7843_DCLK);
        udelay(delay);
        port0_clearbit(ADS7843_DCLK); 
        udelay(delay);
      }


   ads7843_dout(&value);
 
   return value;
}


short int read_y()
{
   short int value=0;

   ads7843_din(SPIMDATA_Y);
   port0_clearbit(ADS7843_DCLK);

   //make CS falling
   while (GPLR0 & (1<<1))
      { 
        port0_setbit(ADS7843_DCLK);
        udelay(delay);
        port0_clearbit(ADS7843_DCLK); 
        udelay(delay);
      }


   ads7843_dout(&value);
 
   return value;
}


void ads7843_read_xy()
{
   short int value_x[3], value_y[3];
   short int diff[3];
   short int actual_x, actual_y;
   char i=0;


     
   for(i=0; i<3; i++)
       value_x[i] = read_x();
  
   for(i=0; i<3; i++)
       value_y[i] = read_y();



//X_Convertion
   if ((value_x[1] - value_x[0])>>0)
         diff[0] = value_x[1] - value_x[0];
   else
         diff[0] = value_x[0] - value_x[1];

   if ((value_x[2] - value_x[1])>>0)
         diff[1] = value_x[2] - value_x[1];
   else 
         diff[1] = value_x[1] - value_x[2];

   if ((value_x[0] - value_x[2])>>0)
         diff[2] = value_x[0] - value_x[2];
   else 
         diff[2] = value_x[2] - value_x[0];


   if (diff[0]>XLIMIT || diff[1]>XLIMIT || diff[2]>XLIMIT )
       return ;

   if (diff[0]<=diff[1])
      {
         if (diff[0] <= diff[2])
                actual_x = (value_x[1] + value_x[0]) / 2; 
         else 
                actual_x = (value_x[2] + value_x[0]) / 2;
      }
   else
      {
         if (diff[1] <= diff[2])
                actual_x = (value_x[2] + value_x[1]) /2;
         else
                actual_x = (value_x[2] + value_x[0]) /2;
      }


   if (X_REV == 0)
        actual_x = actual_x*SCREEN_X/(RAW_MAX_X - RAW_MIN_X);
   else 
        actual_x =(RAW_MAX_X - actual_x)*SCREEN_X /(RAW_MAX_X - RAW_MIN_X);   

  
        actual_x = (actual_x<=640)? actual_x: (640-1);  
        actual_x = (actual_x>=0)? actual_x:1;



//Y_Convertion
 if ((value_y[1] - value_y[0])>>0)
         diff[0] = value_y[1] - value_y[0];
   else
         diff[0] = value_y[0] - value_y[1];

   if ((value_y[2] - value_y[1])>>0)
         diff[1] = value_y[2] - value_y[1];
   else 
         diff[1] = value_y[1] - value_y[2];

   if ((value_y[0] - value_y[2])>>0)
         diff[2] = value_y[0] - value_y[2];
   else 
         diff[2] = value_y[2] - value_y[0];


 if (diff[0]>YLIMIT || diff[1]>YLIMIT || diff[2]>YLIMIT )
       return ;


if (diff[0]<=diff[1])
      {
         if (diff[0] <= diff[2])
                actual_y = (value_y[1] + value_y[0]) / 2; 
         else 
                actual_y = (value_y[2] + value_y[0]) / 2;
      }
   else
      {
         if (diff[1] <= diff[2])
                actual_y = (value_y[2] + value_y[1]) /2;
         else
                actual_y = (value_y[2] + value_y[0]) /2;
      }



   if (Y_REV == 0)
          actual_y = actual_y*SCREEN_Y/(RAW_MAX_Y - RAW_MIN_Y ); 
   else
          actual_y = (RAW_MAX_Y-actual_y)*SCREEN_Y /(RAW_MAX_Y - RAW_MIN_Y );


   actual_y = (actual_y<=480)? actual_y: (480-1);  
   actual_y = (actual_y>=0)? actual_y:1;
    
   print_string("X :");
   print_num(actual_x);
   print_string("  ");
   print_string("Y :");
   print_num(actual_y);
   print_string("\n");
}



 void init_GPIO()
{  
 //CS2
 GPDR2 |= (1<<14); 
 GAFR2_L |= (2<<28);

 //GPIO1--ADS7842_busy
 GPDR0  &= ~(1<<1);
 GAFR0_L  &= ~(3<<2);

 //GPIO4--ADS7843_DOUT
 GPDR0  &= ~(1<<4);
 GAFR0_L  &= ~(3<<8);

 //GPIO5--ADS7843_IRQ
 GPDR0  &= ~(1<<5);
 GAFR0_L  &= ~(3<<10);

 //GPIO5--Falling edge Detect
 GFER0 |= (1<<5);
 ICMR |=  (1<<10);
 ICLR &=  ~(1<<10);
  
}


void init_ads7843 ()
{
  PORT0_temp = 0;
  PORT0 = PORT0_temp;
  
  init_GPIO();

  port0_setbit(ADS7843_CS);
}

⌨️ 快捷键说明

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