STM32学习记录——触摸屏虚拟按键

视频演示:(有点粗糙,很多没细节没去弄了)

电子锁触摸屏

直接使用正点原子实验26触摸屏实验进行添加:

这里借用了博客基于STM32的TFT触摸屏虚拟按键_鱼鱼不秃头的博客-CSDN博客_stm32触摸屏设置按键的代码

①设置显示界面

只需根据你所用lcd的大小来改变参数即可;

void Load_keyboard(u16 x,u16 y,u8 **key_content)
{
	u16 i;
	POINT_COLOR=RED; //
	keycontent=key_content;
	LCD_Fill(x,y,x+240,y+150,WHITE);
	LCD_DrawRectangle(x,y,x+240,y+150);						   
	LCD_DrawRectangle(x+80,y,x+160,y+150);	 
	LCD_DrawRectangle(x,y+30,x+240,y+60);
	LCD_DrawRectangle(x,y+90,x+240,y+120);
	LCD_DrawRectangle(x,y-46,x+240,y+150);
	LCD_ShowString(x+5, y-30, 200, 16, 16,"secret = ");	
	POINT_COLOR=BLUE;
	for(i=0;i<15;i++)
	{
		//if(i==1) //":"不需要中间显示
			LCD_ShowString(x+(i%3)*80+2,y+7+30*(i/3),40,16,16,(u8*)keycontent[i]);	
		//else
			//Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)keycontent[i],16,80);
	} 

}

②设置按键显示存储函数

