1. 程式人生 > >stm32 驅動 觸控式螢幕

stm32 驅動 觸控式螢幕

由於智慧手機的發展和大螢幕的興起,觸控式螢幕已經得到了廣泛的應用。觸控式螢幕分為兩種:電阻觸屏   俗稱“軟屏”;電容觸屏俗稱“硬屏”。     電阻觸控式螢幕的屏體部分是一塊多層複合薄膜,由一層玻璃或有機玻璃作為基層,表面塗有一層透明的阻性材料組成的導電層(ITO膜),上面再蓋有一層外表面經過硬化處理、光滑防刮的塑料層。它的內表面也塗有一層ITO,在兩層導電層之間有許多細小(小於千分之一英寸)的透明隔離點把它們隔開。當手指接觸螢幕時,兩層 ITO發生接觸,電阻發生變化,控制器根據檢測到的電阻變化來計算接觸點的座標,再依照這個座標來進行相應的操作,因此這種技術必須是要施力到螢幕上,才能獲得觸控效果。     所有的電阻式觸控式螢幕都採用分壓器原理來產生代表X座標和Y座標的電壓。        8a95ad1cc0c1169586d6b644.jpg  分壓器是通過將兩個電阻進行串聯來實現的。          上面的電阻(R1)連線正參考電壓(VREF),          下面的電阻(R2)接地。          兩個電阻連線點處的電壓測量值與下面那個電阻的阻值成正比。      所以電阻屏的定位是通過AD取樣獲取電壓,來確定點選位置的。     電容式觸控式螢幕利用人體的電流感應進行工作,其觸控式螢幕由一塊四層複合玻璃屏構成。當手指觸控在觸控式螢幕上時,由於人體電場、使用者和觸控式螢幕表面形成以一個耦合電容,對於高頻電流來說,電容是直接導體,於是手指從接觸點吸走一個很小的電流。這個電流分別從觸控式螢幕四角上的電極中流出,並且流經這四個電極的電流與手指到四角的距離成正比,控制器通過對這四個電流比例的精確計算,得出觸控點的位置資訊。 電容觸控式螢幕原理:     c_touch.jpg
touch.jpg 兩種螢幕都有其優缺點。電阻屏價格低廉,精度較高。電容屏外層可以使用玻璃,抗損性好,不容易出現誤操作,可以實現多點觸控。     這裡驅動的是驅動IC為XPT2046的4線電阻式觸控式螢幕,觸控式螢幕的控制晶片很多,包括ADS7843、ADS7846、TSC2046、AK4182等。這幾款晶片的驅動程式基本上都是一樣的,而且封裝也有一樣的。     XPT2046是一款4導線制觸控式螢幕控制器,內含12位解析度125Khz轉換速率逐步逼近型A/D轉換器。XPT2046支援從1.5V~5.25V的低電壓I/O介面。XPT2046能通過執行兩次A/D轉換查出被按下的螢幕位置,還可以測量出加在螢幕上的壓力大小。內部自帶2.5V參考電壓可以作為輔助輸入,溫度測量和電池檢測模式之用。XPT2046片內還整合一個溫度感測器。     這裡使用stm32驅動XPT2046和LCD實現一個觸控檢測和字元顯示的功能,當檢測到特定位置” Click“按下後,顯示一個hello world .. 
XPT2046驅動: (LCD的驅動參見:stm32 驅動 TFT LCD): 觸控式螢幕的觸控檢測是通過連線XPT2046的引腳,對映為外部中斷觸發引腳,在有螢幕觸控時,觸發外部中斷,所以需要配置一個外部中斷函式: stm32f10x_it.c
#include "stm32f10x_it.h"
#include "xpt2046.h"

//中斷,檢測到PEN腳的一個下降沿.
//置位Pen_Point.Key_Sta為按下狀態
//中斷線0線上的中斷檢測
void EXTI1_IRQHandler(void)
{ 		   			 
	Pen_Point.Key_Sta=Key_Down;//按鍵按下  
	
	
	EXTI->PR = 1<<1;    //清除中斷標誌位 使用庫函式會出現問題,原因不詳
	//EXTI_ClearITPendingBit(EXTI_Line1);		//這兩句清除中斷順序不能顛倒
    //EXTI_ClearFlag(EXTI_Line1);//清除LINE1上的中斷標誌位
} 
在mian()函式中呼叫相關函式:
int main(void)
{
	//stm32 初始化		
	RCC_Configuration();
	NVIC_Configuration();		
	USART_Configuration();
	SPI_Configuration();
	EXTI_Configuration();
	GPIO_Configuration();

	LCD_Init();
	Touch_Init();

	POINT_COLOR = BLACK;	//設定字型顏色
   	

       Delay(100000);

	LCD_ShowString(180,0,"Click");//顯示"Click"字元按鈕

	while(1){
		if(Pen_Point.Key_Sta==Key_Down)//觸控式螢幕被按下
		{
			Pen_Int_Set(0);//關閉中斷
			do
			{
				Convert_Pos();
				Pen_Point.Key_Sta=Key_Up;
																		   
				if(Pen_Point.X0>180&&Pen_Point.Y0<16)	//判定按下的是否是  "Click"字元按鈕區域
				{
					LCD_Clear(WHITE);
					LCD_ShowString(30,50,"Hello Dog .. ");		
				}
			}while(TOUCH_PEN==0);//如果PEN一直有效,則一直執行
			Pen_Int_Set(1);//開啟中斷
		}
	}

}
顯示效果: Image.gif