STM32物联网项目—触摸按键(4个)

该系统使用触摸芯片TTP224实现四个触摸按键,分别控制四个LED灯的开关。通过CubeMX配置单片机初始化,设置外部中断下降沿触发,当按键被按下时,触发中断回调函数,区分单击和长按。在中断回调函数中,检测到按键状态变化并调用相应检测函数,执行不同的LED控制操作。
摘要由CSDN通过智能技术生成

1.程序功能

        1)触摸按键1单击与长按,控制LED1; 

        2)触摸按键2单击与长按,控制LED2;

        3)触摸按键3单击与长按,控制LED3;

        4)触摸按键4单击与长按,控制LED4;

2.硬件电路图
        KEY1,KEY2,KEY3,KEY4是4个按键,C15、C16、C20、C21电容起到调节触摸灵敏度和滤波的作用。TP0,TP1,TP2,TP3是输入口,TPQ0,TPQ1,TPQ2,TPQ3是输出口,分别连接到单片机的PE0,PE1,PE2,PE3口。初始化:AHLB=1,LPMB=1,SM=0,MOT0=0。

3.触摸芯片TTP224

 本项目按键触发模式为直接模式,开漏输出,低电平有效;

SM=0:单键模式;

LPMB=1:快速模式;

4.CubeMX 初始化配置

 触发模式选择外部中断下降沿触发。

 NVIC里配置中断,优先级可随意。

5.代码部分

 1)外部中断回调函数(CallBack.c)

/**
  * @brief  EXTI line detection callbacks.
  * @param  GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	switch(GPIO_Pin)
	{
		case KEY1_Pin: KEY1.KEY_Flag = TRUE;	break;
		case KEY2_Pin: KEY2.KEY_Flag = TRUE;	break;
		case KEY3_Pin: KEY3.KEY_Flag = TRUE;	break;
		case KEY4_Pin: KEY4.KEY_Flag = TRUE;	break;
		default:printf("´íÎó - ÍⲿÖжϻص÷º¯ÊýÖУ¬´¥Ãþ°´¼ü¼üÖµ´íÎó£¡\r\n\r\n");
	}
}

 2)按键检测函数(Key.c)

/*
	* @name   KEY1_Detect
	* @brief  ´¥Ãþ°´¼ü1¼ì²â
	* @param  None
	* @retval None      
*/
static void KEY1_Detect() 
{
	uint8_t i = 0;
	
	if(KEY1.KEY_Flag == TRUE)
	{
		KEY1.Click = FALSE;
		KEY1.Press = TRUE;
		//´¥Ãþ°´¼ü³¤°´¼ì²â
		for(i=0;i<200;i++)
		{
			HAL_Delay(10);
			//Èç¹û2sÄÚ£¬°´¼ü״̬³öÏָߵçƽ£¬´Ëʱ°´¼üΪµ¥»÷£¬Ìø³öÑ­»·
			if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_SET)
			{
				KEY1.Click = TRUE;
				KEY1.Press = FALSE;
				break; //Ìø³öforÑ­»·
			}
		}
		
		if(KEY1.Click == TRUE)
		{
			printf("¼ì²âµ½´¥Ãþ°´¼ü1µ¥»÷\r\n");
			
			//°´¼ü1µ¥»÷¶¯×÷
			LED.LED_Flip(LED1);
		}
		
		if(KEY1.Press == TRUE)
		{
			printf("¼ì²âµ½´¥Ãþ°´¼ü1³¤°´\r\n");
			
			//°´¼ü1³¤°´¶¯×÷
			LED.LED_Flip(LED1);
			HAL_Delay(200);
			LED.LED_Flip(LED1);
		}
		
		//Çå³ý°´¼ü״̬
		KEY1.KEY_Flag = FALSE;
		KEY1.Click = FALSE;
		KEY1.Press = FALSE;
	}
}

/*
	* @name   KEY2_Detect
	* @brief  ´¥Ãþ°´¼ü1¼ì²â
	* @param  None
	* @retval None      
*/
static void KEY2_Detect() 
{
	uint8_t i = 0;
	
	if(KEY2.KEY_Flag == TRUE)
	{
		KEY2.Click = FALSE;
		KEY2.Press = TRUE;
		//´¥Ãþ°´¼ü³¤°´¼ì²â
		for(i=0;i<200;i++)
		{
			HAL_Delay(10);
			//Èç¹û2sÄÚ£¬°´¼ü״̬³öÏָߵçƽ£¬´Ëʱ°´¼üΪµ¥»÷£¬Ìø³öÑ­»·
			if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_SET)
			{
				KEY2.Click = TRUE;
				KEY2.Press = FALSE;
				break; //Ìø³öforÑ­»·
			}
		}
		
		if(KEY2.Click == TRUE)
		{
			printf("¼ì²âµ½´¥Ãþ°´¼ü2µ¥»÷\r\n");
			
			//°´¼ü2µ¥»÷¶¯×÷
			LED.LED_Flip(LED2);
		}
		
		if(KEY2.Press == TRUE)
		{
			printf("¼ì²âµ½´¥Ãþ°´¼ü2³¤°´\r\n");
			
			//°´¼ü2³¤°´¶¯×÷
			LED.LED_Flip(LED2);
			HAL_Delay(200);
			LED.LED_Flip(LED2);
		}
		
		//Çå³ý°´¼ü״̬
		KEY2.KEY_Flag = FALSE;
		KEY2.Click = FALSE;
		KEY2.Press = FALSE;
	}
}

