嵌入式触摸屏

目录

一、摘要

二、触摸屏的介绍

2.1电阻式触摸屏的原理

2.2电容触摸屏检测原理

三、代码实施

3.1初始化触摸屏

3.2获取触摸屏触摸状态

3.3获取触摸操作及坐标

3.4延时函数

四、总结


一、摘要

 触摸屏(touch screen)又称为“触控屏”、“触控面板”,是一种可接收触头等输入讯号的感应式装置。作为一种新型的电脑输入设备,可以用来取代传统的机械按键等输入设备。它是目前最简单、方便、自然的一种人机交互方式。主要应用于公共信息的查询、领导办公、工业控制、军事指挥、电子游戏、点歌点菜、多媒体教学、房地产预售等。
  触摸屏本质上与液晶是分离的。触摸屏负责的是检测触摸点,液晶屏负责的是显示。区别开来。

二、触摸屏的介绍

2.1电阻式触摸屏的原理

电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的(小于 1/1000 英寸)的透明隔离点把两层导电层隔开绝缘。

电阻触摸屏主要由2层透明的电阻层组成,两个电阻涂层的两端分别引出 X-、 X+、 Y-、 Y+ 四个电极,当触摸屏被按下时,两个电阻层相互接触,从触点处把电阻层分为两个电阻,且由于电阻层均匀导电,两个电阻的大小与触点离两电极的距离成比例关系,利用这个特性,可通过以下过程来检测坐标,这也正是电阻触摸屏名称的由来

通过分别给X轴和Y轴的接口通电并检测电压,就能计算出触点的位置。

2.2电容触摸屏检测原理

与电阻式触摸屏不同,电容式触摸屏不需要通过压力使触点变形,再通过触点处电压值来检测坐标,它的基本原理和前面定时器章节中介绍的电容按键类似,都是利用充电时间检测电容大小,从而通过检测出电容值的变化来获知触摸信号。

 X 轴电极与 Y 轴电极在交叉处形成电容,即这两组电极构成了电容的两极,这样的结构覆盖了整个电容屏,每个电容单元在触摸屏中都有其特定的物理位置,即电容的位置就是它在触摸屏的XY 坐标。检测触摸的坐标时,第 1 条 X 轴的电极发出激励信号,而所有 Y 轴的电极同时接收信号,通过检测充电时间可检测出各个 Y 轴与第 1 条 X 轴相交的各个互电容的大小,各个 X 轴依次发出激励信号,重复上述步骤,即可得到整个触摸屏二维平面的所有电容大小。当手指接近时,会导致局部电容改变,根据得到的触摸屏电容量变化的二维数据表,可以得知每个触摸点的坐标,因此电容触摸屏支持多点触控。

三、代码实施

3.1初始化触摸屏

void LCD_csh(void)
{
  LCD_Init();
	LCD_LayerInit();
	LTDC_Cmd(ENABLE);
	
	LCD_SetLayer(LCD_BACKGROUND_LAYER);
	//清楚屏幕,并用黑色填充
	LCD_Clear(LCD_COLOR_BLACK);
	
	LCD_SetLayer(LCD_FOREGROUND_LAYER);
	LCD_SetTransparency(0xFF);
	//清楚屏幕,并用黑色填充
	LCD_Clear(LCD_COLOR_BLACK);
	//设置字体颜色及字体背景颜色;
	LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
	//选择字体
	LCD_SetFont(&Font16x24);
}

3.2获取触摸屏触摸状态

触摸屏被按下是随机的,当被按下时会产生一个中断信号,根据这个中断信号再去读取触摸屏,就能知道是哪个地方被按下了。这里不使用中断信号,使用轮训的方式,每10ms读取一次触摸状态。我们将触摸屏处理函数放在滴答定时器的中断函数中。

在“stm32f4xx_it.c”文件中的SysTick_Handler()函数中调用触摸屏处理函数,每10ms询问触摸屏是否有触摸操作

extern void TimingDelay Decrement():
extern void GTP_TouchProcess(void);

void SysTick Handler (void)
{
static uint16_t timecount =0;
if(timecount>=1000)
{
timecount=0;
GTP TouchProcess();
}
timecount++;
TimingDelay_Decrement ();
}

3.3获取触摸操作及坐标

触摸屏被按下的时候函数被调用,X,Y是按下时的坐标值

