当前位置:文档之家› 触摸屏ADS7843驱动程序

触摸屏ADS7843驱动程序

触摸屏ADS7843驱动程序
触摸屏ADS7843驱动程序

触摸屏ADS7843驱动程序设计

//===================================================================== // ADS7843 驱动程序(串行)

//硬件连接: DCLK ——P0^0;

// CS ——P0^1;

// DIN ——P0^2;

// BUSY ——P0^3

// DOUT ——P0^4

// PENIRQ——P3^2;

// VDD--逻辑电源(+5V)

// VSS--GND(0V)

//ADS7843.c

//writer:谷雨2008年7月23日于EDA实验室

//=====================================================================

#i nclude //STC单片机头文件

#i nclude

#define uint unsigned int

#define uchar unsigned char

sbit DCLK = P0^0; //时钟信号,下降沿有效

sbit CS = P0^1; //片选信号,低电平有效

sbit DIN = P0^2; //串行数据输入

sbit BUSY = P0^3; //忙信号

sbit DOUT = P0^4; //串行数据输出

sbit PENIRQ = P3^2; //键盘中断请求信号,低电平(负边沿)有效

void Tranfer(char Data);

uint average(uint a[8]);

//===================================================================== ===============

//函数名称:void delay(uint us)

//函数功能:延时子函数

//入口参数:us 延时时间

//出口参数:无

//===================================================================== ===============

void delay(uint us)

{

while(us--);

}

//===================================================================== ===============

//函数名称:void ADS7843_start(void)

//函数功能:ADS7843启动

//入口参数:无

//出口参数:无

//===================================================================== ===============

void ADS7843_start(void)

{

DCLK=0;

CS=1;

DIN=1;

DCLK=1;

CS=0;

}

//===================================================================== ===============

//函数名称:void ADS7843_wr(uchar dat)

//函数功能:写ADS7843

//入口参数:dat 写入的数据

//出口参数:无

//===================================================================== ===============

void ADS7843_wr(uchar dat)

{

uchar count;

DCLK=0;

for(count=0;count<8;count++)

{

dat<<=1;

DIN=CY;

DCLK=0;

_nop_();

_nop_();

_nop_();

DCLK=1;

_nop_();

_nop_();

_nop_();

}

}

//===================================================================== ===============

//函数名称:uint ADS7843_rd(void)

//函数功能:读ADS7843

//入口参数:无

//出口参数:读回的坐标值

//===================================================================== ===============

uint ADS7843_rd(void)

{

uchar count=0;

uint dat=0;

for(count=0;count<12;count++)

{

dat<<=1;

DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效

DCLK=0; _nop_();_nop_();_nop_();

if(DOUT)

dat++;

}

return(dat);

}

//===================================================================== ===============

//函数名称:void intr0_int()

//函数功能:外中断0中断服务函数

//入口参数:无

//出口参数:无

//===================================================================== ===============

void intr0_int() interrupt 0 using 2

{

uint X=0,Y=0,a[4],i,avex,avey,x[8],y[8];

IE=0; //关中断

delay(100); //中断后延时以消除抖动,使得采样数据更准确

if(!PENIRQ)

{

for(i=0;i<8;i++) //进行8次数据采集

{

ADS7843_start();

delay(2);

ADS7843_wr(0x90);//送控制字10010000 即用差分方式读X坐标

delay(2);

DCLK=1;

_nop_();

_nop_();

_nop_();

_nop_();

DCLK=0;

_nop_();

_nop_();

_nop_();

_nop_();

X=ADS7843_rd(); //读X轴坐标

x[i]=X;

ADS7843_wr(0xD0); //送控制字11010000 即用差分方式读Y坐标DCLK=1;

_nop_();

_nop_();

_nop_();

_nop_();

DCLK=0;

_nop_();

_nop_();

_nop_();

_nop_();

Y=ADS7843_rd(); //读Y轴坐标

y[i]=Y;

CS=1;

}

avex=average(x); //X坐标数据处理

a[0]=avex/1000; //发上位机观察结果

a[1]=(avex-a[0]*1000)/100;

a[2]=(avex-a[0]*1000-a[1]*100)/10;

a[3]=avex%10;

Tranfer(a[0]+48);

Tranfer(a[1]+48);

Tranfer(a[2]+48);

Tranfer(a[3]+48);

avey=average(y); //Y坐标数据处理

a[0]=avey/1000; //发上位机观察结果

a[1]=(avey-a[0]*1000)/100;

a[2]=(avey-a[0]*1000-a[1]*100)/10;

a[3]=avey%10;

Tranfer(a[0]+48);

Tranfer(a[1]+48);

Tranfer(a[2]+48);

Tranfer(a[3]+48);

for(i=0;i<10;i++) //延时,在程序中根据具体情况改动

delay(10000);

}

IE=0x81; //开中断

}

//===================================================================== ===============

//函数名称:void init_serial()

//函数功能:初始化串口

//入口参数:无

//出口参数:无

//===================================================================== ===============

void init_serial()

{

TMOD=0x22; //定时器T1使用工作方式2

TH1=250; //设置初值

TL1=250;

TR1=1; //开始计时

PCON=0x80; //SMOD=1;

SCON=0x50; //工作方式1,波特率9600bit/s,允许接收

TI=1;

}

//===================================================================== ===============

//函数名称:void Tranfer(char Data)

//函数功能:发送数据程序

//入口参数:Data 要发送的数据

//出口参数:无

//===================================================================== ===============

void Tranfer(char Data)

{

while(TI==0);

SBUF=Data;

TI=0;

}

//===================================================================== ===============

//函数名称:int main()

//函数功能:主函数

//入口参数:无

//出口参数:无

//===================================================================== ===============

int main()

{

// uint b[4];

TCON=0x01; //设置外部中断0下降沿触发

EX0=1; //开外中断0

EA=1; //开总中断

init_serial();

while(1);

}

//===================================================================== ===============

//函数名称:uint average(uint a[8])

//函数功能:数据处理程序,采集8次的数据,去掉最大值,去掉最小值,然后求平均

//入口参数:数组首地址

//出口参数:平均值

//===================================================================== ===============

uint average(uint a[8])

{

uint max,min,i,ave=0,sum=0;

max=a[0];

min=a[0];

for(i=0;i<8;i++)

{

if(maxif(min>a[i])min=a[i];

sum+=a[i];

}

ave=(sum-min-max)/6;

return ave;

}

相关主题
文本预览
相关文档 最新文档