基于STM32的图形交互界面设计—— 触屏坐标识别

发布时间:2024-01-18 09:17:06 浏览量:349次

一,电阻触摸屏工作原理

  1. 原理图

2.坐标计算方法

3.触屏接口

4.触屏驱动程序

5.使用触屏驱动——bsp_lcd.h

6.bsp_xpt2046_lcd.h解析

¤54行:定义XPT2046触摸屏的坐标扫描方向

//1:竖屏 2:横屏,根据实际情况自行修改,与屏幕显示方向保持一致

#define macXPT2046_Coordinate_GramScan 2

¤98行:定义全局变量

//触摸标志:按下为1(按下申请外部中断,在中断服务程序中设置),释放清零

extern volatile uint8_t ucXPT2046_TouchFlag;

//校准系数,具体数据在bsp_xpt2046_lcd.c中,根据屏幕显示方向选择

extern strType_XPT2046_TouchPara strXPT2046_TouchPara;

7.驱动函数介绍

¤void XPT2046_Init( void );

¤在LCD_Init()函数中调用

¤配置SPI接口CS,MISO,MOSI,CLK引脚工作模式

¤配置触屏输入中断

下降沿触发,允许中断,优先级0,0

8.设计触屏中断服务程序

// EXTI Line --> PE4
void macXPT2046_EXTI_INT_FUNCTION ( void )
{ 
if ( EXTI_GetITStatus ( macXPT2046_EXTI_LINE ) != RESET )
{
 ucXPT2046_TouchFlag = 1; 
 EXTI_ClearITPendingBit ( macXPT2046_EXTI_LINE ); 
}
}

9.驱动函数介绍

举例

10.驱动函数介绍

11.执行效果

11.屏幕方向设置

¤1) bsp_lcd.c
 ILI9341_Init (); 
 ILI9341_GramScan(1);
¤2) bsp_xpt2046_lcd.h
 #define macXPT2046_Coordinate_GramScan 1
¤3) bsp_xpt2046_lcd.c
 strType_XPT2046_TouchPara strXPT2046_TouchPara = { 
0.001030, 0.064188, -10.804098, -0.085584, 0.001420, 324.127036 
 };
¤4) bsp_ili9341_lcd.h
 #define macILI9341_Default_Max_Width 240 //最大宽度
 #define macILI9341_Default_Max_Heigth 320 //最大高度
 #define macILI9341_DispWindow_COLUMN 240 //总列数
 #define macILI9341_DispWindow_PAGE 320 //总行数

12.程序设计技巧—条件编译

 #define ScreenDirection 1 
 
 //定义校准系数
 #if ScreenDirection==1
 strType_XPT2046_TouchPara strXPT2046_TouchPara = { 
 0.001030, 0.064188, -10.804098, -0.085584, 0.001420, 324.127036 
 };
 #elif ScreenDirection==2
 strType_XPT2046_TouchPara strXPT2046_TouchPara = { 
 0.085958, -0.001073, -4.979353, -0.001750, 0.065168, -13.318824 
 };
#endif

二,总工程

#include "stm32f10x.h"
#include "bsp_lcd.h"
#include "fatfs_flash_spi.h"
#include "bsp_usart1.h"
#include "pic.h"
#include <stdio.h>
#define LEDBLUE_ON		GPIO_ResetBits(GPIOB, GPIO_Pin_1)
#define LEDBLUE_OFF		GPIO_SetBits(GPIOB, GPIO_Pin_1)
#define LEDGREEN_ON		GPIO_ResetBits(GPIOB, GPIO_Pin_0)
#define LEDGREEN_OFF	GPIO_SetBits(GPIOB, GPIO_Pin_0)
#define LEDRED_ON			GPIO_ResetBits(GPIOB, GPIO_Pin_5)
#define LEDRED_OFF		GPIO_SetBits(GPIOB, GPIO_Pin_5)
void Delay(u32 Cnt)
{
	while(--Cnt);
}
void GPIO_Configration()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	//必须先开启时钟再配置引脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC ,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	LEDBLUE_OFF;LEDGREEN_OFF;LEDRED_OFF;
}
u8 KeyScan()
{
	u8 key;
	
	if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1) && (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)) key = 3;	
	else if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0) && (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)) key = 2;
	else if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1) && (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==0)) key = 1;
	else key = 0;
	return key;
}
int main(void)
{
	strType_XPT2046_Coordinate Coordinate;
	char	cStr[ 10 ];
	
	GPIO_Configration();
// 	USARTx_Config();
	LCD_Init();
	ILI9341_GramScan(2);
	FLASH_SPI_initialize();
	
	LEDRED_ON;
	
	ILI9341_Clear(0,0,320,240,macWHITE);
	
	//调用函数绘制图案,显示字符
// 	ILI9341_OpenWindow(100,100,50,50);
// 	ILI9341_Write_Cmd ( macCMD_SetPixel );
// 	for(i=0;i<120;i++) ILI9341_Write_Data ( macRED );
// 	ILI9341_DispString_EN_CH(0,200,"头条你好",macBLUE,macWHITE);
	ILI9341_DispImage( 0,0,gImage_1 );
	ILI9341_DispString_EN_CH(160,80,"头条你好",macBLUE,macWHITE);
	while(1)
	{
		if ( ucXPT2046_TouchFlag == 1 )			 //如果触摸了屏幕
 {
 if ( XPT2046_Get_TouchedPoint ( & Coordinate, & strXPT2046_TouchPara ) ) //获取触摸点的坐标	
			{
				
				ILI9341_Clear( 0 , 160 , 320 , 32 , macBLACK );
				sprintf ( cStr, "%d", Coordinate.x );
				ILI9341_DispString_EN( 0 , 160 , "x=" , macBLACK , macWHITE);
				ILI9341_DispString_EN( 16 , 160 , cStr , macBLACK , macWHITE);
				sprintf ( cStr, "%d", Coordinate.y );
				ILI9341_DispString_EN( 0 , 176 , "y=" , macBLACK , macWHITE);
				ILI9341_DispString_EN( 16 , 176 , cStr , macBLACK , macWHITE);
			} 
 }
	}
}

热门课程推荐

热门资讯

请绑定手机号

x

同学您好!

您已成功报名0元试学活动,老师会在第一时间与您取得联系,请保持电话畅通!
确定