触摸屏的使用

前言

触摸屏的好处包括其坚固耐用、反应速度快、节省空间、易于交流、色彩丰富、轻薄便携、高分辨率、无辐射、耗电量低、使用寿命长、简单易用的操作方式、市场前景广阔、低辐射、不闪烁不耀眼、体积小重量轻、高低温承受能力强、灵敏度高等。12

触摸屏作为一种最新的电脑输入设备,具有许多优点,包括但不限于:

  • 易用性:触摸屏允许用户通过简单的触摸操作来执行命令,无需使用键盘或鼠标,使得人机交互更加直接和自然。
  • 色彩丰富:触摸屏电视机提供绚丽饱满的画面和清晰的层次感,增强观看体验。
  • 轻薄便携:触摸屏的屏幕大而体积小,便于安装和携带。
  • 高分辨率:使用纯平面的玻璃板,提供高分辨率和良好的显示角度。
  • 无辐射:触摸屏电视机没有辐射,不会产生屏幕闪烁,减少视觉疲劳。
  • 低耗电和长寿命:触摸屏电视机是绿色节能的产品,相比传统电视机,能节省电费并具有更长的使用寿命。
  • 简单易用的操作方式:触摸屏使得用户无需学习新的输入法或跟随鼠标移动,只需简单一指即可实现操作,更加直观和自然。
  • 市场前景广阔:随着“人机界面”的兴起,触摸屏技术正迎来新的发展机遇,未来将涌现出更多的个人化和小型化的触控产品。
  • 低辐射:电容式触摸屏号称低辐射,保证人体安全,也适合生产智能化产品。
  • 不闪烁不耀眼:电容式触摸屏在启动时不会出现闪烁或耀眼的情况,提供舒适的用户体验。
  • 体积小重量轻:电容式触摸屏的体积和重量较小,适合现代人携带和使用的需求。
  • 高低温承受能力强:电阻式触摸屏能够适应较大的温度变化范围,满足各种生产环境需求。
  • 灵敏度高:电阻式触摸屏的灵敏度非常高,即使在没有给予一定压力的情况下,灰尘或水分掉在屏幕上也不会导致误操作。

这些优点使得触摸屏在多个领域得到广泛应用,如公共信息查询、工业控制、军事指挥、电子游戏、多媒体教学等,并有望在未来进一步普及到更多领域和家庭中。

目录

触摸屏概述

电容触摸屏的驱动

电容触摸屏的使用

四、完整代码

触摸屏概述

1.触摸屏分类   

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

(1)电阻触摸屏

(2)电容触摸屏

2.电阻触摸屏检测原理

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

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

3.电容触摸屏检测原理

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

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

电容触摸屏的驱动

1.驱动芯片

电容屏的坐标检测比电阻屏的要复杂,因而它也有专用芯片用于检测过程,下面我们以本章重点讲述的电容屏使用的触控芯片 GT9157 为例进行讲解,关于它的详细说明可从《gt91x编程指南》和《电容触控芯片 GT9157》文档了解。

GT9157的芯片引脚如下:

需要连接到MUC的一共4根线,IIC两根,INT、RSTB

2.MCU读取触摸坐标

MCU通过IIC接口和触摸屏进行通信,IIC和串口一样,是一种串行传输方式,IIC是一种总线传输方式,可以在上边同时连接多个设备,但是同一时间只能和一个设备通信。

因为IIC总线能连接多个设备的缘故,所以IIC读写时要先发送想要通信的设备的地址,双方建立连接后才能进一步通信。

1.添加IIC通信支持文件,该文件用来初始化MCU与触摸屏连接的引脚,并通过IIC发送或者读取数据

这个模块的接口很简单,如下图所示

使用时先调用I2C_Touch_Init()函数进行引脚等初始化,接着就可以使用发送或者读取函数进行数据交互了,至于要发送的数据是什么,由其他模块决定,bsp_i2c_touch模块被称为传输驱动文件,它只提供数据的收发,并不管传输的是什么数据,就好比两个人打电话,手机只是提供了信息交互的通路,至于要传输给对方什么信息,是由打电话的人决定的。

2.添加触摸屏驱动(就是打电话的人)

模块的接口如下图所示:

电容触摸屏的使用

1.初始化触摸屏

在main函数中调用触摸屏初始化函数

GTP_Init_Panel();

2.获取触摸屏触摸状态

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

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

3.获取触摸操作及坐标

在main.c文件中重新定义以下两个函数,这两个函数在触摸驱动中进行了弱声明

//触摸屏被按下时该函数被调用,x,y是按下时的坐标值
void GTP_Press_Event(int32_t x,int32_t y)
{
  uint8_t buf[100] = {0};
  sprintf((char*)buf,"Press point:%d  %d    ",x,y);  //构造字符串,显示按下时的坐标
  LCD_DisplayStringLine(LINE(0),(uint8_t* )buf);
}
//触摸屏松开时该函数被调用,x,y是松开时的坐标值
void GTP_Release_Event(int32_t x,int32_t y) 
{
  uint8_t buf[100] = {0};
  sprintf((char*)buf,"Release point:%d  %d    ",x,y);//构造字符串,显示松开时的坐标
  LCD_DisplayStringLine(LINE(0),(uint8_t* )buf);
}

