cortex_m3_stm32嵌入式學習筆記(二十二):觸摸屏實驗(觸摸屏驅動)

ARM 523瀏覽
目前最常用的觸摸屏有兩種:電阻式觸摸屏與電容式觸摸屏。
電阻式觸摸屏
在 Iphone 面世之前,幾乎清一色的都是使用電阻式觸摸屏, 電阻式觸摸屏利用壓力感應進行觸點檢測控制,需要直接應力接觸, 通過檢測電阻來定位觸摸位置。

電阻觸摸屏的主要部分是一塊與顯示器表面非常配合的電阻薄膜屏,這是一種多層的復合薄膜,它以一層玻璃或硬塑料平板作為基層,表面涂有一層透明氧化金屬(透明的導電電阻)導電層,上面再蓋有一層外表面硬化處理、光滑防擦的塑料層、它的內表面也涂有一層涂層、在他們之間有許多細小的(小于 1/1000 英寸)的透明隔離點把兩層導電層隔開絕緣。 當手指觸摸屏幕時,兩層導電層在觸摸點位置就有了接觸,電阻發生變化,在 X 和 Y 兩個方向上產生信號,然后送觸摸屏控制器。控制器偵測到這一接觸并計算出( X, Y)的位置,再根據獲得的位置模擬鼠標的方式運作。這就是電阻技術觸摸屏的最基本的原理。


電阻觸摸屏的優點: 精度高、價格便宜、抗干擾能力強、穩定性好。

電阻觸摸屏的缺點:容易被劃傷、透光性不太好、不支持多點觸摸。

電容式觸摸屏
現在幾乎所有智能手機,包括平板電腦都是采用電容屏作為觸摸屏, 電容屏是利用人體感應進行觸點檢測控制,不需要直接接觸或只需要輕微接觸,通過檢測感應電流來定位觸摸坐標。

這種比較高級了。。由于本人的開發板上帶的是電阻式觸摸屏,對這玩意就不多做介紹了。


底層驅動代碼。。好吧 給的例程很長,其中也包括了電容屏的驅動,懶的再貼了,分析一下主函數吧

#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "lcd.h" #include "key.h"   #include "24cxx.h"  #include "myiic.h" #include "touch.h"  //清屏 void Load_Drow_Dialog(void) { 	LCD_Clear(WHITE);//清屏     	POINT_COLOR=BLUE;//設置字體為藍色  	LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//顯示清屏區域   POINT_COLOR=RED;//設置畫筆藍色  }										  //電阻觸摸屏測試函數 void rtp_test(void) { 	u8 key; 	u8 i=0;	   	while(1) 	{ 	 	key=KEY_Scan(0); 		tp_dev.scan(0); 		  		if(tp_dev.sta&TP_PRES_DOWN)			//觸摸屏被按下 		{	 		 	if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height) 			{	 				 				TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);	//畫圖	  			    			} 		}else delay_ms(10);	//沒有按鍵按下的時候 	     		if(key==KEY0_PRES)	//KEY0按下,則執行校準程序 		{ 			LCD_Clear(WHITE);//清屏 		    TP_Adjust();  //屏幕校準  			TP_Save_Adjdata();	  			Load_Drow_Dialog(); 		} 		if(key==WKUP_PRES) Load_Drow_Dialog();//清除 		i++; 		if(i%20==0)LED0=!LED0; 	} }  int main(void)  {          NVIC_Configuration(); 	delay_init();	    	 //延時函數初始化	   	uart_init(9600);	 	//串口初始化為9600 	LED_Init();		  		//初始化與LED連接的硬件接口 	LCD_Init();			   	//初始化LCD 	 	KEY_Init();				//按鍵初始化		 	 	tp_dev.init();			//觸摸屏初始化  	POINT_COLOR=RED;//設置字體為紅色  	LCD_ShowString(60,50,200,16,16,"Mini STM32");	 	LCD_ShowString(60,70,200,16,16,"TOUCH TEST");	 	LCD_ShowString(60,90,200,16,16,"yh"); 	LCD_ShowString(60,110,200,16,16,"2015/02/06");         if(tp_dev.touchtype!=0XFF)LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");//電阻屏才顯示 	delay_ms(1500); 	Load_Drow_Dialog(); 	rtp_test();//電阻屏測試 } 

看到這個變量?

tp_dev

很明顯這是一個全局的結構體變量,翻到這個結構體的成員

//觸摸屏控制器 typedef struct { 	u8 (*init)(void);			//初始化觸摸屏控制器 	u8 (*scan)(u8);				//掃描觸摸屏.0,屏幕掃描;1,物理坐標;	  	void (*adjust)(void);		//觸摸屏校準  	u16 x[CT_MAX_TOUCH]; 		//當前坐標 	u16 y[CT_MAX_TOUCH];		//電容屏有最多5組坐標,電阻屏則用x[0],y[0]代表:此次掃描時,觸屏的坐標,用 								//x[4],y[4]存儲第一次按下時的坐標.  	u8  sta;					//筆的狀態  								//b7:按下1/松開0;  	                            //b6:0,沒有按鍵按下;1,有按鍵按下.  								//b5:保留 								//b4~b0:電容觸摸屏按下的點數(0,表示未按下,1表示按下) /////////////////////觸摸屏校準參數(電容屏不需要校準)//////////////////////								 	float xfac;					 	float yfac; 	short xoff; 	short yoff;	    //新增的參數,當觸摸屏的左右上下完全顛倒時需要用到. //b0:0,豎屏(適合左右為X坐標,上下為Y坐標的TP) //   1,橫屏(適合左右為Y坐標,上下為X坐標的TP)  //b1~6:保留. //b7:0,電阻屏 //   1,電容屏  	u8 touchtype; }_m_tp_dev;  extern _m_tp_dev tp_dev;	 	//觸屏控制器在touch.c里面定義

恩 。。各個成員的含義也寫的很清楚我就不啰嗦了。。

按KEY0校準按WK_UP清屏。。

七星彩走势图2元网官网