觸摸屏ADS7846驅動

        用ADS7846接觸摸時可以有幾種辦法去讀XY座標,一種是中斷方式,當按下觸摸屏時,ADS7846會產中一箇中斷信號,可以利用這個中斷信號來讀取XY座標.也可以用查詢的方法來讀入XY座標,就是不斷地讀入XY座標,然後作座標位置判定,應該講用中斷方式是科學,但因爲我的電路板上沒有接這中斷引腳,所以只能用查詢的辦法了.
       ADS7846可以設置爲8位或者是12位.一般屏大於是240X128時就用12位,官方的接線圖
是:
      可以看到,VREF是空的,基準電壓可以設爲內部2.5V,但這樣會有問題,就是讀到的X,Y值最大隻有512,只有四分之一個屏可以用,出了這四分之一屏的地方都是512,512的座標.原因是什麼我也搞不明.有的網上文章上講要把VREF接到VCC上,我三種方法都試過,發現,把VREF接到VCC,同拋空結果都是一樣,不知爲什麼?
ADS7846有兩種工作方式:一種是單端輸入,一種是差分輸入。在需要進行壓力測量的時候,必須使用差分輸入的工作模式。我也是採用差分輸入,其實也不知兩者之間有什麼不同..
程序如下.
//call this routine to initialize all peripherals
void startspi(void)
{
SETDCLK;
SETDIN;
}

void WriteCharTo7846(uchar  num) //SPI寫數據
{
uchar count=0;
for(count=0;count<8;count++)
{
if ((num & (0x80>>count))!=0) SETDIN; else CLRDIN;
CLRDCLK;
delay_us(10); //上升沿有效
SETDCLK;
delay_us(10);
}
}
uint ReadFromCharFrom7846(void) //SPI 讀數據
{
uchar count=0;
uint Num=0;
for(count=0;count<12;count++)
{
Num<<=1;
SETDCLK;
delay_us(10);  //下升沿有效
CLRDCLK;
delay_us(10);
if(DOUT!=0) Num++;
}
return(Num);
}
 
void checkbut(void)  //外部中斷0 用來接受鍵盤發來的數據
{
delay_ms(20); //中斷後延時以消除抖動,使得采樣數據更準確
startspi();
WriteCharTo7846(0x90); //送控制字 10010000 即用差分方式讀X座標 詳細請見有關資料
while(BUSY!=0); //如果BUSY信號不好使可以刪除不用
delay_ms(2);
SETDCLK;
delay_us(10);
CLRDCLK;
delay_us(10);
positiony=ReadFromCharFrom7846();  //讀Y軸座標
WriteCharTo7846(0xD0); //送控制字 11010000 即用差分方式讀Y座標 詳細請見有關資料
while(BUSY!=0); //如果BUSY信號不好使可以刪除不用
delay_ms(2);
SETDCLK;
delay_us(10); //下降沿有效
CLRDCLK;
delay_us(10);
positionx=ReadFromCharFrom7846();  //讀X軸座標
readxy();
}
程序是參考程序匠人,多謝程序匠人,
 
調試過程中覺得測到的X,Y值不是很穩定,總有正負100左右的變化,不知算不算正常呢....??
還有我的CS 片選腳是直接接地的,不知會會有影響???
 
液晶屏已經正常工作了,下子幾張圖片進去,挺好玩的....
圖片是用image2lcd生成的.
中文字模用HZDotReader,和ZIMO軟件.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章