void GTP_Press_Event(int32_t x,int32_t y)
{
	if(x>=400 && x<=600 && y>=200 && y <= 250){
		LCD_SetColors(LCD_COLOR_RED,LCD_COLOR_BLACK);
		LCD_DrawFullRect(390,190,160,70);
		//LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);	
		
		LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_RED);
		#if SHOW_NEW == 0
			LCD_DrawCharCN(400,200,"BEEF");
		#else
			LCD_DisplayStringLineEx(400,200,48,48,"蜂鸣器",0);	
		#endif
		LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);	
			
		}
	else if(x>=200 && x<=400 && y>=200 && y <= 250)
	{
		LCD_SetColors(LCD_COLOR_GREEN,LCD_COLOR_BLACK);
		LCD_DrawFullRect(190,190,160,70);
		LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);	
		
		LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_GREEN);
		#if SHOW_NEW == 0
			LCD_DrawCharCN(200,200,"LED");
		#else
			LCD_DisplayStringLineEx(220,200,48,48,"灯泡",0);
		#endif
		LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
		
	}
	else
	{
		LCD_DrawFullRect(390,190,160,70);
		LCD_DrawFullRect(190,190,160,70);
		#if SHOW_NEW == 0
			LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);//背景白,字体黑
			LCD_DrawCharCN(400,200,"BEEF");	
			LCD_DrawCharCN(200,200,"LED");
			LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//背景白,字体黑	
		#else
			LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);//背景白,字体黑
			LCD_DisplayStringLineEx(400,200,48,48,"蜂鸣器",0);		
			LCD_DisplayStringLineEx(220,200,48,48,"灯泡",0);
			LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//背景白,字体黑
	#endif	
	}
	}	

触摸屏松开时该函数被调用,X,Y是松开时的坐标值

void GTP_Release_Event(int32_t x,int32_t y) 
{

	if(x>=400 && x<=600 && y>=200 && y <= 250){
		FunRun();		
		LCD_DrawFullRect(390,190,160,70);
		LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
		#if SHOW_NEW == 0	
			LCD_DrawCharCN(400,200,"BEEF");
		#else		
			LCD_DisplayStringLineEx(400,200,48,48,"蜂鸣器",0);	
		#endif
	}
	if(x>=200 && x<=400 && y>=200 && y <= 250){
		FunRun2();
		
		LCD_DrawFullRect(190,190,160,70);
		LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
		#if SHOW_NEW == 0
			LCD_DrawCharCN(200,200,"LED");
		#else
			LCD_DisplayStringLineEx(220,200,48,48,"灯泡",0);
		#endif

	}
	
}


int main(void)
{	 
	//uart_into(115200);
	//ADC_into();
	BEEP_GPIO_Config();
	LED_init();	
	LCD_csh();
	key1_init();
	key2_init();
	delay_init();	
	I2C_Touch_Init();
	GTP_Init_Panel();
	LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//背景白,字体黑

	LCD_DrawFullRect(390,190,160,70);
	LCD_DrawFullRect(190,190,160,70);
	#if SHOW_NEW == 0
		LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);//背景白,字体黑
		LCD_DrawCharCN(400,200,"BEEF");	
		LCD_DrawCharCN(200,200,"LED");
		LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//背景白,字体黑	
	#else
		LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);//背景白,字体黑
		LCD_DisplayStringLineEx(400,200,48,48,"蜂鸣器",0);		
		LCD_DisplayStringLineEx(220,200,48,48,"灯泡",0);
		LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//背景白,字体黑
	#endif	
	while(1)
	{	
		
	}
		
}

3.4延时函数

#include "delay.h"

__IO int TimingDelay = 0;


void TimingDelay_Decrement(void)
{
	if(TimingDelay !=0)
		TimingDelay--;
}

void delay10_us(__IO int ms)
{    
	TimingDelay = ms;
	while(TimingDelay !=0);
}

void delay_ms(__IO int ms)
{    
	delay10_us(ms*100);
}

void delay_init(void)
{
	//设置每10us中断
	SysTick_Config(SystemCoreClock/100000);
}

四、总结

 触摸屏又称触控面板,它是一种把触摸位置转化成坐标数据的输入设备,根据触摸屏的检测原
理,主要分为电阻式触摸屏和电容式触摸屏。相对来说,电阻屏造价便宜,能适应较恶劣的环境,
但它只支持单点触控 (一次只能检测面板上的一个触摸位置),触摸时需要一定的压力,使用久了
容易造成表面磨损,影响寿命;而电容屏具有支持多点触控、检测精度高的特点,电容屏通过与
导电物体产生的电容效应来检测触摸动作,只能感应导电物体的触摸,湿度较大或屏幕表面有水
珠时会影响电容屏的检测效果。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值