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