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.实验现象