由于智能手機的發(fā)展和大屏幕的興起,觸摸屏已經(jīng)得到了廣泛的應用。觸摸屏分為兩種:電阻觸屏 俗稱“軟屏”;電容觸屏俗稱“硬屏”。
電阻觸摸屏的屏體部分是一塊多層復合薄膜,由一層玻璃或有機玻璃作為基層,表面涂有一層透明的阻性材料組成的導電層(ITO膜),上面再蓋有一層外表面經(jīng)過硬化處理、光滑防刮的塑料層。它的內(nèi)表面也涂有一層ITO,在兩層導電層之間有許多細小(小于千分之一英寸)的透明隔離點把它們隔開。當手指接觸屏幕時,兩層 ITO發(fā)生接觸,電阻發(fā)生變化,控制器根據(jù)檢測到的電阻變化來計算接觸點的坐標,再依照這個坐標來進行相應的操作,因此這種技術(shù)必須是要施力到屏幕上,才能獲得觸摸效果。
所有的電阻式觸摸屏都采用分壓器原理來產(chǎn)生代表X坐標和Y坐標的電壓。
分壓器是通過將兩個電阻進行串聯(lián)來實現(xiàn)的。
上面的電阻(R1)連接正參考電壓(VREF),
下面的電阻(R2)接地。
兩個電阻連接點處的電壓測量值與下面那個電阻的阻值成正比。
所以電阻屏的定位是通過AD采樣獲取電壓,來確定點擊位置的。
電容式觸摸屏利用人體的電流感應進行工作,其觸摸屏由一塊四層復合玻璃屏構(gòu)成。當手指觸摸在觸摸屏上時,由于人體電場、用戶和觸摸屏表面形成以一個耦合電容,對于高頻電流來說,電容是直接導體,于是手指從接觸點吸走一個很小的電流。這個電流分別從觸摸屏四角上的電極中流出,并且流經(jīng)這四個電極的電流與手指到四角的距離成正比,控制器通過對這四個電流比例的精確計算,得出觸摸點的位置信息。
電容觸摸屏原理:
兩種屏幕都有其優(yōu)缺點。電阻屏價格低廉,精度較高。電容屏外層可以使用玻璃,抗損性好,不容易出現(xiàn)誤操作,可以實現(xiàn)多點觸控。
這里驅(qū)動的是驅(qū)動IC為XPT2046的4線電阻式觸摸屏,觸摸屏的控制芯片很多,包括ADS7843、ADS7846、TSC2046、AK4182等。這幾款芯片的驅(qū)動程序基本上都是一樣的,而且封裝也有一樣的。
XPT2046是一款4導線制觸摸屏控制器,內(nèi)含12位分辨率125Khz轉(zhuǎn)換速率逐步逼近型A/D轉(zhuǎn)換器。XPT2046支持從1.5V~5.25V的低電壓I/O接口。XPT2046能通過執(zhí)行兩次A/D轉(zhuǎn)換查出被按下的屏幕位置,還可以測量出加在屏幕上的壓力大小。內(nèi)部自帶2.5V參考電壓可以作為輔助輸入,溫度測量和電池檢測模式之用。XPT2046片內(nèi)還集成一個溫度傳感器。
這里使用stm32驅(qū)動XPT2046和LCD實現(xiàn)一個觸摸檢測和字符顯示的功能,當檢測到特定位置” Click“按下后,顯示一個hello world ..
XPT2046驅(qū)動: (LCD的驅(qū)動參見:stm32 驅(qū)動 TFT LCD):
xpt2046.cxpt2046.h
觸摸屏的觸摸檢測是通過連接XPT2046的引腳,映射為外部中斷觸發(fā)引腳,在有屏幕觸摸時,觸發(fā)外部中斷,所以需要配置一個外部中斷函數(shù):
stm32f10x_it.c
#include"stm32f10x_it.h"#include"xpt2046.h"http://中斷,檢測到PEN腳的一個下降沿.//置位Pen_Point.Key_Sta為按下狀態(tài)//中斷線0線上的中斷檢測voidEXTI1_IRQHandler(void){Pen_Point.Key_Sta=Key_Down;//按鍵按下EXTI->PR=1<<1;//清除中斷標志位使用庫函數(shù)會出現(xiàn)問題,原因不詳//EXTI_ClearITPendingBit(EXTI_Line1);//這兩句清除中斷順序不能顛倒//EXTI_ClearFlag(EXTI_Line1);//清除LINE1上的中斷標志位}
在mian()函數(shù)中調(diào)用相關(guān)函數(shù):
intmain(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);//關(guān)閉中斷do{Convert_Pos();Pen_Point.Key_Sta=Key_Up;if(Pen_Point.X0>180&&Pen_Point.Y0<16)//判定按下的是否是"Click"字符按鈕區(qū)域{LCD_Clear(WHITE);LCD_ShowString(30,50,"HelloDog..");}}while(TOUCH_PEN==0);//如果PEN一直有效,則一直執(zhí)行Pen_Int_Set(1);//開啟中斷}}}
顯示效果: