?? ads7843_method.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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -