stm32 驅動 觸控式螢幕
阿新 • • 發佈:2019-01-29
由於智慧手機的發展和大螢幕的興起,觸控式螢幕已經得到了廣泛的應用。觸控式螢幕分為兩種:電阻觸屏 俗稱“軟屏”;電容觸屏俗稱“硬屏”。
電阻觸控式螢幕的屏體部分是一塊多層複合薄膜,由一層玻璃或有機玻璃作為基層,表面塗有一層透明的阻性材料組成的導電層(ITO膜),上面再蓋有一層外表面經過硬化處理、光滑防刮的塑料層。它的內表面也塗有一層ITO,在兩層導電層之間有許多細小(小於千分之一英寸)的透明隔離點把它們隔開。當手指接觸螢幕時,兩層 ITO發生接觸,電阻發生變化,控制器根據檢測到的電阻變化來計算接觸點的座標,再依照這個座標來進行相應的操作,因此這種技術必須是要施力到螢幕上,才能獲得觸控效果。
所有的電阻式觸控式螢幕都採用分壓器原理來產生代表X座標和Y座標的電壓。
分壓器是通過將兩個電阻進行串聯來實現的。
上面的電阻(R1)連線正參考電壓(VREF),
下面的電阻(R2)接地。
兩個電阻連線點處的電壓測量值與下面那個電阻的阻值成正比。
所以電阻屏的定位是通過AD取樣獲取電壓,來確定點選位置的。
電容式觸控式螢幕利用人體的電流感應進行工作,其觸控式螢幕由一塊四層複合玻璃屏構成。當手指觸控在觸控式螢幕上時,由於人體電場、使用者和觸控式螢幕表面形成以一個耦合電容,對於高頻電流來說,電容是直接導體,於是手指從接觸點吸走一個很小的電流。這個電流分別從觸控式螢幕四角上的電極中流出,並且流經這四個電極的電流與手指到四角的距離成正比,控制器通過對這四個電流比例的精確計算,得出觸控點的位置資訊。
電容觸控式螢幕原理:
兩種螢幕都有其優缺點。電阻屏價格低廉,精度較高。電容屏外層可以使用玻璃,抗損性好,不容易出現誤操作,可以實現多點觸控。
這裡驅動的是驅動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
在mian()函式中呼叫相關函式:#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上的中斷標誌位 }
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);//開啟中斷
}
}
}
顯示效果: