一、 触摸屏类型与原理
STM32可以使用不同类型的触摸屏,包括电阻式和电容式触摸屏。
1.电阻式触摸屏:基于电阻效应,当触摸屏被触摸时,触摸点处的导电层之间会形成一个电阻,导致电流通过。电阻触摸屏通常只能支持单点触碰,需要较大的触摸力度才能感应到。
2.电容式触摸屏:当手指触摸屏幕时,手指与导电涂层之间形成了一个微小的电容。传感器会检测这个电容的变化,并将其转化为触摸信号。电容触摸屏支持多点触控,且感应灵敏。
对于电阻式触摸屏,当用户用手指或触摸笔在屏幕上按下时,两层导电薄膜接触在一起,形成电流。触摸点的坐标通过测量这个电流来确定。
二、 触摸屏控制器与接口
STM32通常需要通过外接带触摸屏的LCD模块来实现触摸屏功能。
触摸屏控制器的主要作用是从触摸点检测装置上接收触摸信息,并将它转换成触点坐标,再传送给CPU。对于STM32来说,触摸屏控制器通常通过SPI、I2C等接口与STM32进行通信。
常见的触摸屏控制器有XPT2046、ADS7843等,它们与STM32的通信方式简单可靠。
三、触摸屏驱动与配置
1.驱动安装:根据触摸屏的型号和接口类型,安装相应的驱动程序。对于Windows系统,可能需要禁用驱动程序强制签名才能使用触摸屏下载线直接下载程序。
2.配置引脚:根据触摸屏控制器的引脚定义,配置STM32的相应引脚作为通信接口。
3.初始化配置:在代码中初始化触摸屏控制器,设置通信参数、工作模式等。
四、 读取触摸坐标
STM32通过触摸屏控制器读取触摸坐标的过程通常如下:
1.发送指令:STM32通过SPI或I2C接口向触摸屏控制器发送读取坐标的指令。
2.接收数据:触摸屏控制器根据指令,将触摸点的坐标数据发送给STM32。
3.数据处理:STM32接收到数据后,需要进行相应的处理,如AD转换(对于模拟信号输出的触摸屏)等,以获得准确的坐标值。
五、显示坐标
在STM32中显示触摸坐标通常涉及以下几个步骤:
1.坐标转换:由于触摸屏输出的坐标可能是基于物理尺寸或特定格式的,因此需要进行坐标转换,将其转换为适合在LCD屏幕上显示的坐标。
2.LCD屏设置:确保LCD屏已经正确初始化,并准备好显示内容。
3.编写显示函数:在STM32的代码中编写函数,将转换后的坐标显示在LCD屏幕上。这可以通过在指定位置绘制光标、数字或其他标记来实现。
六、 注意事项
1.触摸屏校准:新购买的触摸屏可能需要进行校准,以获取准确的触摸位置信息。
2.驱动冲突:在安装触摸屏驱动程序时,注意避免与其他设备的驱动程序发生冲突。
3.软件问题:触摸屏问题有时可能是由软件问题引起的,如操作系统的故障、驱动程序的失效或冲突等。
七、 示例代码
(一)获取触摸屏触摸状态
触摸屏被按下是随机的,当被按下时会产生一个中断信号,根据这个中断信号再去读取触摸屏,就能知道是哪个地方被按下了。这里不使用中断信号,使用轮训的方式,每10ms读取一次触摸状态。我们将触摸屏处理函数放在滴答定时器的中断函数中。
在“stm32f4xx_it.c”文件中的SysTick_Handler()函数中调用触摸屏处理函数,每10ms询问触摸屏是否有触摸操作
void SysTick_Handler(void)
{
static uint16_t timecount = 0;
if(timecount >= 1000)
{
timecount = 0;
GTP_TouchProcess();
}
timecount++;
TimingDelay_Decrement();
}
(二)获取触摸操作及坐标
//触摸屏被按下时该函数被调用,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"
#include "bsp_i2c_touch.h"
//编写中断服务函数
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);
}
}
//触摸屏被按下时该函数被调用,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);
}
int main(void)
{
GPIO_InitTypeDef gpio_info;
Delay_init();
GTP_Init_Panel();
//屏幕初始化
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);
/*设置字体颜色及字体的背景颜色(此处的背景不是指LCD的背景层!注意区分)*/
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
/*选择字体*/
LCD_SetFont(&Font16x24);
LCD_SetZNFont(&ZN_Font48x48);
while(1)
{
}
}
七、效果展示
按下时显示按下时的坐标Press point
当松开手后显示松开后的坐标Release point
总结
STM32触摸屏广泛应用于各种嵌入式系统中,如智能家居、工业自动化、医疗设备等领域。通过触摸屏,用户可以直观地与设备进行交互,实现各种功能和控制操作。
综上所述,STM32触摸屏的使用涉及多个方面,包括触摸屏类型、控制器、驱动配置、坐标读取与显示、触摸事件处理等。通过合理配置和编程,可以实现STM32与触摸屏之间的有效通信和人机交互,为各种嵌入式应用提供便捷的操作体验。