?? 觸摸屏ads7843驅動程序設計(c51).txt
字號:
//觸摸屏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實驗室
//=====================================================================
#include //STC單片機頭文件
#include
#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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -