zl程序教程

您现在的位置是:首页 >  其他

当前栏目

蓝桥杯嵌入式——KEY模块(长按)

2023-04-18 15:03:24 时间

其实这是上一篇的升级版,此处只呈现和上文中的差异之处

编程

.h文件中的结构体新增了两个变量

 

 1 #ifndef _interrupt_H_
 2 #define _interrupt_H_
 3 
 4 #include "main.h"
 5 #include "stdbool.h"
 6 
 7 struct keys
 8 {
 9     bool key_now;
10     uint8_t key_flag;
11     bool key_single;
12     uint8_t key_time;
13     bool key_long;
14 };
15 
16 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
17 
18 #endif

.c文件中原本逻辑是按下算key_single = 1,但是现在是按下再放开时通过比较时间来判断试key_single=1还是key_long等于1

 1 #include "interrupt.h"
 2 
 3 struct keys key[4]={0,0,0,0,0};
 4 
 5 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 6 {
 7     if(htim->Instance==TIM3)
 8     {
 9         key[0].key_now = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
10         key[1].key_now = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
11         key[2].key_now = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
12         key[3].key_now = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
13         
14         for(uint8_t i=0;i<4;i++)
15         {
16             switch(key[i].key_flag)
17             {
18                 case 0:
19                 {
20                     if(key[i].key_now==0)
21                     {
22                         key[i].key_flag = 1;
23                         key[i].key_time = 0;
24                     }
25                 }
26                 break;
27                 case 1:
28                 {
29                     if(key[i].key_now==0)
30                     {
31                         key[i].key_flag = 2;
32                     }
33                     else
34                     {
35                         key[i].key_flag = 0;
36                     }
37                 }
38                 break;
39                 case 2:
40                 {
41                     if(key[i].key_now==1)
42                     {
43                         key[i].key_flag = 0;
44                         if(key[i].key_time < 70)
45                         {
46                             key[i].key_single = 1;
47                         }
48                     }
49                     else
50                     {
51                         key[i].key_time++;
52                         if(key[i].key_time >= 70)
53                         {
54                             key[i].key_long = 1;
55                         }
56                     }
57                     
58                 }
59                 break;
60             }
61         }
62     }
63 }

应用

还是那个函数的编写

 1 void led_prc(void)
 2 {
 3     if(key[0].key_single==1)
 4     {
 5         if(led_sta)
 6         {
 7             LED_Disp(0x01);
 8         }
 9         else
10         {
11             LED_Disp(0x02);
12         }
13         led_sta = !led_sta;
14         key[0].key_single = 0;
15     }
16     if(key[0].key_long==1)
17     {
18         LED_Disp(0x04);
19         key[0].key_long = 0;
20     }
21 }