四 、完整代码如下

#include "stm32F4xx.h"
#include "stm32f4xx_conf.h"
#include "stdio.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "uart.h"
#include "adc.h"
#include "bsp_lcd.h"
#include "lcd_show_zn.h"
#include "lcd_show_zn_font.h"
#include "gt9xx.h"
 
uint16_t select_index = 0;  //表明当前选中哪一个菜单项
uint8_t  beep_state = 0;    //表示蜂鸣器的开关状态  0表示关闭  
uint8_t  led_state = 0;    //表示LED的开关状态  0表示关闭  
 
 
//编写中断服务函数
void EXTI0_IRQHandler()
{
    if(EXTI_GetITStatus(EXTI_Line0) != RESET)  //证明触发了中断
    {
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}
void EXTI15_10_IRQHandler()
{
    if(EXTI_GetITStatus(EXTI_Line13) != RESET)  //证明触发了中断
    {
        EXTI_ClearITPendingBit(EXTI_Line13);
    }
}
 
 
//触摸屏按下
void GTP_Press_Event(int32_t x,int32_t y)
{
  uint8_t buf[100] = {0};
  sprintf((char*)buf,"Press point:%d  %d    ",x,y);
  LCD_DisplayStringLine(LINE(0),(uint8_t* )buf);
  
  
  if(x>100 && x<200 && y>100 && y<160)  //判断按下坐标是不是在矩形框内 
  {
    LCD_SetColors(LCD_COLOR_BLUE,LCD_COLOR_BLACK);   //更改颜色
    LCD_DrawFullRect(100,100,100,60);                //画一个新的矩形框覆盖旧的矩形框
    LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);  //把颜色改回来
    
    LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_BLUE);
    LCD_DrawCharCN(110,110,"BEEP");  //在矩形框上写字
    LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
  }
  else
  {
    //LCD_DrawFullRect(100,100,100,60);
  }
}
 
//松开触摸屏
void GTP_Release_Event(int32_t x,int32_t y) 
{
  uint8_t buf[100] = {0};
  sprintf((char*)buf,"Release point:%d  %d    ",x,y);
  LCD_DisplayStringLine(LINE(0),(uint8_t* )buf);
  
  if(x>100 && x<200 && y>100 && y<160)   //判断松开时是不是在矩形框内,松开时在矩形框内才认为单击有效
  {
    if(beep_state == 0)
    {
      GPIO_SetBits(GPIOI,GPIO_Pin_11);//开启蜂鸣器
      beep_state = 1;//更新蜂鸣器的状态
    }
    else
    {
      GPIO_ResetBits(GPIOI,GPIO_Pin_11);//关闭蜂鸣器
      beep_state = 0;//更新蜂鸣器的状态
    }
    
     //画一个矩形框,作为按键
    LCD_DrawFullRect(100,100,100,60);
    LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
    LCD_DrawCharCN(110,110,"BEEP");  //在矩形框上写字
    LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
    
  }
}
int main(void)
{
    GPIO_InitTypeDef gpio_info;
 
    GTP_Init_Panel();
    Delay_init();
    UART_init(115200);
    LED_init();
    
    //屏幕初始化
    LCD_Init();
    //屏幕显示层初始化
    LCD_LayerInit();
    //LTCD外设初始化
    LTDC_Cmd(ENABLE);
   // 
  
    /*把背景层刷黑色*/
    //选定控制背景层
    LCD_SetLayer(LCD_BACKGROUND_LAYER);  
    //清除屏幕并用黑色填充
    LCD_Clear(LCD_COLOR_BLACK);
	
    /*初始化后默认使用前景层*/
    LCD_SetLayer(LCD_FOREGROUND_LAYER); 
    /*默认设置不透明	,该函数参数为不透明度,范围 0-0xff ,0为全透明,0xff为不透明*/
    LCD_SetTransparency(0xFF);
    //清除屏幕并用黑色填充
    LCD_Clear(LCD_COLOR_BLACK);
  
 #if 1
    //PI11  蜂鸣器
    //初始化GPIO-I时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
    
    gpio_info.GPIO_Mode = GPIO_Mode_OUT;
    gpio_info.GPIO_OType = GPIO_OType_PP;
    gpio_info.GPIO_Pin = GPIO_Pin_11;
    gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
    gpio_info.GPIO_Speed = GPIO_Low_Speed;
    GPIO_Init(GPIOI,&gpio_info);
#endif
  
    /*设置字体颜色及字体的背景颜色(此处的背景不是指LCD的背景层!注意区分)*/
    LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
    
    /*选择字体*/
    LCD_SetFont(&Font16x24);
    
    LCD_SetZNFont(&ZN_Font24x24);
    
    
    //画一个矩形框,作为按键
    LCD_DrawFullRect(100,100,100,60);
    LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
    LCD_DrawCharCN(110,110,"BEEP");  //在矩形框上写字
    LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
    while(1)
    {
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值