第30章 触摸屏实验

第三十章 触摸屏实验

1. 导入

在前面章节我们介绍了使用 TFTLCD 模块显示字符和汉字, 利用 TFTLCD 模块, 51 单片机系统就有了高级信息输出的功能, 如果还希望有一个友好的用户输入的设备, 触摸屏就是非常好的选择, 现如今大多电子产品是将触摸屏配合液晶显示器组成人机交互系统, 比如手机、 平板等。

2. 触摸屏介绍

触摸屏又称触控面板, 它是一种把触摸位置转化成坐标数据的输入设备, 根据触摸屏的检测原理, 主要分为电阻式触摸屏和电容式触摸屏。

我们使用的TFT2.6是电阻式触摸屏:

电阻式触摸屏是一种传感器, 它将矩形区域中触摸点(X,Y)的物理位置转换为代表 X 坐标和 Y 坐标的电压。 很多 LCD 模块都采用了电阻式触摸屏, 比如我们 2.0/2.2/2.4/2.6/2.8/3.0/3.2/3.5 寸的 TFTLCD 模块都是采用电阻式触摸屏。 使用时需要用一定的压力才会能检测到电压, 即触摸。

电阻式触摸屏基本上是薄膜加上玻璃的结构, 薄膜和玻璃相邻的一面上均涂有 ITO(纳米铟锡金属氧化物)涂层, ITO 具有很好的导电性和透明性。 当触摸操作时, 薄膜下层的 ITO 会接触到玻璃上层的 ITO, 经由感应器传出相应的电信号, 经过转换电路送到处理器, 通过运算转化为屏幕上的 X、 Y 值, 而完成点选的动作, 并呈现在屏幕上。 电阻式触摸屏结构如下图所示:

屏幕截图 2024 06 15 190024

关于更多触摸屏介绍:电阻触摸屏原理及电容触摸屏原理(附上原图)以及各自优缺点_电容式触摸屏原理及结构图-CSDN博客

电阻式触摸屏的结构及设计要点分析_电阻式触摸屏_触摸屏_中国工控网 (gongkong.com)

3. 硬件设计

本实验使用到硬件资源如下:

  • TFTLCD 液晶模块( 带电阻触摸屏)

TFTLCD 液晶接口在前面章节已经介绍过, 下面来看下 51 单片机与 TFTLCD触摸屏的连接关系, 如下图所示:

屏幕截图 2024 06 15 190609

从电路图中可以看到, SPI_MOSI、 SPI_MISO、 SPI_SCK、 T_CS 和 T_PEN 分别连接在 51 单片机的 P20、 P22、 P21、 P23 和 P24 上。 而 SPI_MOSI、 SPI_MISO、SPI_SCK、 T_CS 和 T_PEN 引脚之前在介绍 TFTLCD 显示实验的时候就给大家介绍, 如果是电阻触摸屏的话, 它是直接连接在 XPT2046 触摸芯片 SPI 接口及笔中断引脚上的。

4. 软件设计

本章所要实现的功能是: 通过 TFTLCD 模块上的触摸板实现触摸功能, 最终实现一个画板的功能。

程序框架如下:

  • 编写触摸屏扫描函数

  • 编写主函数

// 触摸测试
void TOUCH_Test(void)
{
	
	static u16 penColor = BLUE;

	TOUCH_Scan();
	if(xpt_xy.sta)
	{	
		
		if(xpt_xy.lcdx>tftlcd_data.width)
			xpt_xy.lcdx=tftlcd_data.width-1;
		if(xpt_xy.lcdy>tftlcd_data.height)
			xpt_xy.lcdy=tftlcd_data.height-1;
		if((xpt_xy.lcdx>=(tftlcd_data.width-3*12))&&(xpt_xy.lcdy<24))
			Touch_RST=1;
		if(xpt_xy.lcdy > tftlcd_data.height - 20)
		{
			if(xpt_xy.lcdx>100)
            {
                penColor = YELLOW;
            }
            else if(xpt_xy.lcdx>80)
            {
                penColor = CYAN;
            }
            else if(xpt_xy.lcdx>60)
            {
                penColor = GREEN;
            }
            else if(xpt_xy.lcdx>40)
            {
               penColor = MAGENTA;
            }
            else if(xpt_xy.lcdx>20)
            {
                penColor = RED;

            }
            else if(xpt_xy.lcdx>0)
            {
                penColor = BLUE;
            }       
		}
		else
		{
			LCD_Fill(xpt_xy.lcdx-2,xpt_xy.lcdy-2,xpt_xy.lcdx+2,xpt_xy.lcdy+2,penColor);	
		}
							
	}		
}

//GUI测试
void GUI_Test(void)
{
	FRONT_COLOR=BLACK;
	LCD_ShowFontHZ(tftlcd_data.width/2-2*24-12, 0,"普中科技");
	LCD_ShowString(tftlcd_data.width/2-7*12,30,tftlcd_data.width,tftlcd_data.height,24,"www.prechin.cn");
	LCD_ShowString(tftlcd_data.width/2-7*8,55,tftlcd_data.width,tftlcd_data.height,24,"GUI Test");
	
	FRONT_COLOR=RED;
	gui_draw_bigpoint(10,55,GREEN);
	gui_draw_bline(10,80,120,80,10,GREEN);
	gui_draw_rectangle(10,95,30,30,GREEN);
	gui_draw_arcrectangle(50,95,30,30,5,1,BLUE,GREEN);
	gui_fill_rectangle(90,95,30,30,GREEN);
	//gui_fill_circle(90,120,20,GREEN);
	gui_fill_ellipse(30,150,20,10,GREEN);

	//更多的GUI等待大家来发掘和编写
	
	delay_ms(2000);
	LCD_Clear(BACK_COLOR);		
}

void main()
{
	
	u16 color=0;

	UART_Init();
	TFTLCD_Init();

Start:
	//GUI_Test();
		
	FRONT_COLOR = BLACK;
	LCD_ShowFontHZ(tftlcd_data.width/2-2*24-12, 0,"普中科技"); // 显示标题
	LCD_ShowString(tftlcd_data.width/2-7*12,30,tftlcd_data.width,tftlcd_data.height,24,"www.prechin.cn"); // 显示地址
	FRONT_COLOR = RED;
	LCD_ShowString(tftlcd_data.width-3*12,0,tftlcd_data.width,tftlcd_data.height,24,"RST"); // 显示触摸按键提示
	LCD_Fill(0, tftlcd_data.height - 20, 20, tftlcd_data.height, BLUE); // 显示颜色选择提示
    LCD_Fill(20, tftlcd_data.height - 20, 40, tftlcd_data.height, RED); 
    LCD_Fill(40, tftlcd_data.height - 20, 60, tftlcd_data.height, MAGENTA);
    LCD_Fill(60, tftlcd_data.height - 20, 80, tftlcd_data.height, GREEN);
    LCD_Fill(80, tftlcd_data.height - 20, 100, tftlcd_data.height, CYAN);
    LCD_Fill(100, tftlcd_data.height - 20, 120, tftlcd_data.height, YELLOW);
	
	while(1)
	{
		if(Touch_RST) 
		{
			Touch_RST = 0;
			LCD_Clear(BACK_COLOR);
			goto Start;
		}
		
		TOUCH_Test();
			
	}					
}

5. 小结

依旧不需要理解代码,只要了解就行和使用主函数,代码解析可以看注释和网上其他资料


2024.7.26 第一次修订

2024.8.25 第二次修订,后期不再维护

posted @ 2024-08-25 09:44  hazy1k  阅读(18)  评论(0编辑  收藏  举报