// x, y 为显示的初始坐标, keyx, keyy 为触摸坐标
void Press_down_Fill(u16 x, u16 y, int keyx, int keyy)
{
	int i, j, status, ii1, ii2, jj1, jj2;
	int ret=0, mean, del=0, enter=0, a, b;
	
	i = keyx / 80;
	j = (keyy - 150) / 30;
	ii1 = x+80*i;
	jj1 = y+30*j;
	ii2 = x+80*(i+1);
	jj2 = y+30*(j+1);
	status = j*3 + i + 1;
	
	if (keyy>150&&keyy<300)
	{
		if(tp_dev.sta&TP_PRES_DOWN)
		{
			LCD_Fill(ii1+2, jj1+2, ii2-2, jj2-2, GREEN);		
			POINT_COLOR=BLUE;
			LCD_ShowString(ii1+2, jj1+7, 40, 16, 16, (u8*)keycontent[status-1]);
			delay_ms(500);
			LCD_Fill(ii1+2, jj1+2, ii2-2, jj2-2, WHITE);	
			POINT_COLOR=BLUE;
			LCD_ShowString(ii1+2, jj1+7, 40, 16, 16, (u8*)keycontent[status-1]);
			tp_dev.x[0] = 65536;
			tp_dev.y[0] = 65536;
			
		}
		/*else
		{
			LCD_Fill(ii1+2, jj1+2, ii2-2, jj2-2, WHITE);	
			POINT_COLOR=BLUE;
			LCD_ShowString(ii1+2, jj1+7, 40, 16, 16, (u8*)keycontent[status-1]);
			tp_dev.x[0] = 65536;
			tp_dev.y[0] = 65536;
		}*/
	
	
	switch(status-1){
		case 0: ret = 1; break;
		case 3: mean = 1; break;
		case 4: mean = 2; break;
		case 5: mean = 3; break;
		case 6: mean = 4; break;
		case 7: mean = 5; break;
		case 8: mean = 6; break;
		case 9: mean = 7; break;
		case 10: mean = 8; break;
		case 11: mean = 9; break;
		case 12: del = 1; break;
		case 13: mean = 0; break;
		case 14: enter = 1; break;
	}
	
	if (ret == 1)
	{
		for(a=0;a<=num;a++)
			input[a] = 0;
		num = 0;
		LCD_Fill(70, 110, 180, 140, WHITE);
		ret = 0;
	}
	else if (del == 1)
	{
		num = num-1;
		input[num] = ' ';		
		//LCD_ShowNum(80+num*10, 120, 0, 1, 16);
		LCD_Fill(80+num*10, 110, 180, 140, WHITE);
		del = 0;
	}
 	else if (enter == 1)
	{
		for(a=0;a<num;a++)
		{
			if (secret[a] == input[a])
			{
				bingo = 1;
				LCD_ShowString(100, 90, 200, 16, 16,"secret yes");	
			}
			
			else 
			{
				bingo = 0;
				LCD_ShowString(100, 90, 200, 16, 16,"secret no");	
			}
		}
		num = 0;
		enter = 0;
	}else
	{
		LCD_ShowNum(60, 90, num, 1, 16);
		LCD_ShowNum(70, 90, num, 1, 16);
		input[num] = mean;
		switch(num){
		case 0: LCD_ShowNum(60+20, 120, input[num], 1, 16); break;
		case 1: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
		LCD_ShowNum(70+20, 120, input[num], 1, 16);} break;
		case 2: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
		LCD_ShowNum(70+20, 120, input[1], 1, 16);
		LCD_ShowNum(80+20, 120, input[num], 1, 16);} break;
		case 3: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
		LCD_ShowNum(70+20, 120, input[1], 1, 16);
		LCD_ShowNum(80+20, 120, input[2], 1, 16);
		LCD_ShowNum(90+20, 120, input[num], 1, 16);} break;
		case 4: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
		LCD_ShowNum(70+20, 120, input[1], 1, 16);
		LCD_ShowNum(80+20, 120, input[2], 1, 16);
		LCD_ShowNum(90+20, 120, input[3], 1, 16);
		LCD_ShowNum(100+20, 120, input[num], 1, 16);} break;
		case 5: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
		LCD_ShowNum(70+20, 120, input[1], 1, 16);
		LCD_ShowNum(80+20, 120, input[2], 1, 16);
		LCD_ShowNum(90+20, 120, input[3], 1, 16);
		LCD_ShowNum(100+20, 120, input[4], 1, 16);
		LCD_ShowNum(110+20, 120, input[num], 1, 16);} break;
		case 6: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
		LCD_ShowNum(70+20, 120, input[1], 1, 16);
		LCD_ShowNum(80+20, 120, input[2], 1, 16);
		LCD_ShowNum(90+20, 120, input[3], 1, 16);
		LCD_ShowNum(100+20, 120, input[4], 1, 16);
		LCD_ShowNum(110+20, 120, input[5], 1, 16);
		LCD_ShowNum(120+20, 120, input[num], 1, 16);} break;
		case 7: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
		LCD_ShowNum(70+20, 120, input[1], 1, 16);
		LCD_ShowNum(80+20, 120, input[2], 1, 16);
		LCD_ShowNum(90+20, 120, input[3], 1, 16);
		LCD_ShowNum(100+20, 120, input[4], 1, 16);
		LCD_ShowNum(110+20, 120, input[5], 1, 16);
		LCD_ShowNum(120+20, 120, input[6], 1, 16);
		LCD_ShowNum(130+20, 120, input[num], 1, 16);} break;
		case 8: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
		LCD_ShowNum(70+20, 120, input[1], 1, 16);
		LCD_ShowNum(80+20, 120, input[2], 1, 16);
		LCD_ShowNum(90+20, 120, input[3], 1, 16);
		LCD_ShowNum(100+20, 120, input[4], 1, 16);
		LCD_ShowNum(110+20, 120, input[5], 1, 16);
		LCD_ShowNum(120+20, 120, input[6], 1, 16);
		LCD_ShowNum(130+20, 120, input[7], 1, 16);
		LCD_ShowNum(140+20, 120, input[num], 1, 16);} break;
		case 9: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
		LCD_ShowNum(70+20, 120, input[1], 1, 16);
		LCD_ShowNum(80+20, 120, input[2], 1, 16);
		LCD_ShowNum(90+20, 120, input[3], 1, 16);
		LCD_ShowNum(100+20, 120, input[4], 1, 16);
		LCD_ShowNum(110+20, 120, input[5], 1, 16);
		LCD_ShowNum(120+20, 120, input[6], 1, 16);
		LCD_ShowNum(130+20, 120, input[7], 1, 16);
		LCD_ShowNum(140+20, 120, input[8], 1, 16);
		LCD_ShowNum(150+20, 120, input[num], 1, 16);} break;
		
	}
		num++;
		delay_ms(2000);
		if (num==10)
			num = 0;
			
	}}
}