/*
	* @name   KEY3_Detect
	* @brief  ´¥Ãþ°´¼ü1¼ì²â
	* @param  None
	* @retval None      
*/
static void KEY3_Detect() 
{
	uint8_t i = 0;
	
	if(KEY3.KEY_Flag == TRUE)
	{
		KEY3.Click = FALSE;
		KEY3.Press = TRUE;
		//´¥Ãþ°´¼ü³¤°´¼ì²â
		for(i=0;i<200;i++)
		{
			HAL_Delay(10);
			//Èç¹û2sÄÚ£¬°´¼ü״̬³öÏָߵçƽ£¬´Ëʱ°´¼üΪµ¥»÷£¬Ìø³öÑ­»·
			if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == GPIO_PIN_SET)
			{
				KEY3.Click = TRUE;
				KEY3.Press = FALSE;
				break; //Ìø³öforÑ­»·
			}
		}
		
		if(KEY3.Click == TRUE)
		{
			printf("¼ì²âµ½´¥Ãþ°´¼ü3µ¥»÷\r\n");
			
			//°´¼ü3µ¥»÷¶¯×÷
			LED.LED_Flip(LED3);
		}
		
		if(KEY3.Press == TRUE)
		{
			printf("¼ì²âµ½´¥Ãþ°´¼ü3³¤°´\r\n");
			
			//°´¼ü3³¤°´¶¯×÷
			LED.LED_Flip(LED3);
			HAL_Delay(200);
			LED.LED_Flip(LED3);
		}
		
		//Çå³ý°´¼ü״̬
		KEY3.KEY_Flag = FALSE;
		KEY3.Click = FALSE;
		KEY3.Press = FALSE;
	}
}

/*
	* @name   KEY4_Detect
	* @brief  ´¥Ãþ°´¼ü1¼ì²â
	* @param  None
	* @retval None      
*/
static void KEY4_Detect() 
{
	uint8_t i = 0;
	
	if(KEY4.KEY_Flag == TRUE)
	{
		KEY4.Click = FALSE;
		KEY4.Press = TRUE;
		//´¥Ãþ°´¼ü³¤°´¼ì²â
		for(i=0;i<200;i++)
		{
			HAL_Delay(10);
			//Èç¹û2sÄÚ£¬°´¼ü״̬³öÏָߵçƽ£¬´Ëʱ°´¼üΪµ¥»÷£¬Ìø³öÑ­»·
			if(HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin) == GPIO_PIN_SET)
			{
				KEY4.Click = TRUE;
				KEY4.Press = FALSE;
				break; //Ìø³öforÑ­»·
			}
		}
		
		if(KEY4.Click == TRUE)
		{
			printf("¼ì²âµ½´¥Ãþ°´¼ü4µ¥»÷\r\n");
			
			//°´¼ü4µ¥»÷¶¯×÷
			Relay.Relay_Flip();
		}
		
		if(KEY4.Press == TRUE)
		{
			printf("¼ì²âµ½´¥Ãþ°´¼ü4³¤°´\r\n");
			
			//°´¼ü4³¤°´¶¯×÷
			Relay.Relay_Flip();
			HAL_Delay(200);
			Relay.Relay_Flip();
		}
		
		//Çå³ý°´¼ü״̬
		KEY4.KEY_Flag = FALSE;
		KEY4.Click = FALSE;
		KEY4.Press = FALSE;
	}
}

3)MyInit.c

4)System.c

/*
	* @name   Run
	* @brief  ϵͳÔËÐÐ
	* @param  None
	* @retval None      
*/
static void Run()
{
	KEY1.KEY_Detect();
	KEY2.KEY_Detect();
	KEY3.KEY_Detect();
	KEY4.KEY_Detect();
}

将MyInit.Peripheral_Set()和System.Run()放入main函数里

 6.实验现象

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西红柿鸡蛋超级美味

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

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

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

打赏作者

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

抵扣说明:

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

余额充值