cortex_m3_stm32嵌入式学习笔记(二十二):触摸屏实验(触摸屏驱动)

ARM 359浏览
目前最常用的触摸屏有两种:电阻式触摸屏与电容式触摸屏。
电阻式触摸屏
在 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清屏。。