其中 tp_dev.x[x]、tp_dev.y[y] 为触摸坐标,点击数字按钮可以输入十位以内的密码,若与设置的密码相同则密码正确,显示“secret yes”,否则“secret no”,要注意TFT时电阻屏,博主一开始在测试的时候,将许多显示代码写到了电容屏测试函数中,导致没有任何测试效果,还卡了一会。在显示密码的时候直接用了笨办法,就是输入的几位数字就显示几位。

  • 3
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 基于STM32的TFT触摸屏虚拟按键是一种通过触摸屏实现人机交互的技术。它的实现原理是通过在TFT显示屏上绘制虚拟按键,并使用STM32微控制器来处理触摸事件。通过触摸屏上的虚拟按键,用户可以模拟真实按键的操作,实现与系统的交互。 在实现这一技术时,首先需要选取合适的TFT显示屏,并连接到STM32微控制器。其次,使用STM32的外设库函数,通过代码绘制虚拟按键的外观,包括按键的形状、颜色和文字等。此外,还需将每个按键与相应的功能逻辑进行关联,以达到按下虚拟按键时执行相应操作的目的。 在用户与触摸屏进行交互时,STM32会实时检测触摸事件,并使用触摸屏的驱动库函数获取触摸点的位置。然后,STM32会根据触摸点的位置和虚拟按键的位置信息判断用户是否触摸到虚拟按键,并执行相应的操作。例如,可以根据按下的按键来控制系统的音量、切换页面等。 通过使用基于STM32的TFT触摸屏虚拟按键,可以大大提高产品的人机交互体验。与传统机械按键相比,虚拟按键可以更灵活地设置和定制,且无需额外的硬件,减少了产品成本和体积。此外,虚拟按键还可以根据不同的场景或需求进行修改和更新,提供更丰富的功能和交互方式。 总的来说,基于STM32的TFT触摸屏虚拟按键技术是一种高效、灵活且便捷的人机交互方式,可以广泛应用于各种电子设备和嵌入式系统中。 ### 回答2: 基于STM32的TFT触摸屏虚拟按键是一种通过触摸屏来模拟物理按键功能的技术。该技术利用STM32微控制器与TFT触摸屏的硬件接口,实现对触摸屏的触摸输入进行处理和识别,从而模拟按键操作。 在实现该功能时,我们首先需要连接STM32与TFT触摸屏的硬件接口,确保它们之间正常通信。然后,通过编程控制,将触摸屏的输入信号转化为相应的按键操作。具体的实现步骤如下: 1. 初始化触摸屏STM32的硬件接口,包括引脚配置、中断设置等。 2. 在程序中创建虚拟按键的图形界面,可以使用图形库或者自定义绘图函数进行创建。 3. 在主循环中,不断读取触摸屏的输入信号。如果检测到触摸屏被按下,即触摸坐标有效,我们可以根据触摸坐标判断用户点击到了哪个虚拟按键。 4. 对于每个虚拟按键,我们可以定义相应的按键事件处理函数。例如,当用户点击到某个按键时,可以触发相应的代码逻辑或者执行特定的功能。 5. 同时,为了避免误触或长按等问题,我们可以通过设置按压时间、滑动距离等参数,来判断用户的操作是单击、双击、长按还是滑动等不同的手势。 通过上述步骤,我们可以实现基于STM32的TFT触摸屏虚拟按键功能。这种技术可以广泛应用于各种电子产品中,如智能家居、工业控制、医疗设备等领域,为用户提供更加便捷的操作体验。 ### 回答3: 基于STM32的TFT触摸屏虚拟按键是一种通过触摸屏来模拟物理按键的技术。它利用STM32微控制器的强大功能和TFT触摸屏的精准触控能力,实现了在屏幕上显示虚拟按键,并通过触摸屏来模拟按下按键的操作。 在实现这一技术时,首先需要借助STM32进行屏幕显示的控制。STM32可以通过TFT接口来控制TFT显示屏,将屏幕上的各种元素(包括虚拟按键)显示出来。 其次,需要利用STM32的触摸功能来实现按键的触摸检测。通过对触摸屏的坐标进行采样和分析,可以判断用户是否触摸到了虚拟按键的位置。一旦触摸检测到按键的触摸信号,就可以执行相应的按键操作,比如发送一个脉冲信号、改变某个状态等等。 为了提高用户体验,可以在虚拟按键的设计中考虑一些小技巧。比如,可以对按键进行设计,使其在被按下时有一定的反馈效果,比如改变颜色、显示按下动画等等。这样可以增强用户对按键操作的感知,提高整体的交互体验。 基于STM32的TFT触摸屏虚拟按键可以广泛应用于各种嵌入式系统中,特别是那些无需物理按键操作的场景。比如,可以用于家电控制面板、智能家居系统、工业控制设备等等。它可以减少物理按键的使用,提高系统的可靠性和稳定性,并且可以根据具体需求随时更换按键的布局和功能。这样的技术大大拓展了嵌入式系统的交互方式,提升了用户体验。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清园暖歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值